Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Was passiert denn da? (https://www.delphipraxis.net/189953-passiert-denn-da.html)

delphia 12. Aug 2016 11:10

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:
Memo.Flags := (Memo.Flags and not flWordWrap) or Word(Boolean(ckbWordWrap.Checked)) * flWordWrap;
Wobei die einzelnen Teile so definiert sind:
Code:
Flags: Word;

// object flags
  flStretched = 1;
  flWordWrap = 2;
  flWordBreak = 4;
  flAutoSize = 8;
  flTextOnly = $10;
  ...
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?

Danke für die Aufmerksamkeit.

p80286 12. Aug 2016 11:25

AW: Was passiert denn da?
 
Code:
Memo.Flags := (Memo.Flags and not flWordWrap) or Word(Boolean(ckbWordWrap.Checked)) * flWordWrap;
das ist so ein Konstrukt für das man C so mag.
Code:
(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}
also setzt diese Zeile das zweite Bit abhängig davon ob ckbWord.Checked true ist.
und alle anderen Bits sind auch gesetzt.
(Mann hoffentlich hab ich mich nicht verlaufen)

Gruß
K-H

Neutral General 12. Aug 2016 12:05

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

Der schöne Günther 12. Aug 2016 12:07

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"?

Neutral General 12. Aug 2016 12:09

AW: Was passiert denn da?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1344770)
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"?

Word(Boolean(ckbWordWrap.Checked)) ergibt entweder 0 oder 1. Also Entweder 0xflWordWrap oder 1xflWordWrap. Was am Ende bedeutet:
Bei true werden die Flags mit flWordWrap verodert, bei false nicht (bzw. sie werden mit 0 verodert, was keine Auswirkung hat)

Sherlock 12. Aug 2016 12:12

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

Neutral General 12. Aug 2016 12:15

AW: Was passiert denn da?
 
(Hat sich erledigt, weil sich Sherlocks Beitrag erledigt hat) :mrgreen:

p80286 12. Aug 2016 12:34

AW: Was passiert denn da?
 
Zitat:

Zitat von Neutral General (Beitrag 1344768)
Alle anderen Bits sind nicht auch gesetzt, sondern bleiben so wie sie vorher waren.
Code:
    xxxxxxxx     (Memo.Flags)
and 11111101     (not flWordWrap)
================
    xxxxxx0x

:oops: verlesen das or war ein and :oops:

Gruß
K-H

t.roller 12. Aug 2016 13:03

AW: Was passiert denn da?
 
Was soll denn DIESER Titel ?

Neutral General 12. Aug 2016 13:08

AW: Was passiert denn da?
 
Ich gebe dir Recht dass der Titel keinen Preis verdient, aber Clickbait? :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:23 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz