[CodeSnippet] Delphi -> CBuilder



  • ich meinte damit bitweise invertieren

    x = x^0xFFFFFF
    

    edit: da war doch noch ein eintrag da??



  • Bitweise invertieren kann man mit '~' ... nur so btw. (o;

    EDIT: und ist dann erst noch Wortbreitenunabhängig (o;



  • man lernt nie aus 😃 thx



  • @YLIREBUS
    Ich habe die ComboBox nicht und bei mir eine feste Zahl stehen. Das resultierte also aus zu schnellem Copy&Paste und muss natürlich -> heissen. Danke für den Hinweis.

    Also meint ihr so? (Diesmal Zahl gesetzt, 50% Durchsichtig würde das ergeben)
    Button->Color = (Button->Color & ~(0xFF000000)) | (abs(((10 - 5)) / 10 * 0xFF) << 24);

    Bewirkt aber das gleiche wie die anderen zwei. Es wird komplett durchsichtig 😞



  • edit:
    nochmals überlegt...
    klapt eh nicht..



  • Wohl eher so:
    Button->Color = (Button->Color & ~0xFF000000) | (Round(((10 - FillAlpha->ItemIndex)) / 10 * 0xFF) << 24);

    in Etwa so. Zu Interpretieren wäre das also wiefolgt:

    (Button->Color & ~0xFF000000)
    Byte nummer 3 wird gelöscht, bzw. auf 0 gesetzt. Einfachste Digitaltechnik. (Hier scheinen die Alphainformationen gegeben. Keine Ahnung. Hab grad keine BCB Hilfe da.

    (Round(((10 - FillAlpha->ItemIndex)) / 10 * 0xFF) << 24);
    Hier wird zunächst das neue Alpha berechnet. Keine Ahnung wieso die Formel so ist. Auf Jedenfall wird anschliessend durch das links shiften das Ergebnis der Rechnung wieder auf das 3. Byte verschoben.

    Die Anschliessende Veroderung der beiden Operationen hat zur Folge, das das Ergebnis der zweiten Operation in das 3. Byte von Button->Color geschrieben wird.



  • Wau eine spitzen Antwort, wo gleich mal erklärt wird was dort passiert.
    Das Round() gibt es aber nicht in CBuilder und habe ich durch abs() ersetzt.
    Hoffe das so richtig...

    Auf jedenfall kann man das jetzt nachvollziehen was passieren soll, nur das es nicht passiert. 🤡 Die Fläche die 50% Transparent werden soll, ist immer komplett durchsichtig.



  • Katsumi schrieb:

    Das Round() gibt es aber nicht in CBuilder und habe ich durch abs() ersetzt.

    Wobei ABS ja wohl kaum das Selbe macht wie Round (was suggeriert, das gerundet werden soll)



  • Welche Alternativen gibt es denn sonst? Zumal das in diesem Fall reichen sollte.

    Color vor Transparents
    Wert: 4294901760
    Danach: 16777215



  • versuch doch mal
    ((int)((10 - FillAlpha->ItemIndex) / 10 * 0xFF) << 24);

    oder

    (RoundTo(((10 - FillAlpha->ItemIndex) / 10 * 0xFF) << 24, 0));



  • Die Lösung ist Grundkurs C 😉

    Button->Color = (Button->Color & ~0xFF000000) | (abs(((float)(10 - FillAlpha->ItemIndex)) / 10 * 0xFF) << 24);

    Denn ((10 - 5)) / 10) werden immer 0 ergeben, da er mit int arbeitet 🙂
    Danke für Eure gute Hilfe!


Anmelden zum Antworten