Entwickler-Ecke
Sonstiges (Delphi) - In Memo nach String suchen
BigBen4ever - So 28.08.05 18:42
Titel: In Memo nach String suchen
Hallo.
Ich würde gerne in einem Memo nach einem String suchen.
Dieser String ist immer im Memo vorhanden, es geht also nicht um eine Abfrage, ob der String da ist, sondern ich möchte die Line (Zeile) angegeben haben, am besten in einem Edit Feld.
Meine kläglichen versuche:
Delphi-Quelltext
1:
| temppos:=pos('Erfahrung', memo1.lines); |
Ich habe also wie man sieht überhaupt keine Ahnung (leider) wie das gehen könnte. Wäre über sachlich Hilfe und wenn es nicht zu viel Mühe macht, auch gerne quelltext sehr dankbar
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt.
retnyg - So 28.08.05 18:52
Delphi-Quelltext
1: 2: 3: 4: 5:
| i:=0; p:=pos('Erfahrung', memo1.text); while memo1.text[p] <> #13 do begin inc(p); inc(i); end; dec(p,i); edit1.text := copy(memo1.text,p,i); |
alzaimar - So 28.08.05 20:30
Wieso nicht so?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Var iZeilenNr : Integer;
Begin For iZeilenNr :=0 to memo1.lines.count - 1 do If Pos ('Erfahrung',memo1.lines[iZeilenNr])<>0 then Begin Label1.Caption := Format ('Gefunden in Zeile %d, "%s",[iZeilenNr, memo1.lines[iZeilenNr] ]); break; End; ... End; |
Lannes - So 28.08.05 20:36
Hallo,
@retnyg
deine Procedur gibt den String plus den Rest der Zeile aus :gruebel:,
BigBen4ever will glaube ich die Line (Zeile) haben, also auch das was davor steht.
Die Zeile ermitteln:
wenn Memo.WordWrap = False: :arrow:
Delphi-Quelltext
1: 2: 3: 4:
| var Row : Integer; Row := SendMessage(Memo1.Handle, EM_LINEFROMCHAR,Pos('String_X', Memo1.Text), 0); Edit1.text := Memo1.Lines[Row]; |
wenn Memo.WordWrap = True: :arrow:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| var z : Integer; for z := 0 to Memo1.Lines.Count-1 do if Pos('String_X', Memo1.Lines[z]) <> 0 then begin Edit1.text := Memo1.Lines[z]; break; end; |
Nochmal zu
retnygs Procedur, mir ist aufgefallen das bei
größeren Texten (z.B. MSHTML_TLB.pas 1,8 MB) die Procedur sehr langsam wird.
Diese Möglichkeit ist da wesentlich schneller:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var p : Integer; s : String; begin p := Pos('String_X', Memo1.tText); s := Copy(memo1.text,p,Length(Memo1.Text)-p); Edit1.Text := Copy(s,1,Pos(#13,s)-1); |
//Edit: etwas zu spät, aber passt dazu
BigBen4ever - So 28.08.05 20:37
vielen dank der zweite code funktioniert, beim ersten hat er mir keine zeile ausgegeben sondern das wort an sich ..
trotzdem auch vielen lieben dank
Edit1.text := IntTostr(Row);
sollte es glaub ich heißen
dann gibt er die zeile aus, bei dem was da vorher stand, gibt er ebenfalls nur das wort aus also den string
Lannes - So 28.08.05 22:54
Hallo,
BigBen4ever hat folgendes geschrieben: |
...
Edit1.text := IntTostr(Row);
sollte es glaub ich heißen
dann gibt er die zeile aus, bei dem was da vorher stand, gibt er ebenfalls nur das wort aus also den string |
Ist eher eine Frage der Begriffsdefinition :wink:
Memo1.Lines[Row];gibt dir nicht das Wort oder den String aus, sondern die Zeile (Lines), also das was Du am Anfang des Treads geschrieben hast.
IntTostr(Row);gibt Dir den Zeilen-Index der Zeile aus in dem Dein gesuchtes Wort/String gefunden wird.
BigBen4ever - Mo 29.08.05 18:09
Hab nun leider trotzdem noch ein Problem:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.Button3Click(Sender: TObject); var g1:integer; t,c:string; izeilennr:integer;
begin
For iZeilenNr :=0 to memo1.lines.count - 1 do If Pos ('Gold ',memo1.lines[iZeilenNr])<>0 then begin goldedit.text:=memo1.Lines[iZeilenNr]; end; t:=goldedit.text; g1 := pos('Gold ', t); c:=( copy (t,g1+5,maxint-1) ); edit3.text:=c; end; |
Ich will c eigentlich als Integer Wert haben, allerdings steht im Memo folgendes:
'Gold 4291 '
also am Ende ein Leerzeichen, dieses hab ich versucht mit maxint-1 wegzukriegen, funktioniert aber nicht, also ich würde auch hier gerne wieder den Goldwert kopieren, kann mir bitte nochmal jemand helfen, komme da leider nicht weiter.
Also ähnlich wie bei dem Erfahrungsteil.
Vielen dank
Lannes - Mo 29.08.05 18:44
Hallo,
hab mal schnell was zusammengeschrieben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var i : Integer; t : String; begin t:=goldedit.text; i := StrToInt(Trim(Copy(t,Pos(' ',t)+1,maxint))); Showmessage(IntToStr(i)); |
BigBen4ever - Mi 31.08.05 20:11
"" ist kein gültiger integerwert, irgendwie funktioniert das nicht :(
Lannes - Mi 31.08.05 22:20
Hallo,
wo kommt der Fehler?
wann? bei welchem String?
wie sieht dein Code aus?
Mit Deinem hier geposteten String 'Gold 4291 ' läuft der Code auf jeden Fall ohne Fehler.
Nehme an das in goldedit.text was anderes steht, änder mal diese Zeile zum Testen:
Mein Code führt folgendes aus:
- erstes Leerzeichen suchen
- ab Leerzeichen+1 bis Ende den Reststring holen
- mit Trimm das letzte, oder falls vorhanden mehrere Leerzeichen entfernen
- den String in Integer umwandeln und der Variable i zuweisen
ist jetzt zum Beispiel
'Punkte: Gold 4921 '
in Goldedit.Text enthalten,
wird vor Gold getrennt. Das Ergebnis ist dann
'Gold 4921'
und erzeugt die Fehlermeldung bei der Konvertierung in einen Integer.
BigBen4ever - Do 01.09.05 17:25
der fehler muss bei diesem goledit.text gelegen haben, wieso ist für mich zwar nicht naxhvollziehbar aber wie folgt funktioniert es, vielen dank nochmal!!!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.Button3Click(Sender: TObject); var i : Integer; t : String; izeilennr:integer; begin For iZeilenNr :=0 to memo1.lines.count - 1 do If Pos ('Gold ',memo1.lines[iZeilenNr])<>0 then begin t:=memo1.Lines[iZeilenNr]; end; i := StrToInt(Trim(Copy(t,Pos(' ',t)+1,maxint))); Showmessage(IntToStr(i));
end; |
Moderiert von
raziel: Code- durch Delphi-Tags ersetzt.
Lannes - Fr 02.09.05 13:52
Hallo,
BigBen4ever hat folgendes geschrieben: |
| der fehler muss bei diesem goledit.text gelegen haben, wieso ist für mich zwar nicht naxhvollziehbar aber wie folgt funktioniert es, vielen dank nochmal!!! |
mögliche Fehlerursachen, entweder:
- keine Zeile mit 'Gold 1234' im Memo enthalten
- vor 'Gold 1234' ist noch ein Leerzeichen (' Gold 1234')
- hinter 'Gold 1234' befinden sich noch andere Zeichen ('Gold 1234 bla')
Kannst Du sicherstellen das die Zeile immer und entsprechend 'Gold 1234' enthalten ist?
Du solltest in deinem Code dafür noch Sicherheiten einbauen um Fehler abzufangen.
Hab Deinen Code mal etwas kommentiert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.Button3Click(Sender: TObject); var i : Integer; t : String; izeilennr:integer; begin For iZeilenNr :=0 to memo1.lines.count - 1 do If Pos ('Gold ',memo1.lines[iZeilenNr])<>0 then begin t:=memo1.Lines[iZeilenNr]; end; i := StrToInt(Trim(Copy(t,Pos(' ',t)+1,maxint))); Showmessage(IntToStr(i)); end; |
BigBen4ever - Fr 02.09.05 14:49
vielen dank für deine mühe
habe es entsprechend verbessert.
sollte jez gut laufen.
magst du vielleicht nochmal in meinen anderen thread gucken Internet->Webbrowser Seite1->Seite2 , irgendwie kann mir da keiner helfen :(
BigBen4ever - Sa 03.09.05 21:01
hey kannst du bitte nochmal in deinen alten webbrowser thread gucken lannes ..
BigBen4ever - Sa 03.09.05 21:49
Oh mist. Hab den Code ja immer mit dem vorgegebenen Wert da getestet, aber hab total vergessen, dass das auch in folgender Form vorkommt:
'Gold 12261 (45065) '
Kannst du mir vielleicht sagen wie ich den Code abändern muss damit er mir hier auch einen integer wert ausgibt. (die klammer einfach missachten)
also es geht um den wert vor der klammer
Lannes - Sa 03.09.05 23:22
Hallo,
BigBen4ever hat folgendes geschrieben: |
Oh mist. ..., dass das auch in folgender Form vorkommt:
'Gold 12261 (45065) '
Kannst du mir vielleicht sagen wie ich den Code abändern muss ... |
:evil: wenn Du immer nur die Code-Teile zusammenkopierst, ohne das Du versuchst sie zu verstehen, dann die Hinweise:
Lannes hat folgendes geschrieben: |
Hallo,
BigBen4ever hat folgendes geschrieben: | | der fehler muss bei diesem goledit.text gelegen haben, wieso ist für mich zwar nicht naxhvollziehbar aber wie folgt funktioniert es, vielen dank nochmal!!! | mögliche Fehlerursachen, entweder:
- keine Zeile mit 'Gold 1234' im Memo enthalten
- vor 'Gold 1234' ist noch ein Leerzeichen (' Gold 1234')
- hinter 'Gold 1234' befinden sich noch andere Zeichen ('Gold 1234 bla')
Kannst Du sicherstellen das die Zeile immer und entsprechend 'Gold 1234' enthalten ist?
Du solltest in deinem Code dafür noch Sicherheiten einbauen um Fehler abzufangen.
|
nicht durchliest bzw. beachtest wirst Du
immer wieder solche Probleme bekommen.
Nun wieder zu deiner Frage: Ja, ich kann Dir sagen wie, aber ohne Code:
- Zeile mit 'Gold ' suchen (siehe diesen Tread)
- Feststellen wo Gold in der Zeile steht(siehe diesen Tread)
- RestString hinter 'Gold ' mit
Copy holen (siehe diesen Tread)
- In diesem Reststring mit
Pos Leerzeichen suchen (siehe diesen Tread)
- Teilstring mit
Copy bis zum Leerzeichen heraustrennen (siehe diesen Tread)
Versuch das mal selbst zu programmieren, das hilft Dir glaube ich am meisten.
BigBen4ever - Sa 03.09.05 23:43
Ok du hast recht ...aber ich versteh diesen Copy-Befehl einfach nicht...
(Trim(Copy(t,Pos(' ',t)+1,maxint)));
Du hast mir erklärt wofür Trim steht. Nachvollziehbar.
Dann kommt copy, ok er kopiert...
Angabe von t für den String von dem wir kopieren wollen, soweit nachvollziehbar.
Dann die Position von der wir anfangen wollen zu kopieren aus dem String t + 1 weil wir ja kein Leerzeichen vor der Zahl haben wollen.
und dann hinter dem Komma die Position bis zu der wir kopieren wollen, das müsste ja dann:
Pos(' (',t) und da wir ' (' nicht haben wollen, -2 aber das funktioniert nicht, weißt du und da liegt mein Problem, was ist daran falsch, ich möchte es ja versuchen zu verstehen, aber ich erkenn da die logik einfach nicht.
BigBen4ever - Sa 03.09.05 23:52
Ok ich glaub das problem lag dabei dass ich das in einer neuen variable machen musste:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.Button1Click(Sender: TObject); var t:string; i:string; g,h,j:string; begin t:='Gold 12261 (45065) '; i:=(Trim(Copy(t,Pos(' ',t)+1,maxint))); g:=copy(i,1,Pos('(',i)-2); edit1.text:=g; end; |
Ist vielleicht nicht das schönste, aber jez funktioniert es.
Dein hinweis mit den möglichen fehlern war übrigens ne gute sache und was ich sagte dass ich dies berücksichtigt hab war auch nicht nur daher gesagt:
- keine Zeile mit 'Gold 1234' im Memo enthalten
- vor 'Gold 1234' ist noch ein Leerzeichen (' Gold 1234')
- hinter 'Gold 1234' befinden sich noch andere Zeichen ('Gold 1234 bla')
Ich bekam so mit meinem code echt fehlermeldungen
'' kein gültiger Integerwert, den es war keine Zeile mit 'Gold ...' enthalten
habe dann einfach eine if abfrage gemacht:
goldlabel.caption:=inttostr(pos('Gold ',memo1.text));
if strtoint(goldlabel.caption) <> 0 then
begin
...
end;
vor Gold steht definitiv nichts, also brauchte ich den fall nicht zu berücksichtigen ..und ich dachte hinter Gold auch nicht, deswegen hatte ich da auch nichts weitergemacht, aber naja ..jez sollten wirklich alle fehler ausgemergelt sein..
VIELEN VIELEN DANK!
Moderiert von
Tino: Code- durch Delphi-Tags ersetzt.
GTA-Place - So 04.09.05 07:07
Und etwas vereinfacht sieht das dann so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.Button1Click(Sender: TObject); var t, i: String; begin t := 'Gold 12261 (45065) '; i := Trim(Copy(t, Pos(' ', t) + 1, Pos('(', t) - 2)); Edit1.Text := i; end; |
Das hier musst du allerdings auch nicht so Kompliziert machen:
Delphi-Quelltext
1: 2: 3: 4: 5:
| GoldLabel.Caption := IntToStr(Pos('Gold ', Memo1.Text)); if StrToInt(GoldLabel.Caption) <> 0 then begin end; |
->
Delphi-Quelltext
1: 2: 3: 4:
| if Pos('Gold ', Memo1.Text) > 0 then begin end; |
EDIT: '(' -> ')'
Lannes - So 04.09.05 13:27
Hallo
@GTA-Place
dein Code prüft auf ')':
i := Trim(Copy(t, Pos(' ', t) + 1, Pos(')', t) - 2));und gibt daher '12261 (45065)' aus.
BigBen4ever möchte '12261' als Ergebnis haben :arrow:
BigBen4ever hat folgendes geschrieben: |
... auch in folgender Form vorkommt:
'Gold 12261 (45065) '
Kannst du mir vielleicht sagen wie ich den Code abändern muss damit er mir hier auch einen integer wert ausgibt. (die klammer einfach missachten)
also es geht um den wert vor der klammer |
und genau das bewirkt sein zuletzt geposteter Code.
Allerdings könnte er darin noch
Trim weglassen,
ist wegen Codeumstellungen nicht mehr erforderlich.
GTA-Place - So 04.09.05 16:22
Mein Source war eigentlich korrekt, hatte nur statt '(' -> ')' geschrieben.
Hab es oben verbessert.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!