Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Boolean Problem!
Snippy - So 19.01.03 20:40
Titel: Boolean Problem!
HI!
Ich möchte gerne das eine Aktion ausgeführt wird, wenn in bestimmtes Radiobutton gedrückt ist!
Aber mit "if radiobutton1.checked := true then
begin" funzt das nicht! Dann kommt immer : Type of expression must be Boolean"
Wie kann ich das anders machen???
THX
Keldorn - So 19.01.03 20:51
Titel: Re: Boolean Problem!
Snippy hat folgendes geschrieben: |
HI!
if radiobutton1.checked := true then
|
Quelltext
1:
| if radiobutton1.checked = true then |
= statt := , du willst ja keine Zuweisung
mfg Frank
Alibi - So 19.01.03 20:52
Mit := weist du einer Variable einen Wert zu und machst keinen Vergleich.
Quelltext
1:
| If RadioBox1.Checked = true then |
torstenheinze - So 19.01.03 21:14
damit erkennst du ob es markiert ist:
Quelltext
1:
| If RadioBox1.Checked then |
damit erkennst du ob es nicht markiert ist:
Quelltext
1:
| If not (RadioBox1.Checked) then |
:wink:
Moderiert von
Tino: Code-Tags hinzugefügt.
Snippy - So 19.01.03 21:14
Argh!
Auf welche Ideen Noobs wie ich doch immer kommen!
:D
Vielen Dank!
torstenheinze - So 19.01.03 21:16
ich glaube aber nicht, das dieser befehl funktioniert
Quelltext
1:
| If RadioBox1.Checked = true then |
denn bei einer checkbox funktioniert er nicht, denn man mus das mit
Quelltext
1:
| If not (RadioBox1.Checked) then |
oder
Quelltext
1:
| If (RadioBox1.Checked) then |
machen.
Moderiert von
Tino: Code-Tags hinzugefügt.
Christian S. - So 19.01.03 21:24
@torstenheinze: entschuldige die harten Worte, aber das ist Unsinn. Selbstverständlich funktioniert die Abfrage:
Quelltext
1:
| RadioBox1.Checked = true |
Sowohl bei einem RadioButton als auch bei einer Checkbox. Was man beim Namen "RadioBox" wohl dazu sagen soll, denn ich weiß nicht, was von beidem das sein soll.
MfG,
Peter
torstenheinze - So 19.01.03 21:35
is ja ok, aber bei mir gab es da manchmal fehler, darum verwende ich immer die die icjh geschrieben hab.
als ich das alserstes mal versucht hab (deine methode) da gab es ein fehler und ich hab mich auch höllisch gewundert, aber egal, es futzen beide, um so besser
Christian S. - So 19.01.03 22:15
Sorry nochmal. Bin heute nicht so gut drauf ... :beer: ?
smiegel - So 19.01.03 22:55
Hallo,
die Abfrage if (RadioButton1.Checked=true) then kann man sich schenken.
if RadioButton1.Checked then tut das gleiche.
torstenheinze - So 19.01.03 22:58
Ok, Peter Lustig
:beer:
FR399Y - Mo 27.01.03 20:18
Zitat: |
If not (RadioBox1.Checked) then |
funktioniert das auch bei nem text edit oder spin edit ?
Tino - Mo 27.01.03 20:37
FR399Y hat folgendes geschrieben: |
funktioniert das auch bei nem text edit oder spin edit ? |
Nur bei Variablen / Eingeschaften die ein Boolean Wert zurückgeben.
Gruß
TINO
FR399Y - Mo 27.01.03 21:12
ok haette ich mir auch denken können :wink:
aber wie macht man das den?
mit ner if-then abfrage ist doof da dann ja der anfangs wert ausgegrenzt werden muss ..
zb 0 aber mit dieser kann man ja auch was machen
und nen leer zeichen sagt er ja gleitkomma fehler...
wie ist der befehl ne veränderung in nem text oder spin edit zu testen bzw. zu erfassen?
AndyB - Mo 27.01.03 22:26
Peter Lustig hat folgendes geschrieben: |
@torstenheinze: entschuldige die harten Worte, aber das ist Unsinn. Selbstverständlich funktioniert die Abfrage:
Quelltext 1:
| RadioBox1.Checked = true | |
Es ist nicht gewiss, ob sie funktioniert. Wenn man nur mit Delphi-Funktionen und Komponenten arbeitet dürfte es bei der Gleichsetzung mit
True zu keinerlei Probleme führen. Nutzt man hingegen API Funktionen, so kann das Ganze nach hinten los gehen. Das hat folgenden Grund:
In Delphi gilt:
Quelltext
1: 2:
| False = Boolean(0) True = Boolean(1) |
In der
Theorie gilt jedoch:
Quelltext
1: 2:
| False = Boolean(0) True <> Boolean(0) |
Wenn nun eine API-Funktion einen Wert ungleich 0 zurückliefert und in der Delphi Import-Deklaration mit Boolean als Rückgabewert gearbeitet wird, so kann es vorkommen, dass nicht unbedingt Boolean(1) zurückgeliefert werden muss.
Was passiert, wenn eine Funktion z.B. Boolean(10) zurückliefert, und man diesen Wert dann mit
True gleich setzt, kann man sich denken:
Quelltext
1: 2: 3: 4: 5:
| var b: Boolean; begin b := APIFunktion('irgendwas'); if b = True then ... end; |
Das ganze wird während des Programmsablaufs dann so aussehen:
Quelltext
1:
| if Boolean(10) = Boolean(1) then ... |
Wie man sieht, wird diese Bedingung nie Wahr.
Schreibt man hingegen die verkürzte Form ohne die Gleichsetzung, so macht der Compiler eine Abfrage nach ungleich
Boolean(0) daraus und die Bedingung wird Wahr.
if b then ...wird zu
Quelltext
1:
| if Boolean(10) <> Boolean(0) then ... |
Auf der sicheren Seite ist man also, wenn man
if b then und
if not b then schreibt.
Christian S. - Mo 27.01.03 22:40
Vorneweg: da ich mich auf eine Checkbox / einen Radiobutton bezog, erscheint mir die ganze Abhandlung ziemlich am Thema vorbei.
Nun zum eigentlichen:
Soweit ich weiß, ist auch in der Theorie ein Boolean eine 1bit-Variable. Etwas anderes macht absolut keinen Sinn. Boolean ist nunmal ein Wahrheitswert.
Damit kann Boolean aber nur 1 oder 0 sein, also True oder False. Wie kommen denn da noch irgendwelche 10 oder so rein? Das erscheint mir sehr unlogisch. Eine Variable, die einen Wert größer als 1bit speichert, ist kein Boolean, sondern irgendetwas anderes.
Oder habe ich komplett falsch verstanden, was Du meintest?
MfG,
Peter
AndyB - Mo 27.01.03 22:47
Was ich meine ist, dass SizeOf(Boolean) = 1 ergibt. Also Boolean = Byte. Und ein Byte kann nunmal mehr als 2 Werte aufnehmen, was zu dem obigen Problem führt.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| function MyFunc: Integer; stdcall; begin if Fehler then Result := 0 else if OK1 then Result := 1 else if OK2 then Result := 2; end;
function MyFunc: Boolean; stdcall; external 'MyDll.dll'; |
Genau so wird mit vielen WinAPI Funktionen verfahren, bei denen es eigentlich nur darum geht, ob sie 0 oder <>0 liefern.
Christian S. - Mo 27.01.03 22:57
Hi!
Jetzt verstehe ich, was Du meinst. Allerdings glaube ich, dass das (sehr interessante) Problem bereits gelöst wurde:
Delphi-Hilfe hat folgendes geschrieben: |
A value of type ByteBool, LongBool, or WordBool is considered True when its ordinality is nonzero. If such a value appears in a context where a Boolean is expected, the compiler automatically converts any value of nonzero ordinality to True. |
MfG,
Peter
Tino - Di 28.01.03 01:04
FR399Y hat folgendes geschrieben: |
aber wie macht man das den?
mit ner if-then abfrage ist doof da dann ja der anfangs wert ausgegrenzt werden muss ..
zb 0 aber mit dieser kann man ja auch was machen
und nen leer zeichen sagt er ja gleitkomma fehler...
wie ist der befehl ne veränderung in nem text oder spin edit zu testen bzw. zu erfassen? |
Sorry, aber ich verstehe nicht was Du meinst!
Gruß
TINO
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!