Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Char Vergleich: #0 <> '' (https://www.delphipraxis.net/94204-char-vergleich-0-a.html)

MasterEvil 18. Jun 2007 08:22


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

SirThornberry 18. Jun 2007 08:26

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 <> ''

CCRDude 18. Jun 2007 08:27

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 ;) )...

mkinzler 18. Jun 2007 08:28

Re: Char Vergleich: #0 <> ''
 
#0 ist nicht ''.
#0 bedeutet End-Of-String

MasterEvil 18. Jun 2007 08:37

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:
var
 LastChar: WideChar;
begin
  LastChar:=#0;
  if LastChar='' then
  begin
    ShowMessage('Gleich');
  end;
In Delphi 6 zeigt er die Message an, in Delphi 2007 nicht.

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

CCRDude 18. Jun 2007 08:42

Re: Char Vergleich: #0 <> ''
 
@mkinzler: Doch! (re 1. Aussage) bzw. Nein! (re 2. Aussage)

Delphi-Quellcode:
String('')=PChar(#0)
Ist durchaus wahr (haut selbst in Turbo Delphi noch hin)... nur beide auf einen Typ gecastet sind sie nicht identisch ;-)

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.

mkinzler 18. Jun 2007 08:43

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:
LastChar:=#0;
ignoriert wird, und deshalb LastChar leer bleibt.

CCRDude 18. Jun 2007 08:46

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;

Robert Marquardt 18. Jun 2007 08:50

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.

MasterEvil 18. Jun 2007 09:17

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:48 Uhr.
Seite 1 von 2  1 2      

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