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 user profile iconTino: 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 user profile iconTino: 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