[CodeSnippet] Delphi -> CBuilder



  • Hallöle.

    Kann mir einer sagen wie das in CBuilder Code aussehen müsste?

    Button->Color := Button->Color and not $FF000000 or (Round(((10 - FillAlpha.ItemIndex)) / 10 * $FF) shl 24);

    Ich peile dieses "and not" und "or" mitten drin nicht, auch wenn ich natürlich richtig annehme was es heissen soll.
    Also das hier ist es nicht

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

    Dies ist es auch nicht
    Button->Color = (Button->Color & ~(0xFF000000)) || (abs(((10 - FillAlpha.ItemIndex)) / 10 * 0xFF) << 24);

    kennt wer die Lösung?
    Und weiss wer wie ich Double in Integer in Pascal(Delphi) caste?

    🙄



  • Probier doch mal aus, ob das überhaupt geht:

    FillAlpha.ItemIndex

    oder muß es so sein:
    FillAlpha->ItemIndex ?

    Ich würde das Problem erst einmal in Teilprobleme zerlegen.
    🙄



  • ich habe zwar keine ahnung von Pascal, aber "and not" würde ich nicht als "!=" intepretieren.
    das "and" würde ich jetzt mal aus gefühl als "&" (Bitweise AND) und das Not einfach als Invertieren (vielleicht Bitweise.. währe mit "^" = Bitweise-Exor zu lösen, habe aber keine ahnung ob die intepretation stimmt) intepretieren.
    und das "or" würde ich nicht in "||" = logisch OR sondern eher in "|" Bitweise OR (denn logisch or währe meines erachtens am falschen ort) intepretieren

    vielleicht habe ich dir etwas geholfen..

    BigNeal



  • 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!


Log in to reply