Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Strings vergleichen (https://www.delphipraxis.net/137374-strings-vergleichen.html)

youuu 19. Jul 2009 21:11


Strings vergleichen
 
Hi,

ich vergleiche momentan Strings im VST so

Delphi-Quellcode:
Procedure TFormMain.SucheCallback(Sender: TBaseVirtualTree; Node: PVirtualNode; data: Pointer; var Abort: Boolean);
Begin
  Customer:= TCustomerDaten(VstCustomer.GetNodeData(Node)^);
  VstCustomer.IsVisible[Node]:= (EditSearchFast.Text = '') or AnsiStartsText(EditSearchFast.Text, Customer.company_name)>0);
End;
Funktioniert auch super, nur möchte ich das wenn

suchende String: Test
EditSuchfeld: st

Dann trotzdem der Eintrag gefunden wird und nicht nur wenn ich te eingebe.

Matze 19. Jul 2009 21:16

Re: Strings vergleichen
 
Hallo,

ich denke anstelle von AnsiStartsText kannst duDelphi-Referenz durchsuchenPos verwenden. Das Prüft, ob ein Teilstring in einem String enthalten ist.

Grüße, Matze

DeddyH 19. Jul 2009 21:17

Re: Strings vergleichen
 
Oder AnsiContainsText :zwinker:

youuu 19. Jul 2009 21:21

Re: Strings vergleichen
 
AnsiContainsText dann findet er gar nicht's mehr :/
Und bei pos ist es so, das es auf Groß und Kleinschreibung achtet oder irre ich mich?

DeddyH 19. Jul 2009 21:23

Re: Strings vergleichen
 
Da scheinst Du etwas falsch zu machen. Parameter verwechselt?

youuu 19. Jul 2009 21:26

Re: Strings vergleichen
 
Keine Treffer bei
Delphi-Quellcode:
Procedure TFormMain.SucheCallback(Sender: TBaseVirtualTree; Node: PVirtualNode; data: Pointer; var Abort: Boolean);
Begin
  Customer:= TCustomerDaten(VstCustomer.GetNodeData(Node)^);
  VstCustomer.IsVisible[Node]:= (EditSearchFast.Text = '') or AnsiContainsText(EditSearchFast.Text, Customer.company_name);
End;
Mit
Delphi-Quellcode:
Procedure TFormMain.SucheCallback(Sender: TBaseVirtualTree; Node: PVirtualNode; data: Pointer; var Abort: Boolean);
Begin
  Customer:= TCustomerDaten(VstCustomer.GetNodeData(Node)^);
  VstCustomer.IsVisible[Node]:= (EditSearchFast.Text = '') or AnsiStartsText(EditSearchFast.Text, Customer.company_name)>0);
End;
findet er es ja wenn ich den Anfangsbuchstaben eingebe, daher sollten Parameter stimmen.


Und so wird es aufgerufen

Delphi-Quellcode:
procedure TFormMain.EditSearchFastChange(Sender: TObject);
begin
  VstCustomer.IterateSubtree(nil, SucheCallback, nil)
end;

Matze 19. Jul 2009 21:28

Re: Strings vergleichen
 
Beide Funktionen müssen gehen. Und Pos achtet nicht auf Groß- und Kleinschreibung. Und selbst wenn das so wäre, könnte man sich mittels LowerString/UpperString (oder wie die Funktionen in Delphi heißen, vllt war's auch StrToUpper/StrToLower, wobei das glaub PHP war *g*) aushelfen.

Muetze1 19. Jul 2009 21:34

Re: Strings vergleichen
 
Zitat:

Zitat von Matze
Und Pos achtet nicht auf Groß- und Kleinschreibung.

Und wie er dies macht. Das er das nicht macht ist ein Gerücht welches die Delphi Hilfe über mehrere Ausgaben verbreitete...

youuu 19. Jul 2009 21:45

Re: Strings vergleichen
 
Zitat:

Zitat von Muetze1
Zitat:

Zitat von Matze
Und Pos achtet nicht auf Groß- und Kleinschreibung.

Und wie er dies macht. Das er das nicht macht ist ein Gerücht welches die Delphi Hilfe über mehrere Ausgaben verbreitete...

War das ernst oder höre ich Ironie? :)

DeddyH 19. Jul 2009 21:47

Re: Strings vergleichen
 
Das war Ernst, nach meiner Erfahrung ist Pos() case-sensitive.

youuu 19. Jul 2009 21:48

Re: Strings vergleichen
 
Habe es nun so gelöst.

Delphi-Quellcode:
(pos(AnsiUpperCase(EditSearchFast.Text), AnsiUpperCase(Customer.company_name))>0)

DeddyH 19. Jul 2009 21:50

Re: Strings vergleichen
 
Etwas Anderes tut AnsiContainsText aber auch nicht (zumindest im Ergebnis). Aber wenn es nun geht, ist ja alles gut :zwinker:

youuu 19. Jul 2009 21:51

Re: Strings vergleichen
 
Zitat:

Zitat von DeddyH
Etwas Anderes tut AnsiContainsText aber auch nicht (zumindest im Ergebnis). Aber wenn es nun geht, ist ja alles gut :zwinker:

Hatte mich auch gewundert das es nicht ging, da es ja einen Boolean Wert zurück gibt und normalerweise hätte funktionieren sollen.

Matze 19. Jul 2009 21:53

Re: Strings vergleichen
 
Zitat:

Zitat von Muetze1
Und wie er dies macht. Das er das nicht macht ist ein Gerücht welches die Delphi Hilfe über mehrere Ausgaben verbreitete...

Tatsache. :oops:
Aber mit dem Workaround würde es gehen, auch wenn das vom Code her vielleicht nicht ganz so schön ist.

semo 19. Jul 2009 22:18

Re: Strings vergleichen
 
Ich nutze auch vor der Verwendung von Pos() ein UpperCase() bzw. LowerCase:
Delphi-Quellcode:
Column := TVirtualStringTree(Sender).Header.Columns.GetFirstVisibleColumn();
while (Column <> InvalidColumn) do
begin
  NodeText := UpperCase(TVirtualStringTree(Sender).Text[Node, Column]);
  bFoundText := (Pos(SearchString, NodeText) > 0);

  if bFoundText then
    Break;
  Column := TVirtualStringTree(Sender).Header.Columns.GetNextVisibleColumn(column);
end;
Sender.IsVisible[Node] := bFoundText;
Und sollte man nicht auf die Verwendung der ANSI Funktionen hinsichtlich Delphi 2009 und Unicode Strings verzichten?

DeddyH 19. Jul 2009 22:23

Re: Strings vergleichen
 
Ich hab zwar kein D2009, aber dort heißen die Funktionen m.W.n. zwar noch so, aber sind unicodefähig. Falls das nicht stimmen sollte, bitte ich einen Kundigen um Berichtigung.

himitsu 19. Jul 2009 22:28

Re: Strings vergleichen
 
AnsiUpperCase ist in Delphi2009 nicht Ansi, sondern Unicode.

also kein Problen, aber dafür nur etwas verwirrend :angel2:

man kann auch WideUpperCase verwenden, aber dieses arbeitet mit WideString, wärend AnsiUpperCase in D2009 aus UnicodeString basiert.

semo 19. Jul 2009 22:34

Re: Strings vergleichen
 
Kleiner Nachtrag:
AnsiStrings.AnsiUpperCase --> AnsiUpperCase wandelt alle Zeichen im gegebenen AnsiString in Großbuchstaben um. Im Gegensatz zu UpperCase wird bei der Umwandlung die aktuelle Gebietseinstellung des Benutzers verwendet.

SysUtils.AnsiUpperCase --> AnsiUpperCase gibt eine Kopie des in S angegebenen Strings in einem groß geschriebenen String zurück. Bei der Konvertierung wird das aktuelle Gebietsschema berücksichtigt. Diese Funktion unterstützt Multibyte-Zeichensätze (MBCS).

DeddyH 19. Jul 2009 22:35

Re: Strings vergleichen
 
Da ist aber wieder "Ansi" im Namen :lol: (Spaß muss sein *g*)

himitsu 19. Jul 2009 23:14

Re: Strings vergleichen
 
http://www.delphipraxis.net/internal...t.php?t=149533
http://www.delphipraxis.net/internal...050060#1050060


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