![]() |
Selsames verhalten bei True abfrage
Habe ein problem bei mit einer simplen abfrage
Delphi-Quellcode:
if AppOwnHdcW2 = True then
begin
Delphi-Quellcode:
alle diese abfragen liefern ein False zurück obwohl die eigenschaft AppOwnHdcW2 True ist!
if (AppOwnHdcW2 = True) then
begin Nur das funktioniert
Delphi-Quellcode:
Wo ist das problem ?
if AppOwnHdcW2 then
begin gruss Emil |
Re: Selsames verhalten bei True abfrage
Das ist kein Problem von Delphi sondern ein Problem welches sich der Programmierer selbst einproggt. Wahr ist alles ungleich 0. False ist also 0. True ist in Delphi 1. Aber Wahr ist eben nicht nur 1 sondern alles ungleich 0.
Deswegen sollte man auch nie einen Boolean mit True vergleichen außer man will wirklich wissen ob der Boolean den Wert 1 hat. Zudem hat die cpu mehr zu tun wenn du auf True vergleichst anstelle nur den Boolean als Bedingung zu nehmen (weil ja sonst erst geprüft werden muss ob 2 Variablen identich sind und dann ob der vergleich wahr ist) Wenn du also AppOwnHdcW2 mal zu Byte oder Integer castest wirst du sehen das es eine Zahl ungleich 1 ist. |
Re: Selsames verhalten bei True abfrage
Ich vermute, dass AppOwnHdcW2 -1 ist. Bei LongBool ist True nämlich IIRC -1, bei Boolean 1.
|
Re: Selsames verhalten bei True abfrage
Siehe dir hierzu auch mal das hier an:
![]() |
Re: Selsames verhalten bei True abfrage
Zitat:
Wie der wert Boolean interpretiert wird ist mir wohl klar. Ich denke das ist ein bug in Delphi. Wenn ich einen Wert strikt als boolean definiere erwarte ich auch das nur auf true oder false geprüft wird und nicht auf integer oder byte werte. Dann kann ich ihn direkt als integer oder longbool deklarieren. Ja bool ist in diesen Fall -1 da aus einer VB Anwendung übergeben. Aber auch das muss eine interpreter sprache erkennen von wo der Wert übergeben wird. In VB gibt es kein 0=False 1=True da ist -1=False und 0=True. Auch wenn ich die DLL in Delphi geschriebe habe kann ich aus VB nicht einfach mal 0 oder 1 übergeben. gruss Emil |
Re: Selsames verhalten bei True abfrage
Nein, es ist kein Delphi-Fehler. Man vergleicht halt grundsätzlich nicht auf True oder False!
|
Re: Selsames verhalten bei True abfrage
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
Funktioniert!
VisChan = BASS_WINAMPVIS_ExecuteVis(PluginDir & "\" & _
lstPlugins.List(IndexNum), _ VisModules.ListIndex, _ True, _ ckOwnDcW2.value)
Delphi-Quellcode:
Funktioniert nicht!
VisChan = BASS_WINAMPVIS_ExecuteVis(PluginDir & "\" & _
lstPlugins.List(IndexNum), _ VisModules.ListIndex, _ True, _ True) Beides das selbe nur das beim obigen die Value des Controls übergeben wird. Selbst wenn jetzt der Wert von ckOwnDcW2.value(control) als -1 und 0 übergeben wird kommt es immer noch nicht mit der aussage überein 0 und 1 in Delphi da nie ein wert von 1 übergeben wird. Na es geht ja ! Ansonsten würden sich die Plugins nicht in mein GenFenster setzen. Aber seltsam ist das schon. gruss Emil |
Re: Selsames verhalten bei True abfrage
Moin Emil,
dann liegt der Fehler wohl nicht bei Delphi, sondern in der Funktion, die Du aufrufst. Dort wird dann offensichtlich auf = true geprüft, wobei dort true als -1 angesehen wird. Zitat:
Was meinst Du damit? |
Re: Selsames verhalten bei True abfrage
Zitat:
Zitat:
da der höchste wert = 0 ist. gruss Emil |
Re: Selsames verhalten bei True abfrage
Moin Emil,
Zitat:
Um Boolsche-Variablen sprechend initialisieren zu können muss man sich für einen Wert entscheiden, der für true steht, in Delphi ist das dann halt 1, in VB -1. |
Re: Selsames verhalten bei True abfrage
Zitat:
habs jetzt so geändert das es Sprachunabhängig ist.. gruss Emil |
Re: Selsames verhalten bei True abfrage
Zitat:
Das ist so nicht ganz richtig. ein "if a=true then " wird umgesetzt in
Delphi-Quellcode:
ein "if a then" wird umgesetzt in
cmp a,1
jnz xxxx // wenn a nicht true ist
Delphi-Quellcode:
ob die CPU gegen 0 oder 1 prüft macht (vom Aufwand her) keinen Unterschied.
cmp a,0
jz xxx // wenn a = 0 also false ist Ansonsten hast Du natürlich Recht mit der Aussage "nie mit True vergleichen.." |
Re: Selsames verhalten bei True abfrage
Auf True sollte man halt nie prüfen, es sei denn man will/muß ganz genau wissen, ob es wirklich mit True identisch ist.
also im Normalfall immer nur: B not B oder maximal noch, B <> False da False immer nur 0 ist. (wobei es eigentlich besser wäre gleich auf alle "=/<> true/false" zu verzichten) Und nochmals: nein, kein Bug ... schließlich will man manchmal auch genau dieses Verhalten (B = True, also True <> True) haben. |
Re: Selsames verhalten bei True abfrage
Zu
AppOwnHdcW2 = True (*) Also mal grundsätzlich falls AppOwnHdcW2 boolean ist, dann dürfte es eigentlich kein Problem geben !!! Ist jedoch AppOwnHdcW2 ein Handle, so wie es aussieht, so hat sich eingebürgert : if AppOwnHdcW2 then Grund : Handle = nil -> Bedingung wird als false interpretiert, ansonsten true. Es gilt also folgende Regel : Vergl. mit true/false nur bei boolean ansonsten je nach Programmiersprache erstmal schauen, wie: if wert then interpretiert wird. |
Re: Selsames verhalten bei True abfrage
Zitat:
Delphi-Quellcode:
oder
if b
Delphi-Quellcode:
und auf nicht if b = true
if not b
|
Re: Selsames verhalten bei True abfrage
Zitat:
Bei Boolean gilt auch grundsätzlich der Hinweis von mkinzler... |
Re: Selsames verhalten bei True abfrage
zu mkinzler :
natürlich hast du da recht, da kürzer. jedoch ist if (a=false) zumindest nicht falsch, falls a boolean ist. Gruß G.M. |
Re: Selsames verhalten bei True abfrage
hab's dochauch schon gesagt ... mit/auf FALSE könnte man prüfen, aber da es mit TRUE nicht geht, ist es besser dieses gleich ganz sein zu lassen.
Viele machen ja schließlich nur das nach, was sie irgendwo sehn und denken sich womöglich mit FALSE arbeiten ja viele, warum soll ich's dann nicht auch mit TRUE versuchen ... und irgendwann landen die dann wieder hier und wundern sich weil irgendwas nicht geht. |
Re: Selsames verhalten bei True abfrage
Zitat:
Delphi-Quellcode:
var
lb: LongBool; b: Boolean; begin lb := True; { 83C8FF or eax,-$01 } b := lb; { 83F801 cmp eax,$01 1BC0 sbb eax,eax 40 inc eax } if b = True then { 3C01 cmp al,$01 7505 jnz +$05 } ShowMessage('Ist True'); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:38 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-2025 by Thomas Breitkreuz