Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi string durchsuchen und tipps zu while + for-schleifen (https://www.delphipraxis.net/141239-string-durchsuchen-und-tipps-zu-while-schleifen.html)

delphi-n 5. Okt 2009 17:10


string durchsuchen und tipps zu while + for-schleifen
 
Hi!

Wie durchsucht man einen String (eig. eine Linie aus einem Richedit) nach z.B. 'Hallo'?

Vielen Dank

Matze 5. Okt 2009 17:12

Re: string durchsuchen
 
Hallo,

das geht mit Delphi-Referenz durchsuchenPos bzw. Delphi-Referenz durchsuchenPosEx.

Grüße, Matze

DeddyH 5. Okt 2009 17:24

Re: string durchsuchen
 
Je nachdem, was genau mit "Durchsuchen" gemeint ist, könnten auch AnsiContainsStr oder AnsiContainsText aus StrUtils in Frage kommen.

delphi-n 5. Okt 2009 17:40

Re: string durchsuchen
 
danke :thumb:


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var S: string;
begin
  S := Edit1.Text;
  { Convert spaces to zeros }
 if Pos('hallo', S) > 0 then
 Button1.Visible:=false;
end;

das klappt :coder:


http://docs.embarcadero.com/products...yteString.html

(unten, etwas geändert)

DeddyH 5. Okt 2009 17:42

Re: [GELÖST] string durchsuchen
 
Zitat:

Pos is case-sensitive.
Wenn Dich das nicht stört oder gar gewollt ist, isses ja in Ordnung.

delphi-n 5. Okt 2009 17:58

Re: [GELÖST] string durchsuchen
 
pech für den nutzer, der muss dann halt richtig eingeben :D

Matze 5. Okt 2009 18:05

Re: [GELÖST] string durchsuchen
 
Irgendwo gab's mal einen Fehler in der OH. Ich kann mir seitdem nicht merken, ob Pos nun case-sensitiv ist oder nicht. Falls es das sein sollte, wie Deddy geschrieben hat, kannst du das so auch umgehen:

Delphi-Quellcode:
if Pos('hallo', AnsiLowerString(S)) > 0 then
Und eine der wichtigsten Regeln beim Programmieren: Der Anwender ist ein DAU (Dümmster anzunehmender User) bzw. kann einer sein. Stelle dir das vor und versuche die Programme auch entsprechend zu schreiben. Sonst hast du u.U. nur Ärger. ;)

delphi-n 5. Okt 2009 18:07

Re: [GELÖST] string durchsuchen
 
AnsiLowerString kennt mein delphi (7) nicht :gruebel:

DeddyH 5. Okt 2009 18:08

Re: [GELÖST] string durchsuchen
 
Matze meinte AnsiLowerCase ;)

[edit] "Turbo-Opa" war wieder schneller :lol: [/edit]

Matze 5. Okt 2009 18:08

Re: [GELÖST] string durchsuchen
 
Ach ne, es heißt glaub Delphi-Referenz durchsuchenAnsiLowerCase, sorry.

Edit: Durch PHP & Co kommt man auch ganz durcheinander, da heißt es "StrToLower" oder "LowerString" (oder war das C/C++?) oder wie auch immer. In mySQL heißt es "Lower". Da blickt doch kein Mensch mehr durch. :mrgreen:
Und Deddy war schneller.

delphi-n 5. Okt 2009 18:26

Re: [GELÖST] string durchsuchen
 
danke, funktioniert perfekt :thumb:

[edit]:

in

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var S: string;
begin
  S := Edit1.Text;
if Pos('hallo', AnsiLowerString(S)) > 0 then
Button1.Visible:=false;
end;

MUSS der zu suchende text (hier hallo) KLEIN geschrieben werden, egal wie der Nutzer ihn dann schreibt, sonst klappt es nicht!

Ist mir beim Testen nur so aufgefallen

delphi-n 5. Okt 2009 18:42

Re: [GELÖST] string durchsuchen
 
jetzt hab ich

Delphi-Quellcode:
if Pos('schritt', AnsiLowerCase(S)) > 0 then
begin
 Button1.Click;
 i:=i+1;
 exit;
 end;
if Pos('hallo', AnsiLowerCase(S)) > 0 then
begin
 Button3.Click;
 i:=i+1;
 break;
 end;

was muss ich anstatt break oder exit einsetzten, dass der zurück zur while schleife geht (also nicht aussteigt)?

DeddyH 5. Okt 2009 18:48

Re: [GELÖST] string durchsuchen
 
Welche Schleife? Zeig mal mehr Code.

delphi-n 5. Okt 2009 18:51

Re: [GELÖST] string durchsuchen
 
Delphi-Quellcode:
procedure TForm2.Button5Click(Sender: TObject);
var i:integer;
s:string;
begin
i:=0;

while i<RichEdit1.Lines.Count do
begin
   sleep(100);
  S := RichEdit1.Lines[i];
  Button5.Caption:=S;

if Pos('schritt', AnsiLowerCase(S)) > 0 then
begin
 Button1.Click;
 i:=i+1;
 break;
 end;
if Pos('hallo', AnsiLowerCase(S)) > 0 then
begin
 Button3.Click;
 i:=i+1;
 break;
 end;




end;
end;
das erste macht er, beim zweiten hört er auf

DeddyH 5. Okt 2009 18:54

Re: [GELÖST] string durchsuchen
 
Dann lass die breaks doch einfach weg.

Der.Kaktus 5. Okt 2009 18:55

Re: [GELÖST] string durchsuchen
 
Zitat:

Zitat von delphi-n
Delphi-Quellcode:
procedure TForm2.Button5Click(Sender: TObject);
var i:integer;
s:string;
begin
i:=0;

while i<RichEdit1.Lines.Count do
begin
   sleep(100);//<<-----------------------------------------ersetze es mit Application.Processmessages....aber das brauchste nur, wenn sehr grosses Richedit ist ;-)
  S := RichEdit1.Lines[i];
  Button5.Caption:=S;// <<----was wird das?..zum Schnelllesen? ..musste aber Button5.Update evtl. einfuegen..sonst siehst Du nix!

if Pos('schritt', AnsiLowerCase(S)) > 0 then
begin
 Button1.Click;
 i:=i+1;
 break;
 end;
if Pos('hallo', AnsiLowerCase(S)) > 0 then
begin
 Button3.Click;
 i:=i+1;
 break;
 end;




end;
end;
das erste macht er, beim zweiten hört er auf


delphi-n 5. Okt 2009 19:01

Re: [GELÖST] string durchsuchen
 
der soll ja die nächste zeile vom richedit nehmen.

Matze 5. Okt 2009 19:06

Re: [GELÖST] string durchsuchen
 
Kurz was dazu:
Zitat:

Zitat von delphi-n
MUSS der zu suchende text (hier hallo) KLEIN geschrieben werden, egal wie der Nutzer ihn dann schreibt, sonst klappt es nicht!

Ist mir beim Testen nur so aufgefallen

Versuche immer den Code zu verstehen. Der String, mit dem verglichen wird, wird durch "AnsiLowerCase" klein geschrieben. Somit muss der Suchstring ebenfalls klein geschrieben werden.
Es ginge natürlich auch folgendes:

Delphi-Quellcode:
if Pos('HALLO', AnsiUpperCase(S)) > 0 then
Das nur als Hinweis: Also immer versuchen zu verstehen, was man in sein Programm übernimmt. ;)

DeddyH 5. Okt 2009 19:08

Re: [GELÖST] string durchsuchen
 
Macht er doch. Aber Du kannst das auch mit einer for-Schleife lösen.
Delphi-Quellcode:
procedure TForm2.Button5Click(Sender: TObject);
var i:integer;
begin
  for i := 0 to RichEdit1.Lines.Count - 1 do
    begin
      //die folgenden beiden Zeilen sind eigentlich sinnfrei,
      //weil das so schnell gehen dürfte, dass man nichts erkennen kann
      Button5.Caption := RichEdit1.Lines[i];
      Application.ProcessMessages;
      if Pos('schritt', AnsiLowerCase(RichEdit1.Lines[i])) > 0 then
        Button1.Click
      else if Pos('hallo', AnsiLowerCase(RichEdit1.Lines[i])) > 0 then
        Button3.Click;
    end;
end;

delphi-n 5. Okt 2009 19:18

Re: [GELÖST] string durchsuchen
 
Zitat:

Der String, mit dem verglichen wird, wird durch "AnsiLowerCase" klein geschrieben. Somit muss der Suchstring ebenfalls klein geschrieben werden.
danke, wieder was gelernt :thumb:


wenn ich das in das richedit schreibe:

Zitat:

schritt
Schritt
Linksdrehen
schritt
Rechtsdrehen
Schritt

mit dem Quellcode:

Delphi-Quellcode:
procedure TForm2.Button5Click(Sender: TObject);
var i:integer;
begin
  for i := 0 to RichEdit1.Lines.Count - 1 do
    begin
     
      Button5.Caption := RichEdit1.Lines[i];
      Application.ProcessMessages;
      if Pos('schritt', AnsiLowerCase(RichEdit1.Lines[i])) > 0 then
        Button1.Click ;
        sleep(200);
       if Pos('Linksdrehen', AnsiLowerCase(RichEdit1.Lines[i])) > 0 then
        Button3.Click;
         sleep(200);
       if Pos('Rechtsdrehen', AnsiLowerCase(RichEdit1.Lines[i])) > 0 then
        Button4.Click;
         sleep(200);
    end;
end;
erscheint alles auf dem button, aber dir buttons 3+4 werden nie gedrückt

DeddyH 5. Okt 2009 19:21

Re: [GELÖST] string durchsuchen
 
Hast Du mal einen Haltepunkt gesetzt und bist anschließend durchgesteppt? Übrigens wird in Deinem Code jedes sleep ausgeführt (also insgesamt 3 mal), ist das Absicht?

[edit] Matze, Du bist zu langsam heute :lol: [/edit]

Matze 5. Okt 2009 19:22

Re: [GELÖST] string durchsuchen
 
Ein Hinweis, der nicht zur Frage gehört:

Die Sleep-Aufrufe werden immer alle ausgeführt. Wenn du mehrere Anweisungen einem if zuordnen möchtest, musst du das so machen:

Delphi-Quellcode:
if Pos('schritt', AnsiLowerCase(RichEdit1.Lines[i])) > 0 then
begin
  Button1.Click;
  Sleep(200);
end;
Edit: Der Turbo-Opa macht mich fertig. :mrgreen:

Der.Kaktus 5. Okt 2009 19:23

Re: [GELÖST] string durchsuchen
 
Zitat:

Zitat von delphi-n
Zitat:

Der String, mit dem verglichen wird, wird durch "AnsiLowerCase" klein geschrieben. Somit muss der Suchstring ebenfalls klein geschrieben werden.
danke, wieder was gelernt :thumb:


wenn ich das in das richedit schreibe:

Zitat:

schritt
Schritt
Linksdrehen
schritt
Rechtsdrehen
Schritt

mit dem Quellcode:

Delphi-Quellcode:
procedure TForm2.Button5Click(Sender: TObject);
var i:integer;
begin
  for i := 0 to RichEdit1.Lines.Count - 1 do
    begin
     
      Button5.Caption := RichEdit1.Lines[i];
      Application.ProcessMessages;
      if Pos('schritt', AnsiLowerCase(RichEdit1.Lines[i])) > 0 then//<----------------ist OK
        Button1.Click ;
        sleep(200); //auch Application.Processmessages nehmen!
       if Pos('Linksdrehen', AnsiLowerCase(RichEdit1.Lines[i])) > 0 then //<--Ansilower heisst..alles klein..dein Wert ist aber "L"inksdrehen..statt "linksdrehen"
        Button3.Click;
         sleep(200);//auch Application.Processmessages nehmen!
       if Pos('Rechtsdrehen', AnsiLowerCase(RichEdit1.Lines[i])) > 0 then // wie bei Linksdrehen..nur eben Rechts
        Button4.Click;
         sleep(200);//auch Application.Processmessages nehmen!
    end;
end;
erscheint alles auf dem button, aber dir buttons 3+4 werden nie gedrückt


[Edit] Appli"c"ation[/Edit]

DeddyH 5. Okt 2009 19:24

Re: [GELÖST] string durchsuchen
 
Sachma Kaki, gehört da vielleicht noch Text dazu? :gruebel:

Matze 5. Okt 2009 19:25

Re: [GELÖST] string durchsuchen
 
Lies die Kommentare im Code. ;) Zugegeben, ich war auch erst irritiert, da alles zitiert wurde.

delphi-n 5. Okt 2009 19:27

Re: [GELÖST] string durchsuchen
 
Zitat:

Übrigens wird in Deinem Code jedes sleep ausgeführt (also insgesamt 3 mal), ist das Absicht?
ja, der soll nicht alles auf einmal machen; man soll auf dem Button folgen können

@matze: guter hinweis, hätt ich glatt übersehen :thumb:


@Der.Kaktus:

Zitat:

<--Ansilower heisst..alles klein..dein Wert ist aber "L"inksdrehen..statt "linksdrehen"
es wird auch immer später, :vernupft:

und wie lange wartet der bei "Application.ProcessMessages;" ?

Der.Kaktus 5. Okt 2009 19:27

Re: [GELÖST] string durchsuchen
 
Zitat:

Zitat von DeddyH
Sachma Kaki, gehört da vielleicht noch Text dazu? :gruebel:

Text iss gruen :-D :cheers: ...[OT] Sorry..da fiel mir nix weiter ein ;-) [/OT]

DeddyH 5. Okt 2009 19:27

Re: [GELÖST] string durchsuchen
 
Oh Mann, dabei hatte ich das beim ersten Mal sogar bemerkt :wall:

Der.Kaktus 5. Okt 2009 19:29

Re: [GELÖST] string durchsuchen
 
Zitat:

Zitat von delphi-n
Zitat:

Übrigens wird in Deinem Code jedes sleep ausgeführt (also insgesamt 3 mal), ist das Absicht?

und wie lange wartet der bei "Application.ProcessMessages;" ?

warten tut der nicht..er gibt dem System Zeit..andere Befehlen(von anderen Programmen ) abzuarbeiten...wenn Du warten willst?!! dann natuerlich sleep(xxx)..aber glaube ich nicht.

Matze 5. Okt 2009 19:30

Re: [GELÖST] string durchsuchen
 
Zitat:

Zitat von delphi-n
und wie lange wartet der bei "Application.ProcessMessages;" ?

Sekundenbruchteile. ;) Du solltest es ausführen, damit du siehst, was das Programm macht. Sonst läuft es durch und du sieht nicht "live", was nach den jeweiligen Aufrufen in der Schleife passiert.

Der.Kaktus 5. Okt 2009 19:30

Re: [GELÖST] string durchsuchen
 
Zitat:

Zitat von DeddyH
Oh Mann, dabei hatte ich das beim ersten Mal sogar bemerkt :wall:

tut das net weh? :duck:

delphi-n 5. Okt 2009 19:32

Re: [GELÖST] string durchsuchen
 
also so?

Delphi-Quellcode:
procedure TForm2.Button5Click(Sender: TObject);
var i:integer;
begin
  for i := 0 to RichEdit1.Lines.Count - 1 do
    begin
     

      Button5.Caption := RichEdit1.Lines[i];
      Application.ProcessMessages;
      if Pos('schritt', AnsiLowerCase(RichEdit1.Lines[i])) > 0 then
         begin
        Button1.Click ;
          Application.ProcessMessages;
        sleep(200);
        end;
       if Pos('linksdrehen', AnsiLowerCase(RichEdit1.Lines[i])) > 0 then
              begin
        Button3.Click;
         Application.ProcessMessages;
         sleep(200);
         end;
       if Pos('rechtsdrehen', AnsiLowerCase(RichEdit1.Lines[i])) > 0 then
           begin
        Button4.Click;
           Application.ProcessMessages;
         sleep(200);
         end;
    end;
end;

DeddyH 5. Okt 2009 19:35

Re: [GELÖST] string durchsuchen
 
OK, dann auf Nummer Sicher:
Delphi-Quellcode:
procedure TForm2.Button5Click(Sender: TObject);
var i:integer;

  function StringEnthalten(const SubStr, Str: string): Boolean;
  begin
    Result := Pos(AnsiLowerCase(SubStr), AnsiLowerCase(Str)) > 0;
  end;

begin
  for i := 0 to RichEdit1.Lines.Count - 1 do
    begin    
      Button5.Caption := RichEdit1.Lines[i];
      Application.ProcessMessages;
      if StringEnthalten('schritt',RichEdit1.Lines[i]) then
        Button1.Click
      else if StringEnthalten('Linksdrehen', RichEdit1.Lines[i]) then
        Button3.Click
      else if StringEnthalten('Rechtsdrehen', RichEdit1.Lines[i]) then
        Button4.Click;
      sleep(600); //auf jeden Fall Zeit zum Gucken geben
    end;
end;
[edit] StringEnthalten muss natürlich eine Funktion sein :angel2: [/edit]

Der.Kaktus 5. Okt 2009 19:36

Re: [GELÖST] string durchsuchen
 
Na das iss doch was :thumb:

delphi-n 5. Okt 2009 19:43

Re: [GELÖST] string durchsuchen
 
so herum klappts:

Delphi-Quellcode:
  function StringEnthalten(const SubStr, Str: string): Boolean;
  begin
    Result := Pos(AnsiLowerCase(SubStr), AnsiLowerCase(Str)) > 0;
  end;

procedure TForm2.Button5Click(Sender: TObject);
var i:integer;
begin





  for i := 0 to RichEdit1.Lines.Count - 1 do
    begin

      Button5.Caption := RichEdit1.Lines[i];
      Application.ProcessMessages;
      if StringEnthalten('schritt',RichEdit1.Lines[i]) then
        Button1.Click
      else if StringEnthalten('linksdrehen', RichEdit1.Lines[i]) then
        Button3.Click
      else if StringEnthalten('rechtsdrehen', RichEdit1.Lines[i]) then
        Button4.Click
      else if StringEnthalten('umdrehen', RichEdit1.Lines[i]) then
         begin
        Button4.Click;
        Button4.Click;
        end;

    sleep(200);

    end;
end;

DeddyH 5. Okt 2009 19:46

Re: [GELÖST] string durchsuchen
 
Was meinst Du mit "so herum"?

Matze 5. Okt 2009 19:49

Re: [GELÖST] string durchsuchen
 
Die Funktion müsste auch "andersrum" also im Deklarationsteil der Funktion Prozedur funktionieren.
Und nun musst du die Strings nicht mehr alle klein schreiben. Es schadet natürlich auch nicht, aber Deddy hat die Funktion so umgeschrieben, dass beide Parameter "verkleinert" werden.

Welcher Fehler kam denn bzw. was ging nicht?

delphi-n 5. Okt 2009 20:05

Re: [GELÖST] string durchsuchen
 
Zitat:

Welcher Fehler kam denn bzw. was ging nicht?
ups, ich hatte es nicht in den Deklarationsteil geschrieben. sry, mein Fehler. :wall:



----

aber wie mache ich das, wenn ich wie bei "while" eine "solange"-schleife einbauen will?



Also wenn er "solange" findet (soll so ne art mini-programmier-sprache werden: solange xxx tue ...*solange),
soll er prüfen, ob das was dahinter steht wahr ist (klar) und dann weiter machen und wieder zurückspringen (alles soweit klar).

wenn aber es nicht wahr ist, muss er ja zum nächsten *solange gehen, ohne die for schleife neu zu beginnen, da das darin dann ja nicht ausgeführt werden soll.

Ich dachte erst daran, das "i:=i+1;" hinter die solange-abfrage zu setzten und zu suchen, also den
"else if StringEnthalten('xxx', RichEdit1.Lines[i]) then xxx"-Block nicht zu verlassen.

Aber i:=i+1; geht bei for ja nicht...

DeddyH 5. Okt 2009 20:07

Re: [GELÖST] string durchsuchen
 
Wenn ich Dich richtig verstanden habe, meinst Du Delphi-Referenz durchsuchencontinue.

delphi-n 5. Okt 2009 20:16

Re: [GELÖST] string durchsuchen
 
wo sollte ich das hinsetzen?

P.S.: Eig. könnte ich aus der for-schleife auch wieder eine While-Schleife machen, dann gings


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:17 Uhr.
Seite 1 von 2  1 2      

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