![]() |
Delphi-Version: 5
Was passiert denn da?
Hallo,
ich bin über eine Zeile gestoßen, die ich mir nicht erklären kann. Es geht darum in einem TfrView(Fast-Report) die Funktion WordWrap ein und auszuschalten. Geschaltet wird mit ckbWordWrap.Checked, einer Checkbox. Die Zeile lautet
Code:
Wobei die einzelnen Teile so definiert sind:
Memo.Flags := (Memo.Flags and not flWordWrap) or Word(Boolean(ckbWordWrap.Checked)) * flWordWrap;
Code:
Was mich irritiert ist die Verwendung von logischen Operatoren im Zusammenhang mit ganzen Zahlen. Warum macht man das nicht als Menge wie z.B. bei Font.Styles?
Flags: Word;
// object flags flStretched = 1; flWordWrap = 2; flWordBreak = 4; flAutoSize = 8; flTextOnly = $10; ... Danke für die Aufmerksamkeit. |
AW: Was passiert denn da?
Code:
das ist so ein Konstrukt für das man C so mag.
Memo.Flags := (Memo.Flags and not flWordWrap) or Word(Boolean(ckbWordWrap.Checked)) * flWordWrap;
Code:
also setzt diese Zeile das zweite Bit abhängig davon ob ckbWord.Checked true ist.
(Memo.Flags and not flWordWrap) = Memo.Flags or 111111101 = alle Bits sind gesetzt bis auf das zweite, das ist oder nicht
Word(Boolean(ckbWordWrap.Checked)) * flWordWrap = 0 oder 2 {2=flchecked} und alle anderen Bits sind auch gesetzt. (Mann hoffentlich hab ich mich nicht verlaufen) Gruß K-H |
AW: Was passiert denn da?
Alle anderen Bits sind nicht auch gesetzt, sondern bleiben so wie sie vorher waren.
Code:
xxxxxxxx (Memo.Flags)
and 11111101 (not flWordWrap) ================ xxxxxx0x |
AW: Was passiert denn da?
Mich verwirrt immer noch das " * flWordWrap" also Multiplikation mal 2. Also im Endeffekt Bit-Shiften um eins nach links. Warum schreibt man "multipliziert mit Wordwrap" statt "shl 1"?
|
AW: Was passiert denn da?
Zitat:
Bei true werden die Flags mit flWordWrap verodert, bei false nicht (bzw. sie werden mit 0 verodert, was keine Auswirkung hat) |
AW: Was passiert denn da?
Hab die Klammerung falsch gelesen... Alles klar. Aber es geht hoffentlich auch im Delphi Style und damit besser lesbar.
Sherlock |
AW: Was passiert denn da?
(Hat sich erledigt, weil sich Sherlocks Beitrag erledigt hat) :mrgreen:
|
AW: Was passiert denn da?
Zitat:
Gruß K-H |
AW: Was passiert denn da?
|
AW: Was passiert denn da?
Ich gebe dir Recht dass der Titel keinen Preis verdient, aber Clickbait? :roll:
|
AW: Was passiert denn da?
Wie wäre es mit
"Ey Leute ich schnall nicht was da abgeht." Da der TE die Bedeutung der Operatoren augenscheinlich nicht erfasst hat, ist die angewandte Formulierung durchaus in Ordnung. (Meiner unmaßgeblichen Meinung nach) Gruß K-H |
AW: Was passiert denn da?
Hallo,
vielen Dank für die Erklärung. Der zweite Teil meiner Frage ist noch nicht beantwortet. Gibt es einen sachlichen Grund warum man das so löst und nicht mit einer Menge, oder ist das einfach nur eine Geschmacksfrage? BTW: Der Titel war aus meiner Sicht extrem zielführend. Noch nie habe ich so schnell so viele Antworten erhalten.:thumb: Übrigens: ... wer nicht fragt bleibt dumm! Und wer nichts weiß muss glauben!:roll: Danke für die Aufmerksamkeit. |
AW: Was passiert denn da?
Zitat:
Delphi-Quellcode:
sind vorgegeben. Wenn man daran etwas ändern will, dann so wie vorgegeben, oder aber
Memo.Flags
Delphi-Quellcode:
Die ursprüngliche Version riecht sehr nach übersetztem Assembler oder gar C.
if ckbWordWrap.Checked then Memo.Flags or $02;
oder const WORDWRAPACTIVE=2; ... if ckbWordWrap.Checked then Memo.Flags or WORDWRAPACTIVE; Um eine Menge anzuwenden, müßtest Du die Memo-Klasse umschreiben. Gruß K-H |
AW: Was passiert denn da?
Zitat:
ein "o" käm nicht so gut an. gruss |
AW: Was passiert denn da?
Meine Frage ist noch nicht ganz beantwortet.
Gibt es vom Design her Vorteile, das mit den Flags als Word anzulegen. Normalerweise macht man das in Delphi ja eher mit Mengen (zb Font.Styles) oder Eigenschaften Memo.WordWrap : boolean; Oder ist das nur eine Stil-Frage? Danke für die Aufmerksamkeit. |
AW: Was passiert denn da?
Es gibt keinen Vorteil. Sets tun intern quasi das gleiche. In C gibt es allerdings keine Sets. D.h. wenn das Memo seinen Ursprung in C hat, dann wird halt mit diesen Flags gearbeitet.
|
AW: Was passiert denn da?
Man macht das eigentlich immer so, wenn mehr als ein Flag zur gleichen Zeit gesetzt werden kann. Dann braucht man nur alle gewollten Flags miteinander zu verodern und schon hat man ein hübsches Wort, das man weiterverwenden kann. In diesem Sinne kann es natürlich auch vorkommen, daß man mehr oder weniger als zB 16 Flags zur Verfügung hat, so daß man dann eben auf DWORD oder auch Bytes ausweicht. In jedem Fall ist es dann eine Frage der Anwendung simpler Bitmasken, um abzufragen, was der Aufrufer denn für Flags gesetzt haben wollte. Und Bitmaskierung ist eine recht effiziente Operation und dennoch relativ gut lesbar, wenn man nicht gerade Tricks wie im Eingangspost beschrieben anwendet.
Sherlock |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz