![]() |
In einer Memo suchen?
Hallo, wie kann ich über ein Editfeld in einer
Memo suchen und die Zeile makieren wo das Wort ist? |
Re: In einer Memo suchen?
Hi citybreaker,
hab hier ne sucfunktion gefunden! Kannst dir die Funktion ja umschreiben! musst vorher nur ne FindDialog Komponente aufs Formular ziehen!
Delphi-Quellcode:
mfG
procedure TForm1.FindDialogFind(Sender: TObject);
var Found: LongInt; StartPos, ToEnd: integer; begin with RichEdit1 do // hier dann anderen Namen einsetzen! begin if SelLength <> 0 then StartPos := SelStart + SelLength else StartPos := 0; ToEnd := Length(Text) - StartPos; Found := FindText(FindDialog.FindText, StartPos, ToEnd, [stMatchCase]); if Found <> -1 then begin SetFocus; // FoundAt := Found; SelStart := Found; SelLength := Length(FindDialog.FindText); end else Application.Messagebox(Pchar('Suchstring "'+FindDialog.FindText+'" nicht gefunden'),'Information',64); end; end; mirage228 |
Re: In einer Memo suchen?
Moin Citybreaker,
Stichworte hierfür: pos, SelStart, SelLength und, besonders wichtig und die Zeile herauszubekommen: ![]() @Mirage: TMemo kennt allerdings FindText nicht. |
Re: In einer Memo suchen?
Zitat:
mfG mirage228 |
Re: In einer Memo suchen?
Zitat:
Da ist ja nur beitrag und einandere wo der Code nciht klappt. Hilft mir nicht wirklich. :( |
Re: In einer Memo suchen?
Moin Citybreaker,
:oops: Sorry. Ist wohl noch zu früh :? :mrgreen: Also noch einmal von Vorne, diesmal ausführlich (Strafe muss sein ;-)):
Delphi-Quellcode:
Direkt hier reingeschrieben, also ungetestet, sollte aber richtig sein.
var
iPos : integer; iLine : integer; begin // Wo befindet sich der gesuchte String? iPos := ('SuchString',Memo1.Text); // Nichts gefunden, fertig if iPos = 0 then exit; // Zeile in der sich die gesuchte Position befindet // (-1, da der Zeichenindex 0 basiert ist) iLine := SendMessage(Memo1.Handle,EM_LINEFROMCHAR,iPos-1,0); // Zeichenposition des ersten Zeichens dieser Zeile // (Diesmal nicht -1, da EM_LINEFROMCHAR schon einen 0 basierten Wert liefert) Memo1.SelStart := SendMessage(Memo1.Handle,EM_LINEINDEX,iLine,0); // Zeile markieren Memo1.SelLength := length(Memo1.Lines[iLine]); end; |
Re: In einer Memo suchen?
Klappt noch nicht so richtig.
Ich hab jetzt folgendes gemacht:
Code:
Es kommt eine Fehlermeldung
// Wo befindet sich der gesuchte String?
iPos := (Edit1.Text, 'Memo1.Text'); ')' erwartet aber ',' gefunden. Dann hab ich
Code:
ausprobiert und es kommt wieder:
// Wo befindet sich der gesuchte String?
iPos := ('Edit1.Text', 'Memo1.Text'); Es kommt eine Fehlermeldung ')' erwartet aber ',' gefunden. |
Re: In einer Memo suchen?
Moin Citybreaker,
Tippfehler :wall:
Code:
die Parameter von pos sind dann hoffentlich klar.
iPos := [color=red]pos([/color]...
|
Re: In einer Memo suchen?
Ja die Parameter sind klar. Es kommt auch keine Fehlermeldung
mehr. Ich hab jetzt z.B. in der Memo stehen: Ich bin Alex und bin 14 Jahre alt. Wenn ich jetzt alt ins Edit eingebe und auf den Button klicke passiert nix. |
Re: In einer Memo suchen?
Hi Citybreaker,
du musst Edit1.Text und Memo1.Text nicht in Hochkommas, setzen! Zitat:
mirage228 |
Re: In einer Memo suchen?
Moin Citybreaker,
ach ja, und nicht zu vergessen: Die Eigenschaft HideSelection des Memo sollte auf false stehen. |
Re: In einer Memo suchen?
Hochkommas sind weg und es passiert trotzdem nichts.
--- Edit --- Jetzt gehts. Kann man auch nur das Suchwort makieren lassen. :-D |
Re: In einer Memo suchen?
Zitat:
Hai citybreaker, das sollte gehen wenn Du
Code:
durch
Memo1.SelLength := length(Memo1.Lines[iLine]);
Code:
ersetzt.
Memo1.SelLength := length(Edit1.Text);
|
Re: In einer Memo suchen?
Zitat:
Ich muss jetzt nochmal ne Frage stellen. Wie klappt das mit einer SynMemo? *bitte nicht hauhen* :duck: Da gibts nähmlich sellenght nicht. |
Re: In einer Memo suchen?
Moin Sharky,
dann geht's noch viel kürzer, weil man ja nicht erst die Zeile und deren Anfang ermitteln muss
Delphi-Quellcode:
@Citybreaker:
iPos := pos(Edit1.Text,Memo1.Text);
if iPos = 0 then exit; Memo1.SelStart := iPos-1; Memo1.SelLength := length(Edit1.Text); SynMemo kennt aber SelEnd, und daraus kann man da ja die Länge berechnen.
Delphi-Quellcode:
iPos := pos(Edit1.Text,SynMemo1.Text);
if iPos = 0 then exit; SynMemo1.SelStart := iPos-1; SynMemo1.SelEnd := SynMemo1.SelStart+length(Edit1.Text)-1; |
Re: In einer Memo suchen?
Zitat:
alex suche wird nur ale makiert. |
Re: In einer Memo suchen?
Moin Citybreaker,
Zitat:
Wie hast Du's denn gemacht? |
Re: In einer Memo suchen?
Ich habs folgendermaßen gemacht.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var iPos : integer; iLine : integer; begin iPos := pos(Edit1.Text, SynMemo.Text); if iPos = 0 then exit; SynMemo.SelStart := iPos-1; SynMemo.SelEnd := SynMemo.SelStart+length(Edit1.Text)-1; end; |
Re: In einer Memo suchen?
Moin Citybreaker,
komisch. Das funktioniert ja rein rechnerisch schon Problemlos. Hast Du vielleicht im Edit1.Text noch ein Blank vor dem Alex stehen gehabt? |
Re: In einer Memo suchen?
Nein, aber was mir aufgefallen ist.
Bei alex hat er ale makiert, wenn ich ale gesucht hab hat er al makiert. Bei anderen wörtern genau so immer einen buchstabenweniger. |
Re: In einer Memo suchen?
Hai,
warum ist hier denn das -1?
Delphi-Quellcode:
Ist doch falsch?!
SynMemo1.SelEnd := SynMemo1.SelStart+length(Edit1.Text)-1;
|
Re: In einer Memo suchen?
Moin Sharky,
nein, ist nicht falsch, da ja hier der Endpunkt der Markierung berechnet wird, nicht die Länge. Das Prinzip ist das gleiche, als hätte man einen Startoffset, an dem man etwas speichert. Um jetzt die nächste freie Position zu berechnen, addiert man auf den StartOffset die Länge dessen, was man gespeichert hat drauf. Da hier aber nicht die nächste freie Stelle benötigt wird, sondern die letzte belegte wird eins abgezogen. Beispiel SelStart = 5 Length = 4 SelEnd = 5 + 4 - 1 = 8 Es werden die Stellen 5,6,7 und 8 markiert also 4, was der Länge entspricht. Ist zwar nur ein konkretes Beispiel und keine mathematischer Beweis, sollte aber für diese Berechnung genügen, denke ich. @Citybreaker: Warum das bei Dir jetzt nicht funktioniert kann ich mir nicht erklären. Du könntest ggf. mal den Sourcecode hier anhängen, dann kann ich mir das mal komplett ansehen. Ansonsten könntest Du es auch noch einmal so versuchen:
Delphi-Quellcode:
iPos := pos(trim(Edit1.Text), SynMemo.Text);
if iPos = 0 then exit; SynMemo.SelStart := iPos-1; SynMemo.SelEnd := SynMemo.SelStart+length(trim(Edit1.Text))-1; |
Re: In einer Memo suchen?
Hai Christian,
ich habe das jetzt mal mit einem SynMemo probiert. Es geht bei mir nur mit diesem Code richtig: ![]()
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var ipos : Integer; begin iPos := pos(trim(Edit1.Text), SynMemo1.Text); if iPos = 0 then exit; SynMemo1.SelStart := iPos; SynMemo1.SelEnd := SynMemo1.SelStart+length(trim(Edit1.Text)); end; |
Re: In einer Memo suchen?
Moin Sharky,
:shock: :shock: :shock: also wenn ich das mit Deinem Code ausprobiere, dann wird
und das kann doch eigentlich auch nicht anders sein, weil
Meine SynEdit Installation stammt aus der Datei: SynEdit-20010826-CVS.zip |
Re: In einer Memo suchen?
Zitat:
:shock: :shock: :shock: bei mir ist es mit deinem Code genau umgekehrt. Es wird:
Ich habe SynEdit erst gestern installiert. Ist glaube ich Version 1.1 |
Re: In einer Memo suchen?
Moin Sharky,
SynMemo.pas 31.05.2001 14:07 / $Id: SynMemo.pas,v 1.5 2001/05/31 12:07:07 claplace Exp $ $Id ist im Header der Datei zu finden. |
Re: In einer Memo suchen?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 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