![]() |
Welche CheckBox-Komponente?!?
Hallöchen,
kennt vielleicht jemand eine CB-Kompo, die ein Ereigniss für "un"checken hat? Die normale hat ja sowas nicht oder ich bin einfach nur Blind, wobei ich ungern mit Fremdkomponenten arbeite. Grüsse, Daniel :hi: |
Moin Daniel B,
wie wär's denn mit OnClick? |
Hallo Christian,
?? wird das auch beim unchecken ausgeführt? Hmm, dann müsste ich ja in der OnCheck noch extra prüfen oder sie jetzt Ein oder Ausgeschaltet wird. Grüsse, Daniel :hi: |
Tatsächlich, hmm kommt davon wenn man nie damit arbeitet... :roll:
So geht es immerhin.
Delphi-Quellcode:
Wobei es schöner wäre, wenn die IFs nicht bräuchte, aber na gut.
procedure TAboutBox.CheckBox1Click(Sender: TObject);
begin if CheckBox1.Checked = True then begin ShowMessage('Ein'); end else if CheckBox1.Checked = False then begin ShowMessage('Aus'); end; end; Trotzdem Danke, hat mir sehr geholfen. Grüsse, Daniel :hi: |
Es ist sauberer, wie folgt zu schreiben, da man Booleanwerte generell nicht mit True/False vergleichen sollte:
Delphi-Quellcode:
...:cat:...
procedure TAboutBox.CheckBox1Click(Sender: TObject);
begin if CheckBox1.Checked then begin ShowMessage('Ein'); end else if not CheckBox1.Checked then begin ShowMessage('Aus'); end; end; |
Zitat:
|
Die Definition von Boolean erlaubt theoretisch nur zwei Werte: True und False.
Der Vergleich mit False klappt immer, da False als Null (0) definiert ist. Ein Vergleich mit True kann fehlschlage. Die Konstante True ist als -1 ($FFFFFF) definiert. In der Logik ist True jedoch als (not False) definiert und kann jeden Wert ungleich Null (0) annehmen. Da Boolean seit der 32bit Variante von Delphi, intern eine 32bit Variable ist, kann es also theoretisch 2^32-1 verschieden True Werte geben - die Konstante True ist jedoch definiert als (-1). Daraus ergeben sich 2^32-2 mögliche True-Werte die im Vergleich mit der Konstante True verloren gehen. Bestes Beispiel ist :kotz: VB - die Checkbox dort, kann im Wert Checked weder True noch False sein, wenn man diese genauso vergleicht - und deren State cbGrayed ist. Gleiches kann theoretisch (selten praktisch) auch in Delphi geschehen. ...:cat:... |
Das würde also heißen, dass eine boolsche Variable, die auf TRUE steht, ein 32bit-Integer ist mit dem Dezimalwert 1. Wenn man die Variable auf TRUE setzt, wird sie 1, bei FALSE 0.
Wenn man jetzt aber irgendwie einen Integer mit dem Wert 15 als einen Boolean-Wert behandelt, ist dieser weder TRUE noch FALSE. Ist das so richtig? Ich dachte immer, TRUE wäre keine Konstante in dem Sinne, sondern einfach der Bereich kleiner 0 und größer 0. |
:!: minus 1 (-1), nicht 1 (alle Bits sind an).
In Pascal und den meisten Programmiersprachen ist das logische True als ungleich Null (0) definiert. Die Konstante ist, in Pascal/Delphi zumindest als -1 ($FFFFFFFF) definiert. Ausnahme: UNIX Shell Scripting: False ist ungleich Null (0) und True ist als Null (0) definiert. :shock: |
Was ist eigentlich der Unterschied zwischen dem logischen TRUE und der TRUE-Konstante?
|
Zitat:
[edit]Genauer gesagt, true und false sind Executables (liegen normalerweise in /bin/), die einen Exitcode von 0 bzw. 1 zurückgeben.[/edit] MfG, d3g |
Sorry: True ist gleich 1 :oops:
Der Rest bleibt aber weiter wie beschrieben. Hier mal ein Beispiel:
Delphi-Quellcode:
Das sollte alles erklären.
// der Wert der Konstante True
ShowMessage('TRUE: ' + IntToStr(Integer(True))); // der Wert der Konstante True ShowMessage('FALSE: ' + IntToStr(Integer(False))); // ein Vergleich zweier gleicher Konstanten ShowMessage('2=2: ' + IntToStr(Integer(Boolean(2 = 2)))); // ein Vergleich zweier verschiedener Konstanten ShowMessage('1=2: ' + IntToStr(Integer(Boolean(1 = 2)))); // testen einer Konstante ungleich 0 if Boolean(5) then ShowMessage('Boolean(5) GILT ALS True') else ShowMessage('Boolean(5) GILT ALS False'); // testen einer Konstante gleich 0 if Boolean(0) then ShowMessage('Boolean(0) GILT ALS True') else ShowMessage('Boolean(0) GILT ALS False'); // testen ob eine Konstante (5), welche True is, auch gleich True ist if Boolean(5) = True then ShowMessage('Boolean(5) = True IST WAHR') else ShowMessage('Boolean(5) = True IST NICHT WAHR'); // testen ob eine Konstante (5), welche True is, gleich False ist if Boolean(5) = False then ShowMessage('Boolean(5) = False IST WAHR') else ShowMessage('Boolean(5) = False IST NICHT WAHR'); // testen ob eine Konstante (0), welche False is, gleich True ist if Boolean(0) = True then ShowMessage('Boolean(0) = True IST WAHR') else ShowMessage('Boolean(0) = True IST NICHT WAHR'); // testen ob eine Konstante (0), welche False is, auch gleich False ist if Boolean(0) = False then ShowMessage('Boolean(0) = False IST WAHR') else ShowMessage('Boolean(0) = False IST NICHT WAHR'); |
"True" war übrigens auch schon in Pascal gleich "1". Dies zeigt das folgende kleine Programm:
Code:
In den ersten beiden Zeilen wird "False = 0" und "True = 1" ausgegeben. Danach folgen dann ein "False" und 255 "True".
uses Crt;
var x: Boolean; y: Byte absolute x; begin ClrScr; x := False; WriteLn('False = ', y); x := True; WriteLn(' True = ', y); WriteLn; for y := 0 to 255 do Write(x:5); ReadLn; end. |
Hallo!
Meine Delphi-Hilfe sagt: Boolean: False = 0, True = 1 ByteBool, WordBool, Longbool: False = 0, True <> 0 Boolean ist Pascal, 1 Byte. Der Rest (1/2/4 Byte) ist aus Kompatibilität zu anderen Sprachen bzw. der Windows-API vorhanden. Die liefert bei einer bool-Prozedur 0 oder <> 0! Allerdings programmieren die auch mit der Beißzange:
Delphi-Quellcode:
1. ist OK nicht initialisiert und
var OK : Boolean;
... if x <> 0 then OK := True; if OK then ... 2. geht das ganz einfach:
Delphi-Quellcode:
Was soll übrigens
OK := x <> 0;
Zitat:
das if nach dem else ist doch überflüssig! Es reicht doch
Delphi-Quellcode:
Gruß
procedure TAboutBox.CheckBox1Click(Sender: TObject);
begin if CheckBox1.Checked then ShowMessage('Ein') else ShowMessage('Aus'); end; Dietmar Brüggendiek |
Ich gebe zu, das Beispiel war nicht gut, es sollte jedoch folgenden Konstrukten negieren.
Delphi-Quellcode:
Ich selbst programmiere sonst auch in Deiner Manier, das Beispiel ging wohl etwas daneben :D
procedure TAboutBox.CheckBox1Click(Sender: TObject);
begin if CheckBox1.Checked = True then begin ShowMessage('Ein'); end else if CheckBox1.Checked = False then begin ShowMessage('Aus'); end; end; |
Also: nie Booleans miteinander vergleichen, sonder nur:
Delphi-Quellcode:
Aber was ist mit der Menge begin und ends? Machen die auch was schlimmes?
if "boolean" then ...
|
Hallo!
Zitat:
Delphi-Quellcode:
Wenn a eine Variable ist, die nicht von asynchronen Prozessen (OnKeyPressed, OnTimer etc.) verändert wird, bleibt a dasselbe.
if a then
.. else if not a then .. Ändert ein asynchroner Prozess die Variable a, wird u.U. beides NICHT durchlaufen! Ist a eine Funktion, wird sie zweimal ausgeführt! Wenn die fragt, ob man das Programm wirklich beenden will, kommt die Frage bei "Nein" 2 mal! Was den Schreibaufwand betrifft: Informatiker sind so faul, daß sie lieber 2 Tage an einem Programm scheiben, als 2 Minuten zu arbeiten! :mrgreen: Gruß Dietmar Brüggendiek |
Zitat:
Es ist übersichtlicher/schöner; Sobald Du eine zweite Zeile dazu schreibst, fällt man genauso aus die "Nase", wie mit dem fehlenden Semikolon; Auch hier meine Meinung, immer hinschrieben auch wenn nud ein Exit; dazwischen steht; Grüsse, Daniel :hi: |
Problem kann hier besonders auch sein, dass man nicht drauf hingewiesen wird als
Code:
Hat man zb einen Befehl nach einem if, und fügt einen dazu ohne mit begin end; nachzurüsten kann das schon nervraubende Folgen haben.
[Error] Unit1.pas(28): Missing operator or semicolon
Gruß, Sebastian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:47 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