Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi In einer Memo suchen? (https://www.delphipraxis.net/10419-einer-memo-suchen.html)

citybreaker 18. Okt 2003 11:07


In einer Memo suchen?
 
Hallo, wie kann ich über ein Editfeld in einer
Memo suchen und die Zeile makieren wo das Wort ist?

mirage228 18. Okt 2003 11:12

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:
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;
mfG
mirage228

Christian Seehase 18. Okt 2003 11:13

Re: In einer Memo suchen?
 
Moin Citybreaker,

Stichworte hierfür:
pos, SelStart, SelLength und, besonders wichtig und die Zeile herauszubekommen: Hier im Forum suchenEM_EXLINEFROMCHAR

@Mirage:
TMemo kennt allerdings FindText nicht.

mirage228 18. Okt 2003 11:15

Re: In einer Memo suchen?
 
Zitat:

Zitat von Christian Seehase
TMemo kennt allerdings FindText nicht

Ups... sorry mein fehler, wusst ich nicht

mfG
mirage228

citybreaker 18. Okt 2003 11:23

Re: In einer Memo suchen?
 
Zitat:

Zitat von Christian Seehase
Moin Citybreaker,

Stichworte hierfür:
pos, SelStart, SelLength und, besonders wichtig und die Zeile herauszubekommen: Hier im Forum suchenEM_EXLINEFROMCHAR

@Mirage:
TMemo kennt allerdings FindText nicht.


Da ist ja nur beitrag und einandere wo der Code
nciht klappt. Hilft mir nicht wirklich. :(

Christian Seehase 18. Okt 2003 12:07

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:
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;
Direkt hier reingeschrieben, also ungetestet, sollte aber richtig sein.

citybreaker 18. Okt 2003 12:52

Re: In einer Memo suchen?
 
Klappt noch nicht so richtig.
Ich hab jetzt folgendes gemacht:

Code:
  // Wo befindet sich der gesuchte String?
  iPos := (Edit1.Text, 'Memo1.Text');
Es kommt eine Fehlermeldung
')' erwartet aber ',' gefunden.

Dann hab ich
Code:
  // Wo befindet sich der gesuchte String?
  iPos := ('Edit1.Text', 'Memo1.Text');
ausprobiert und es kommt wieder:
Es kommt eine Fehlermeldung
')' erwartet aber ',' gefunden.

Christian Seehase 18. Okt 2003 13:04

Re: In einer Memo suchen?
 
Moin Citybreaker,

Tippfehler :wall:

Code:
iPos := [color=red]pos([/color]...
die Parameter von pos sind dann hoffentlich klar.

citybreaker 18. Okt 2003 13:15

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.

mirage228 18. Okt 2003 13:30

Re: In einer Memo suchen?
 
Hi Citybreaker,

du musst Edit1.Text und Memo1.Text nicht in Hochkommas, setzen!

Zitat:

Code:
  // Wo befindet sich der gesuchte String?
  iPos := (Edit1.Text, Memo1.Text); // ohne hochkommas!

mfG
mirage228

Christian Seehase 18. Okt 2003 13:48

Re: In einer Memo suchen?
 
Moin Citybreaker,

ach ja, und nicht zu vergessen:

Die Eigenschaft HideSelection des Memo sollte auf false stehen.

citybreaker 18. Okt 2003 13:48

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

Sharky 18. Okt 2003 14:04

Re: In einer Memo suchen?
 
Zitat:

Zitat von citybreaker
.... Kann man auch nur das Suchwort makieren lassen. :-D


Hai citybreaker,

das sollte gehen wenn Du

Code:
Memo1.SelLength := length(Memo1.Lines[iLine]);
durch

Code:
Memo1.SelLength := length(Edit1.Text);
ersetzt.

citybreaker 18. Okt 2003 15:00

Re: In einer Memo suchen?
 
Zitat:

Zitat von Sharky
Zitat:

Zitat von citybreaker
.... Kann man auch nur das Suchwort makieren lassen. :-D


Hai citybreaker,

das sollte gehen wenn Du

Code:
Memo1.SelLength := length(Memo1.Lines[iLine]);
durch

Code:
Memo1.SelLength := length(Edit1.Text);
ersetzt.

Hai, geht leider nicht.
Ich muss jetzt nochmal ne Frage stellen. Wie klappt das
mit einer SynMemo? *bitte nicht hauhen* :duck:
Da gibts nähmlich sellenght nicht.

Christian Seehase 18. Okt 2003 15:28

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:
  iPos := pos(Edit1.Text,Memo1.Text);
  if iPos = 0 then exit;
  Memo1.SelStart := iPos-1;
  Memo1.SelLength := length(Edit1.Text);
@Citybreaker:
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;

citybreaker 18. Okt 2003 16:07

Re: In einer Memo suchen?
 
Zitat:

Zitat von Christian Seehase
Moin Sharky,

dann geht's noch viel kürzer, weil man ja nicht erst die Zeile und deren Anfang ermitteln muss

Delphi-Quellcode:
  iPos := pos(Edit1.Text,Memo1.Text);
  if iPos = 0 then exit;
  Memo1.SelStart := iPos-1;
  Memo1.SelLength := length(Edit1.Text);
@Citybreaker:
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;

So jetzt hab ich das wenn ich jetzt nach
alex suche wird nur ale makiert.

Christian Seehase 18. Okt 2003 16:25

Re: In einer Memo suchen?
 
Moin Citybreaker,

Zitat:

Zitat von citybreaker
So jetzt hab ich das wenn ich jetzt nach
alex suche wird nur ale makiert.

Ich habe beide Varianten noch einmal ausprobiert (einfach per Copy&Paste hier heraus kopiert), und sie funktionieren beide einwandfrei.

Wie hast Du's denn gemacht?

citybreaker 18. Okt 2003 16:39

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;

Christian Seehase 18. Okt 2003 16:47

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?

citybreaker 18. Okt 2003 17:12

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.

Sharky 18. Okt 2003 18:52

Re: In einer Memo suchen?
 
Hai,

warum ist hier denn das -1?

Delphi-Quellcode:
SynMemo1.SelEnd  := SynMemo1.SelStart+length(Edit1.Text)-1;
Ist doch falsch?!

Christian Seehase 19. Okt 2003 00:42

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;

Sharky 19. Okt 2003 09:11

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:

http://www.sharkys-home.de/smiles/finger.gif
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;

Christian Seehase 19. Okt 2003 11:54

Re: In einer Memo suchen?
 
Moin Sharky,

:shock: :shock: :shock:

also wenn ich das mit Deinem Code ausprobiere, dann wird
  1. eine Stelle zu spät mit der Markierung begonnen
  2. eine Stelle zu viel markiert (falls hinter der Fundstelle noch genug in der Zeile steht)

und das kann doch eigentlich auch nicht anders sein, weil
  1. TSynMemo.SelStart 0 basiert, der Rückgabewert von pos 1 basiert ist
  2. siehe vorheriges Posting

Meine SynEdit Installation stammt aus der Datei: SynEdit-20010826-CVS.zip

Sharky 19. Okt 2003 12:01

Re: In einer Memo suchen?
 
Zitat:

Zitat von Christian Seehase
...
  1. eine Stelle zu spät mit der Markierung begonnen
  2. eine Stelle zu viel markiert (falls hinter der Fundstelle noch genug in der Zeile steht)

Hai Christian,

:shock: :shock: :shock:

bei mir ist es mit deinem Code genau umgekehrt. Es wird:
  1. eine Stelle zu früh mit der Markierung begonnen
  2. eine Stelle zu wenig markiert

Ich habe SynEdit erst gestern installiert. Ist glaube ich Version 1.1

Christian Seehase 19. Okt 2003 12:16

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.

Sharky 19. Okt 2003 12:19

Re: In einer Memo suchen?
 
Zitat:

Zitat von Christian Seehase
....
SynMemo.pas 31.05.2001 14:07 / $Id: SynMemo.pas,v 1.5 2001/05/31 12:07:07 claplace Exp $
..

$Id: SynMemo.pas,v 1.8 2002/04/12 15:47:40 harmeister Exp $


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