TFindDialog / Wortsuche im Memo1-Fenster...
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: TFindDialog / Wortsuche im Memo1-Fenster...
Eine Frage: Warum nutzt du nicht die Eingebaute Methode um einen Text zu suchen ?
MFG
Michael Springwald
Michael Springwald
Re: TFindDialog / Wortsuche im Memo1-Fenster...
Weil ich hierzu keine Ahnung habe und anscheinend 1000 andere auch nicht... zumindest nicht beim Memo!pluto hat geschrieben:Eine Frage: Warum nutzt du nicht die Eingebaute Methode um einen Text zu suchen ?

Ich habe derzeit mir ein privates Tel.-/Adressen PRG zurecht gefriemelt, das erlaubt eine Text-Datei
a) Versteckt abzuspeichern (Windows)
b) den Memo Text leicht verschlüsselt darin abspeichert (Binäre Form + Gedreht...)
Ist zwar nichts dolles, aber ein Otto Normal-User, kann mit so einer Text-Datei auf der Arbeit nichts anfangen...

Tja, und die ganzen Prozeduren + Funktionen, die ich da zusammen gebastelt habe, Funktionieren nicht mit SynMemo, womit Du mir bei nem anderen Programm ja schon toll geholfen hattest... bzw., ich müsste dann wohl alles andere an Befehlen an SynMemo anpassen und dann hab ich evtl. wieder noch mehr Fummeleien am Hals...

Von daher, wäre es optimal, wenn ich eine brauchbare Suchfunktion für das Memo1 Fenster hätte...
- Falls Du eine Lösung hierfür kennst/ hast, wäre das Super... denn im Internet hab ich (für mich) nichts besseres gefunden, als das Listing, was ich gepostet habe... was ja OK wäre, wenn es die Umlaute berücksichtigen würde...

Vielleicht braucht das Listing ja nur noch eine (fehlende) Zeile, wie z.B.
Code: Alles auswählen
Memo1.Font.CharSet:= ANSI_CHARSET;
Code: Alles auswählen
Unicode UTF-8

Re: TFindDialog / Wortsuche im Memo1-Fenster...
Ich würde das so machen (Nur eben zusammengehackt, kann man noch verbessern).
Code: Alles auswählen
uses ... LCLProc, strutils;
function FindInMemo(AMemo:TMemo; AString:String; StartPos:integer):integer;
var p:integer;
begin
Result:=PosEx(AString,AMemo.text,StartPos);
if Result>0 then
begin
p:=UTF8Length(PChar(AMemo.Text),Result-1);
AMemo.SelStart:=p;
AMemo.SelLength:=Length(AString);
Result:=Result+Length(AString);
end;
end;
procedure TForm1.Button1Click(Sender:TObject);
var i:integer;
begin
i:=FindInMemo(Memo1,'test',1); //erstes 'test'
i:=FindInMemo(Memo1,'test',i); //zweites 'test'
end;
Re: TFindDialog / Wortsuche im Memo1-Fenster...
@ Theo:
Danke dafür, allerdings hilft es mir nicht wirklich weiter, weil
a) deine Methode zwar funktioniert, aber mir die Fundstelle nicht anzeigt...
b) es so in einen Durchmarsch durchläuft und ich hier dann komischerweise mit dem Befehl "break;" eine Fehlermeldung bekomme, was bei dem anderen zuvor geposteten Listing nicht passierte...?!
Bitte vergesst nicht, daß ich noch Anfänger-Status habe und mich auch u.a. deshalb mit den "spielereien" beschäftige, um weiter dazu zu lernen, was ich für mich am besten hin bekomme, wenn ich eine funktionierende Lösung habe und diese dann nach und nach "zerpflücke" um dann zu sehen, was passiert, wenn ich da oder dort etwas abändere...
In dem Sinne, wie lasse ich mir dann die Fundstelle anzeigen...
Danke dafür, allerdings hilft es mir nicht wirklich weiter, weil
a) deine Methode zwar funktioniert, aber mir die Fundstelle nicht anzeigt...
b) es so in einen Durchmarsch durchläuft und ich hier dann komischerweise mit dem Befehl "break;" eine Fehlermeldung bekomme, was bei dem anderen zuvor geposteten Listing nicht passierte...?!
Bitte vergesst nicht, daß ich noch Anfänger-Status habe und mich auch u.a. deshalb mit den "spielereien" beschäftige, um weiter dazu zu lernen, was ich für mich am besten hin bekomme, wenn ich eine funktionierende Lösung habe und diese dann nach und nach "zerpflücke" um dann zu sehen, was passiert, wenn ich da oder dort etwas abändere...

In dem Sinne, wie lasse ich mir dann die Fundstelle anzeigen...

Re: TFindDialog / Wortsuche im Memo1-Fenster...
Den Satz verstehe ich nicht. Wie weisst du denn, dass es funktioniert, wenn es die Fundstelle nicht anzeigt?Lollo67 hat geschrieben: a) deine Methode zwar funktioniert, aber mir die Fundstelle nicht anzeigt...
Re: TFindDialog / Wortsuche im Memo1-Fenster...
Indem ich nach Suchen und Weitersuchen ein Showmessage... gesetzt habe...theo hat geschrieben:Den Satz verstehe ich nicht. Wie weisst du denn, dass es funktioniert, wenn es die Fundstelle nicht anzeigt?Lollo67 hat geschrieben: a) deine Methode zwar funktioniert, aber mir die Fundstelle nicht anzeigt...
ABER: Es funktioniert wohl doch nicht, denn wenn ich ein String eingebe, der im Memo NICHT enthalten ist, durchläuft es trotzdem die if - Abfrage voll durch...

Hier mein Test-Code, wo es so oder so komlett durch läuft... und selbst wenn es funktionieren würde, so bleibt dann noch das Problem, daß die Fundstelle markiert werden soll...

Code: Alles auswählen
procedure TForm2.BitBtn3Click(Sender: TObject); // SUCHEN
var
i: Integer;
a: string;
begin
if i = FindInMemo(Memo1,Form2.Edit1.Text,1) then
begin; //erstes 'test'
ShowMessage('gefunden!');
end;
if i = FindInMemo(Memo1,Form2.Edit1.Text,i) then
begin; //zweites 'test'
ShowMessage('Weitere gefunden');
end;
ShowMessage('Der Eingabe-String wurde nicht gefunden!');
end;
Re: TFindDialog / Wortsuche im Memo1-Fenster...
Nee, so ist das nicht gedacht.
Du brauchst eine Globale- oder Klassenvariable i.
z.B. bei Form1:
Dann startest du den ersten Suchvorgang mit 1. Danach erhältst du als Rückgabewert die Position oder 0, falls nicht gefunden.
Dann machst du mit diesem Wert (i) weiter, bis 0 kommt.
z.B.
Das kannst du nat. auch anders kombinieren. Einfach ein bisschen nachdenken. 
Du brauchst eine Globale- oder Klassenvariable i.
z.B. bei Form1:
Code: Alles auswählen
var
Form1: TForm1;
i:integer;
Dann machst du mit diesem Wert (i) weiter, bis 0 kommt.
z.B.
Code: Alles auswählen
procedure TForm1.Button1Click(Sender:TObject);
begin
i:=FindInMemo(Memo1,Edit1.Text,1); //Suchen
if i=0 then ShowMessage('nix gefunden');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if i>0 then i:=FindInMemo(Memo1,Edit1.text,i); //Weitersuchen
if i=0 then ShowMessage('fertig');
end;

Re: TFindDialog / Wortsuche im Memo1-Fenster...
Hallo nochmal!
Ja, so funktioniert es jetzt zwar sehr schön, aber mir fehlt die Funktion, die Fundstelle markiert an zu zeigen... ohne dem, nutzt mir das ganze auch nichts!
Gibt es diesen Befehl, den ich in einem Delphi-Forum gefunden hatte, bei Lazarus nicht???
Kann bei mir HideSelection nicht finden... hast Du hierzu noch eine Idee?
- Alternativ war ich auch am überlegen, ob man (sofern ich den Fund-String NICHT markieren kann...) dann an der Fundstelle nicht z.B. ein Zeichen davor setzen kann, z.B. ein # oder mehrere ### ... doch das wäre für mich eher nur eine Notlösung...
Bezogen auf deiner Function, müsste man doch irgendwie die Fundstelle(n) markiert dastellen können... aber nur wie, das scheint bei einem Memo wohl nicht so einfach zu sein...
Ja, so funktioniert es jetzt zwar sehr schön, aber mir fehlt die Funktion, die Fundstelle markiert an zu zeigen... ohne dem, nutzt mir das ganze auch nichts!

Gibt es diesen Befehl, den ich in einem Delphi-Forum gefunden hatte, bei Lazarus nicht???
Code: Alles auswählen
Memo1.HideSelection := False;
- Alternativ war ich auch am überlegen, ob man (sofern ich den Fund-String NICHT markieren kann...) dann an der Fundstelle nicht z.B. ein Zeichen davor setzen kann, z.B. ein # oder mehrere ### ... doch das wäre für mich eher nur eine Notlösung...
Bezogen auf deiner Function, müsste man doch irgendwie die Fundstelle(n) markiert dastellen können... aber nur wie, das scheint bei einem Memo wohl nicht so einfach zu sein...

-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: TFindDialog / Wortsuche im Memo1-Fenster...
Also die Fund Stelle sollte laut dem Code von Theo bereits Markiert sein, sofern sie gefunden wird. Dort findest du unter anderem die Zeilen SelStart und SelLength.
MFG
Michael Springwald
Michael Springwald
Re: TFindDialog / Wortsuche im Memo1-Fenster...
Unter Windows wird offenbar die Auswahl nur angezeigt wenn HideSelection auf False ist (in 0.9.29 gibt es dieses Property) oder
wenn das Memo den Focus hat.
Deshalb kannst du nach jedem Suchvorgang:
Memo.SetFocus;
..machen oder Lazarus upgraden und HideSelection auf False setzen.
wenn das Memo den Focus hat.
Deshalb kannst du nach jedem Suchvorgang:
Memo.SetFocus;
..machen oder Lazarus upgraden und HideSelection auf False setzen.
Re: TFindDialog / Wortsuche im Memo1-Fenster...
@theo / pluto:
BINGO, mit funktioniert es nun einwandfrei!
Da muss man erst mal darauf kommen...
Ihr zwei seit klasse und ihr habt mir damit eine rießen Freude gemacht !!!!
VIELEN DANK für die tolle Hilfe und allen hier ein schönes WE!
BINGO, mit
Code: Alles auswählen
Memo1.SetFocus;
Da muss man erst mal darauf kommen...

Ihr zwei seit klasse und ihr habt mir damit eine rießen Freude gemacht !!!!
VIELEN DANK für die tolle Hilfe und allen hier ein schönes WE!
