![]() |
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 |
Re: string durchsuchen
|
Re: string durchsuchen
Je nachdem, was genau mit "Durchsuchen" gemeint ist, könnten auch AnsiContainsStr oder AnsiContainsText aus StrUtils in Frage kommen.
|
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: ![]() (unten, etwas geändert) |
Re: [GELÖST] string durchsuchen
Zitat:
|
Re: [GELÖST] string durchsuchen
pech für den nutzer, der muss dann halt richtig eingeben :D
|
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:
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. ;)
if Pos('hallo', AnsiLowerString(S)) > 0 then
|
Re: [GELÖST] string durchsuchen
AnsiLowerString kennt mein delphi (7) nicht :gruebel:
|
Re: [GELÖST] string durchsuchen
Matze meinte AnsiLowerCase ;)
[edit] "Turbo-Opa" war wieder schneller :lol: [/edit] |
Re: [GELÖST] string durchsuchen
Ach ne, es heißt glaub
![]() 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. |
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 |
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)? |
Re: [GELÖST] string durchsuchen
Welche Schleife? Zeig mal mehr Code.
|
Re: [GELÖST] string durchsuchen
Delphi-Quellcode:
das erste macht er, beim zweiten hört er auf
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; |
Re: [GELÖST] string durchsuchen
Dann lass die breaks doch einfach weg.
|
Re: [GELÖST] string durchsuchen
Zitat:
|
Re: [GELÖST] string durchsuchen
der soll ja die nächste zeile vom richedit nehmen.
|
Re: [GELÖST] string durchsuchen
Kurz was dazu:
Zitat:
Es ginge natürlich auch folgendes:
Delphi-Quellcode:
Das nur als Hinweis: Also immer versuchen zu verstehen, was man in sein Programm übernimmt. ;)
if Pos('HALLO', AnsiUpperCase(S)) > 0 then
|
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; |
Re: [GELÖST] string durchsuchen
Zitat:
wenn ich das in das richedit schreibe: Zitat:
mit dem Quellcode:
Delphi-Quellcode:
erscheint alles auf dem button, aber dir buttons 3+4 werden nie gedrückt
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; |
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] |
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:
Edit: Der Turbo-Opa macht mich fertig. :mrgreen:
if Pos('schritt', AnsiLowerCase(RichEdit1.Lines[i])) > 0 then
begin Button1.Click; Sleep(200); end; |
Re: [GELÖST] string durchsuchen
Zitat:
[Edit] Appli"c"ation[/Edit] |
Re: [GELÖST] string durchsuchen
Sachma Kaki, gehört da vielleicht noch Text dazu? :gruebel:
|
Re: [GELÖST] string durchsuchen
Lies die Kommentare im Code. ;) Zugegeben, ich war auch erst irritiert, da alles zitiert wurde.
|
Re: [GELÖST] string durchsuchen
Zitat:
@matze: guter hinweis, hätt ich glatt übersehen :thumb: @Der.Kaktus: Zitat:
und wie lange wartet der bei "Application.ProcessMessages;" ? |
Re: [GELÖST] string durchsuchen
Zitat:
|
Re: [GELÖST] string durchsuchen
Oh Mann, dabei hatte ich das beim ersten Mal sogar bemerkt :wall:
|
Re: [GELÖST] string durchsuchen
Zitat:
|
Re: [GELÖST] string durchsuchen
Zitat:
|
Re: [GELÖST] string durchsuchen
Zitat:
|
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; |
Re: [GELÖST] string durchsuchen
OK, dann auf Nummer Sicher:
Delphi-Quellcode:
[edit] StringEnthalten muss natürlich eine Funktion sein :angel2: [/edit]
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; |
Re: [GELÖST] string durchsuchen
Na das iss doch was :thumb:
|
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; |
Re: [GELÖST] string durchsuchen
Was meinst Du mit "so herum"?
|
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? |
Re: [GELÖST] string durchsuchen
Zitat:
---- 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... |
Re: [GELÖST] string durchsuchen
Wenn ich Dich richtig verstanden habe, meinst Du
![]() |
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. |
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