Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   String gleich aber doch nicht gleich... (https://www.delphipraxis.net/170286-string-gleich-aber-doch-nicht-gleich.html)

EWeiss 9. Sep 2012 17:53

String gleich aber doch nicht gleich...
 
Seltsames problem

Ich such nach einem Pfad wird der nicht gefunden dann setze ich das ergebnis auf ('')
Prüfe ich jetzt dagegen ob dieser (> '') ist bekomme ich ein true geliefert obwohl er es nicht ist.

Delphi-Quellcode:
if goProgBar.ProgPath > '' then


True obwohl gleich.

Hab es auch schon mit SizeOf und Lenght versucht dann wird immer ne 1 für die länge zurückgegeben.
Sollte aber eigentlich 0 sein.

gruss

mirage228 9. Sep 2012 18:07

AW: String gleich aber doch nicht gleich...
 
Zeig mal die zugehörige Funktion, die das Ergebnis produziert ;)

Sonst:
1) Versuch mal die EmptyStr Konstante zum Testen
2) Wieso überprüfst Du nicht mit = ''? Das ">" bei Strings war bis jetzt nicht geläufig...

EWeiss 9. Sep 2012 18:21

AW: String gleich aber doch nicht gleich...
 
Zitat:

Zeig mal die zugehörige Funktion, die das Ergebnis produziert
Das ist ne Unit welche die Process informationen ausliest
wäre jetzt wegen einem string das hier zu posten zu viel denke ich mal ;)

Nein grunsätzlich kein problem aber ich kann ja im ToolTip beim debuggen erkennen das der String quasi leer ist.
Ich sagte ja schon auch wenn ich auf anderer weise prüfe

Delphi-Quellcode:
if SizeOf(goProgBar.ProgPath) > 0 then
if Length(goProgBar.ProgPath) > 0 then
gibt mir immer ne 1 zurück.

Zitat:

Versuch mal die EmptyStr Konstante zum Testen
Das könnte ich noch versuchen.

gruss

mirage228 9. Sep 2012 18:22

AW: String gleich aber doch nicht gleich...
 
Hm, ansonsten würde ich noch mal in der Unit schauen, vllt zeigt es der Debugger dir nur nicht richtig an...

EWeiss 9. Sep 2012 18:36

AW: String gleich aber doch nicht gleich...
 
Zitat:

Zitat von mirage228 (Beitrag 1182217)
Hm, ansonsten würde ich noch mal in der Unit schauen, vllt zeigt es der Debugger dir nur nicht richtig an...

Mit der Konstante funktioniert es..
Danke.

Aber schon seltsam das ganze.

gruss

EWeiss 9. Sep 2012 19:01

AW: String gleich aber doch nicht gleich...
 
Muss nochmal nachhaken.

Es gibt ja soviele möglichkeiten um die länge eines strings zu prüfen.
Also von den mir genannten wüßte ich mal gerne was denn nun
die richtige Methode ist.. SizeOf, Length, > "" oder andere alternativen.

gruss

mirage228 9. Sep 2012 19:24

AW: String gleich aber doch nicht gleich...
 
Also ich prüfe meist meist über
Delphi-Quellcode:
Str <> ''
und manchmal über
Delphi-Quellcode:
Length(Str)
Das mit SizeOf() dürfte aber nicht funktionieren, da Strings in Delphi ja im Endeffekt nur Pointer sind (zumindest UnicodeString, AnsiString und WideString)...

Furtbichler 9. Sep 2012 19:26

AW: String gleich aber doch nicht gleich...
 
Ich wusst nicht, das man mit SizeOf(StringVariable) die Länge eines Strings ermitteln kann. SizeOf liefert die Größe des durch die Variable vebrauchten Speicherplatzes. Bei einem String ist dies 32bit, die Größe eines Pointers.

Um einen String auf 'nicht leer' zu prüfen, würde ich das 1:1 übersetzen. Also
Delphi-Quellcode:
If MyString <> '' Then
. Du sagst ja nicht 'Wenn der String größer als nichts ist'.

Wenn Du einen String auf 'mehr als Nichts' prüfen willst, wäre
Delphi-Quellcode:
if Length(MyString)>0 Then
das korrekte Äquivalent

EWeiss 9. Sep 2012 19:27

AW: String gleich aber doch nicht gleich...
 
Zitat:

Zitat von mirage228 (Beitrag 1182226)
Also ich prüfe meist meist über
Delphi-Quellcode:
Str <> ''
und manchmal über
Delphi-Quellcode:
Length(Str)
Das mit SizeOf() dürfte aber nicht funktionieren, da Strings in Delphi ja im Endeffekt nur Pointer sind (zumindest UnicodeString, AnsiString und WideString)...

SizeOf..
Bisher hab ich da kein problem.

Str <> ''
Weniger dürfte ja eigentlich nicht auftreten. Oder?

Da komme ich fast zu dem schluss das eigentlich die überprüfung mit Lenght bei reinen Strings
das richtige sein sollte.
In verbindung mit Pointer wiederum nicht ..

Hmmm....

gruss

EWeiss 9. Sep 2012 19:29

AW: String gleich aber doch nicht gleich...
 
Zitat:

Zitat von Furtbichler (Beitrag 1182227)
Ich wusst nicht, das man mit SizeOf(StringVariable) die Länge eines Strings ermitteln kann. SizeOf liefert die Größe des durch die Variable vebrauchten Speicherplatzes. Bei einem String ist dies 32bit, die Größe eines Pointers.

Um einen String auf 'nicht leer' zu prüfen, würde ich das 1:1 übersetzen. Also
Delphi-Quellcode:
If MyString <> '' Then
. Du sagst ja nicht 'Wenn der String größer als nichts ist'.

Wenn Du einen String auf 'mehr als Nichts' prüfen willst, wäre
Delphi-Quellcode:
if Length(MyString)>0 Then
das korrekte Äquivalent

Ok wobei wie schon angedeutet nach meinem verständnis dürfte ein string
niemals den minus wert annehmen warum dann auf <>

Delphi-Quellcode:
if Length(MyString)>0 Then

War dann letztendlich mein Gedankengang doch nicht so verkehrt ;)


gruss

Furtbichler 9. Sep 2012 19:35

AW: String gleich aber doch nicht gleich...
 
Zitat:

Zitat von EWeiss (Beitrag 1182228)
SizeOf.. Bisher hab ich da kein problem.

Glaube ich nicht. Das kann icht funktionieren.

Sizeof liefert bei Strings den Wert 4 und bei ShortStrings die Anzahl der maximalen Zeichen + 1 (Längenbyte). Aber in keinem Fall die tatsächliche Länge.

Zitat:

Weniger dürfte ja eigentlich nicht auftreten. Oder?
Es ist problematisch, das Nichts innerhalb einer Ordnung korrekt zu plazieren. Es könnte korrekt sein, anzunehmen, das der leere String kleiner (nicht weniger) als jeder andere nicht leere String ist, aber erklären kann man das nicht: Das wäre eine Vereinbarung eines Sonderfalls in der Routine 'Vergleich von Strings'. Genausogut könnte man definieren, das der leere String größer als alle anderen Strings sind.

Zitat:

Da komme ich fast zu dem schluss das eigentlich die überprüfung mit Lenght bei reinen Strings das richtige sein sollte. In verbindung mit Pointer wiederum nicht ..
Du denkst zu kompliziert. Pointer oder nicht, egal. Strings/Zeichen sollte man eigentlich nur auf Gleichheit prüfen, denn bei Verwendung der Ordnung (also Prüfen auf >,< usw.) legst Du dich implizit auf eine Sprache fest, denn im jeweiligen Zeichensatz wird die Ordnung definiert.

mirage228 9. Sep 2012 19:36

AW: String gleich aber doch nicht gleich...
 
Ja gut, es läuft auf (fast) das selbe hinaus.

Bei > '' und <> '' optimiert der Compiler das schon, dass automatisch auf die String-Länge zurückgegriffen wird:
Code:
cmp dword ptr [ebp-$04],$00
(An Pointer(String) - 4 liegt der Längenzähler, 4 Bytes)
Wobei ein Vergleich auf 0, wie er bei <> '' geschieht ("jnz" in ASM), meine ich, schneller ist, als ein Range-Vergleich über "jnbe" in dem Fall...

himitsu 9. Sep 2012 19:38

AW: String gleich aber doch nicht gleich...
 
Zitat:

Zitat von EWeiss (Beitrag 1182221)
Es gibt ja soviele möglichkeiten um die länge eines strings zu prüfen.
Also von den mir genannten wüßte ich mal gerne was denn nun
die richtige Methode ist.. SizeOf, Length, > "" oder andere alternativen.

Nein! SizeOf ist niemals richtig, um die Länge eines Strings, also dessen Inhalts, zu prüfen.

SizeOf gibt bei einem String immer 4 zurück (bei 32 Bit).
Bei einem ShortString gibt es die maximale Länge + 1 (dem Längenbyte an Index 0) zurück.

EWeiss 9. Sep 2012 19:41

AW: String gleich aber doch nicht gleich...
 
Zitat:

Zitat von mirage228 (Beitrag 1182235)
Ja gut, es läuft auf (fast) das selbe hinaus.

Bei > '' und <> '' optimiert der Compiler das schon, dass automatisch auf die String-Länge zurückgegriffen wird:
Code:
cmp dword ptr [ebp-$04],$00
(An Pointer(String) - 4 liegt der Längenzähler, 4 Bytes)
Wobei ein Vergleich auf 0, wie er bei <> '' geschieht ("jnz" in ASM), meine ich, schneller ist, als ein Range-Vergleich über "jnbe" in dem Fall...

Also dann gibt es die definition nicht "was richtig und was falsch".
Zumindest bei der prüfung >, <> , Length.

SizeOf bleibt dann außen vor soviel habe ich verstanden und auch abgeändert.

Überlge nun ob das auch nicht richtig ist.

Delphi-Quellcode:
function GetWndText(WinHandle: HWND): string;
var
  sBuf: array[0..256] of char;
  lRet: Integer;

begin

  Result := '';
  lRet := GetWindowText(WinHandle, sBuf, sizeof(sBuf) - 1);
  if lRet <= 0 then
      exit;

  Result := sBuf;
end;
Letztendlich ist die rückgabe auch ein string
sizeof(sBuf) - 1);

Da fehlt wohl noch was Knowhow ;)

gruss

himitsu 9. Sep 2012 19:44

AW: String gleich aber doch nicht gleich...
 
Da bei einem Leerstring der Stringpointer auf nil steht, kann bei
Delphi-Quellcode:
S <> ''
direkt auf nil geprüft werden, wärend bei
Delphi-Quellcode:
Length(S) <> 0
erstmal auf nil geprüft werden muß, dann wird der Offset zum Längen-Wert aufgerechnet, von dort die Länge geholt und dann das mit 0 verglichen. (oder optimiert Delphi inzwischen das
Delphi-Quellcode:
Length(S) <> ''
zu einem
Delphi-Quellcode:
S <> ''
? )
(standardmäßig, also solange keiner fahrlässig an der Speicherverwaltung des Strings rumfummelt)

mirage228 9. Sep 2012 19:47

AW: String gleich aber doch nicht gleich...
 
Streng genommen nicht, aber ich finde das mit dem größer-als ">" auch etwas seltsam. Kommt mir zumindest beim Lesen von der Semantik komisch vor.

<> '' sagt ganz klipp und klar aus: Dieser String soll nicht leer sein. Bei dem anderen musste erstmal um die Ecke decken ;)

Edit:
Zitat:

Letztendlich ist die rückgabe auch ein string
sizeof(sBuf) - 1);
Ja ein "String", aber kein AnsiString oder kein UnicodeString etc. -
Und, wie erwähnt, gibt hier SizeOf() ja nicht an, wieviel wirklich drin steht, sondern die Arraygröße in Bytes ...

EWeiss 9. Sep 2012 19:49

AW: String gleich aber doch nicht gleich...
 
Zitat:

Zitat von mirage228 (Beitrag 1182239)
Streng genommen nicht, aber ich finde das mit dem größer-als ">" auch etwas seltsam. Kommt mir zumindest beim Lesen von der Semantik komisch vor.

<> '' sagt ganz klipp und klar aus: Dieser String soll nicht leer sein. Bei dem anderen musste erstmal um die Ecke decken ;)

Ok dann werde ich das so handhaben..
Wie sieht es denn mit dem editierten Beitrag aus bei prüfung auf buffer länge.

Buffer länge

gruss

Namenloser 9. Sep 2012 19:52

AW: String gleich aber doch nicht gleich...
 
Zitat:

Zitat von EWeiss (Beitrag 1182228)
Str <> ''
Weniger dürfte ja eigentlich nicht auftreten. Oder?

Weder „größer“ noch „weniger“ dürfte auftreten, da überhaupt nicht definiert ist, was bei einem String „größer“ oder „kleiner“ überhaupt sein soll. Wenn dann kann die Länge des Strings verglichen werden, das wäre dann aber
Delphi-Quellcode:
Length(Str)
.

Delphi-Quellcode:
<>
ist in Delphi einfach das Symbol für Ungleichheit, wie
Delphi-Quellcode:
!=
in C-artigen Sprachen oder ≠ in der Mathematik.
Delphi-Quellcode:
Str <> ''
ist hier nicht zu verstehen als „Str ist größer oder kleiner '' “, sondern als „Str ist ungleich '' “, oder man könnte auch sagen: „Str ist kein Leerstring“.

Ich halte den Vergleich auf
Delphi-Quellcode:
''
daher für die sauberste Lösung.

himitsu 9. Sep 2012 19:54

AW: String gleich aber doch nicht gleich...
 
Bei
Delphi-Quellcode:
S > ''
muß man auch noch aufpassen, denn
Delphi-Quellcode:
'' < S
ist ja andersrum, wärend es bei
Delphi-Quellcode:
<>
egal ist.

Und auch von der Logik her, ist
Delphi-Quellcode:
S ungleich leer
, bzw.
Delphi-Quellcode:
S nicht leer
auch verständlicher, als ein
Delphi-Quellcode:
S größer als Nichts
.

jbg 9. Sep 2012 19:55

AW: String gleich aber doch nicht gleich...
 
Das SizeOf bei GetWindowText ist falsch. Die Funktion möchte die maximale Anzahl an Zeichen (Char) haben und nicht die Byte-Größe (Quelle MSDN: "The maximum number of characters to copy to the buffer").

Mit SizeOf(Buf) bekommst du ab Delphi 2009 (Unicode) die doppelte Anzahl zurück, da SizeOf(Char) = 2 ist und somit "257*2" zurückkommt. GetWindowText möchte aber nicht die Byte-Größe, sondern die "Anzahl der verfügbaren Zeichen". Und die ermittelt man über Length.

EWeiss 9. Sep 2012 19:57

AW: String gleich aber doch nicht gleich...
 
Zitat:

Zitat von NamenLozer (Beitrag 1182242)
Zitat:

Zitat von EWeiss (Beitrag 1182228)
Str <> ''
Weniger dürfte ja eigentlich nicht auftreten. Oder?

Weder „größer“ noch „weniger“ dürfte auftreten, da überhaupt nicht definiert ist, was bei einem String „größer“ oder „kleiner“ überhaupt sein soll. Wenn dann kann die Länge des Strings verglichen werden, das wäre dann aber
Delphi-Quellcode:
Length(Str)
.

Delphi-Quellcode:
<>
ist in Delphi einfach das Symbol für Ungleichheit, wie
Delphi-Quellcode:
!=
in C-artigen Sprachen oder ≠ in der Mathematik.
Delphi-Quellcode:
Str <> ''
ist hier nicht zu verstehen als „Str ist größer oder kleiner '' “, sondern als „Str ist ungleich '' “, oder man könnte auch sagen: „Str ist kein Leerstring“.

Ich halte den Vergleich auf
Delphi-Quellcode:
''
daher für die sauberste Lösung.

Eine prüfung auf nur
Delphi-Quellcode:
''
mag der Compiler gar nicht
zumindest nicht in verbindung mit
Delphi-Quellcode:
not
Delphi-Quellcode:
if not goProgBar.ClassNamen = '' then

Wie man's macht ist es nicht richtig.. ;)

gruss

EWeiss 9. Sep 2012 20:00

AW: String gleich aber doch nicht gleich...
 
Zitat:

Zitat von jbg (Beitrag 1182244)
Das SizeOf bei GetWindowText ist falsch. Die Funktion möchte die maximale Anzahl an Zeichen (Char) haben und nicht die Byte-Größe (Quelle MSDN: "The maximum number of characters to copy to the buffer").

Mit SizeOf(Buf) bekommst du ab Delphi 2009 (Unicode) die doppelte Anzahl zurück, da SizeOf(Char) = 2 ist und somit "257*2" zurückkommt. GetWindowText möchte aber nicht die Byte-Größe, sondern die "Anzahl der verfügbaren Zeichen". Und die ermittelt man über Length.

Danke.. ;)
Da hab ich wohl ein Thema angestoßen ich denke viel nicht Studierte Schreiber dürften damit probleme haben.


gruss

mirage228 9. Sep 2012 20:00

AW: String gleich aber doch nicht gleich...
 
Musst Klammern setzen ansonsten denkt der Compiler Du versuchst "goProgBar.ClassNamen" zu negieren (bool'scher Operator):

Delphi-Quellcode:
if not (goProgBar.ClassNamen = '')
oder gleich
Delphi-Quellcode:
if goProgBar.ClassNamen <> ''

EWeiss 9. Sep 2012 20:05

AW: String gleich aber doch nicht gleich...
 
Zitat:

Zitat von mirage228 (Beitrag 1182248)
Musst Klammern setzen ansonsten denkt der Compiler Du versuchst "goProgBar.ClassNamen" zu negieren (bool'scher Operator):

Delphi-Quellcode:
if not (goProgBar.ClassNamen = '')
oder gleich
Delphi-Quellcode:
if goProgBar.ClassNamen <> ''

Jup das war's und das zu später Stunde ;)

Auf jedenfall bekomme ich jetzt die richtige Meldung..
Denn mit MSTaskListWClass kann ich bei meiner Button steuerung nichts anfangen ;)
Könnte zwar noch ProcEntry.szExeFile; aktivieren wenn der FileName nil ist
aber wie schon gesagt was soll ich steuern über die Button mit der TaskLeiste.

Danke euch ;)
Denke das nutzt anderen auch etwas.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:49 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