TFindDialog / Wortsuche im Memo1-Fenster...

Für Fragen von Einsteigern und Programmieranfängern...
pluto
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...

Beitrag von pluto »

Eine Frage: Warum nutzt du nicht die Eingebaute Methode um einen Text zu suchen ?
MFG
Michael Springwald

Lollo67
Beiträge: 69
Registriert: Mo 25. Jan 2010, 23:07

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von Lollo67 »

pluto hat geschrieben:Eine Frage: Warum nutzt du nicht die Eingebaute Methode um einen Text zu suchen ?
Weil ich hierzu keine Ahnung habe und anscheinend 1000 andere auch nicht... zumindest nicht beim Memo! :wink:

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... :lol:

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... :roll:

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... :roll:

Vielleicht braucht das Listing ja nur noch eine (fehlende) Zeile, wie z.B.

Code: Alles auswählen

Memo1.Font.CharSet:= ANSI_CHARSET;
Oder eine Zeile, wo man irgendwie das

Code: Alles auswählen

Unicode UTF-8
als Font-Vorgabe setzt... aber davon, habe ich halt überhaupt keine Ahnung... bin nur bei der Suche in diversen Delphi-Foren darauf gestoßen... :roll:

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von theo »

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;

Lollo67
Beiträge: 69
Registriert: Mo 25. Jan 2010, 23:07

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von Lollo67 »

@ 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... :wink:

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

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von theo »

Lollo67 hat geschrieben: a) deine Methode zwar funktioniert, aber mir die Fundstelle nicht anzeigt...
Den Satz verstehe ich nicht. Wie weisst du denn, dass es funktioniert, wenn es die Fundstelle nicht anzeigt?

Lollo67
Beiträge: 69
Registriert: Mo 25. Jan 2010, 23:07

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von Lollo67 »

theo hat geschrieben:
Lollo67 hat geschrieben: a) deine Methode zwar funktioniert, aber mir die Fundstelle nicht anzeigt...
Den Satz verstehe ich nicht. Wie weisst du denn, dass es funktioniert, wenn es die Fundstelle nicht anzeigt?
Indem ich nach Suchen und Weitersuchen ein Showmessage... gesetzt habe...
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... :roll:
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;

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von theo »

Nee, so ist das nicht gedacht.
Du brauchst eine Globale- oder Klassenvariable i.
z.B. bei Form1:

Code: Alles auswählen

var
  Form1: TForm1;
  i:integer;
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.

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;
Das kannst du nat. auch anders kombinieren. Einfach ein bisschen nachdenken. ;-)

Lollo67
Beiträge: 69
Registriert: Mo 25. Jan 2010, 23:07

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von Lollo67 »

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! :wink:

Gibt es diesen Befehl, den ich in einem Delphi-Forum gefunden hatte, bei Lazarus nicht???

Code: Alles auswählen

Memo1.HideSelection := False;
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... :roll:

pluto
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...

Beitrag von pluto »

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

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von theo »

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.

Lollo67
Beiträge: 69
Registriert: Mo 25. Jan 2010, 23:07

Re: TFindDialog / Wortsuche im Memo1-Fenster...

Beitrag von Lollo67 »

@theo / pluto:
BINGO, mit

Code: Alles auswählen

Memo1.SetFocus;
funktioniert es nun einwandfrei!
Da muss man erst mal darauf kommen... :mrgreen:

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! :D

Antworten