Char Vergleich: #0 <> ''
Hallo,
mal wieder ein Problem beim Umstieg von Delphi 6 auf Delphi 2007. Habe eine Fremdkomponente, die an mehreren Stellen einen Char auf #0 setzt. An einer anderen Stelle, wird nun abgefragt, ob der Char='' ist. In Delphi 6 ist '' und #0 das Selbe und in Delphi 2007 nicht. Eine If-Abfrage auf Gleichheit schlägt also fehl. Wisst ihr da genaueres? Kann man das einstellen? Gruß, Steffen |
Re: Char Vergleich: #0 <> ''
handelt es sich um ein Stringverarbeitung? bei PChar's markiert #0 das Ende der Zeichenkette, bei Strings ist dem nicht so. Wenn das unter d6 noch so war wurde es zeit das es gefixt wird. Bei Strings wird die Länge über SetLength gesetzt.
Ohne den Quelltext kann jedoch nur spekuliert werden ob es sich bei deinem Char um ein Zeichen eines Strings handelt, um ein Zeichen eines PChars um das Zeichen eines Array of Char etc. Auf jeden Fall ist #0 <> '' |
Re: Char Vergleich: #0 <> ''
Bist Du Dir sicher, daß das in D6 dasselbe ist? General dürfte es erstmal auf keinen Fall dasselbe sein, wenn dann nur in einem speziellen Kontext, aber egal... als Lösung würde mir spontan einfallen, Trim(Text)='' zu prüfen, imho dürfte Trim das #0 zu einem '' umwandeln (bzw. aus #0 = leerer String + #0 das #0 wegschneiden ;) )...
|
Re: Char Vergleich: #0 <> ''
#0 ist nicht ''.
#0 bedeutet End-Of-String |
Re: Char Vergleich: #0 <> ''
Ich bin mir definitiv sicher, dass es in Delphi 6 so ist.
Es ist allerdings ein WideChar und kein AnsiChar. Beispiel:
Delphi-Quellcode:
In Delphi 6 zeigt er die Message an, in Delphi 2007 nicht.
var
LastChar: WideChar; begin LastChar:=#0; if LastChar='' then begin ShowMessage('Gleich'); end; Das Problem ist, dass wir nicht wissen, wo überall so ein Vergleich stattfindet. Allein die Fremdkomponente sind viele tausend Zeilen Code und das ist ja nicht mit Suchen & Ersetzen getan. Der Compiler meckert ja auch nicht und wir merken den Fehler eventuell erstmal gar nicht. Hatte gehofft, dass es da für Backwards-Kompatibilität eine Einstellung oder einen Compiler-Switch gibt. Gruß, Steffen |
Re: Char Vergleich: #0 <> ''
@mkinzler: Doch! (re 1. Aussage) bzw. Nein! (re 2. Aussage)
Delphi-Quellcode:
Ist durchaus wahr (haut selbst in Turbo Delphi noch hin)... nur beide auf einen Typ gecastet sind sie nicht identisch ;-)
String('')=PChar(#0)
Und selbst in PChars ist #0 oft genug nicht "End-Of-String", etwa in PWideChar, wo es bei lateinischer Schrift jedes zweite Byte ausmacht, oder in Enumerationen, auch ANSI, wo es ein normaler Trenner ist und der String bis zum #0#0 geht. |
Re: Char Vergleich: #0 <> ''
Wenn Fremdkomponenten eine solche falsche Abfrage verwenden und dies bei einer spezifischen Delphiversion zufällig das richtige Ergebnis liefert, darfst du nicht verlangen, daß neuere Delphiversionen das selbe falsche Verhalten an den Tag legen.
Es scheint so als ob die Zuweisung
Delphi-Quellcode:
ignoriert wird, und deshalb LastChar leer bleibt.
LastChar:=#0;
|
Re: Char Vergleich: #0 <> ''
Tschuldigung, hatte das Beispiel übersehen. Als Workaround folgendes Typecasting verwenden (/in die Komponente einbauen, wo auch immer das halt vorkommt):
Delphi-Quellcode:
var
LastChar: WideChar; begin LastChar:=#0; if PWideChar(LastChar)='' then begin ShowMessage('Gleich'); end; |
Re: Char Vergleich: #0 <> ''
Was hier zuschlaegt sind automatische Konversionen. #0 ist vom Typ Char. Die Zuweisung an einen WideChar bewirkt eine automatische Typkonversion.
Entsprechendes gilt fuer den Vergleich #0 = ''. Da es ein Vergleich zwischen Char und string ist, wird eine Seite automatisch konvertiert. Egal ob der Char zum Leerstring konvertiert wird oder '' als "leeres" Stringendezeichen interpretiert wird, der Vergleich sollte gelingen. Hier kommt ein Problem von Pascal zum Vorschein. 'x' kann je nach Kontext Char- oder String-Literal sein. Ich glaube D2007 macht hier einen Fehler. |
Re: Char Vergleich: #0 <> ''
Hab es gerad mal mit anderen Delphi Versionen getestet.
Delphi 6, Delphi 7 und Delphi 2005 zeigen die Message alle an. Delphi 2006 und 2007 nicht mehr. In Delphi 2005 .NET geht es ebenfalls nicht. Was Robert sagt, klingt für mich einleuchtend. Machen diese Sachen nicht die Codepages (Codeseiten)? Die kann man ja nun irgendwie einstellen. Ist aber bei mir nur Standard auswählbar. Gruß, Steffen |
Re: Char Vergleich: #0 <> ''
Delphi-Quellcode:
Dieser Code hat nur einen Breakpoint auf der "ungleich"-Zeile. Der Compiler hat also den if-Teil wegoptimiert. Das gilt fuer D6 und Turbo.
if #0 = '' then
ShowMessage('gleich') else ShowMessage('ungleich');
Delphi-Quellcode:
Dieser Code gibt fuer D6 und Turbo hingegen "gleich" aus.
var
a: Char; begin a := #0; if a = '' then ShowMessage('gleich') else ShowMessage('ungleich'); das sieht nach einem echten Compilerfehler aus. |
Re: Char Vergleich: #0 <> ''
Hallo,
folgendes findet man in der Datei "readme_upd2.htm": Zitat:
Gruß Hawkeye |
Re: Char Vergleich: #0 <> ''
Danke! Das beschreibt das Problem.
Im QC Report steht auch genau unser Problem drin: Zitat:
Gruß, Steffen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:46 Uhr. |
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