Autor Beitrag
DELPHIn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Windows Vista
Delphi 2007 für Win 32 Prof.
BeitragVerfasst: Di 10.06.03 12:37 
Hallo zusammen,

ich möchte in einer TMemo nach einer Zeichenfolge suchen und diese bei Erfolg markieren.
Bei jedem Suchvorgang soll immer die nächste Zeichenfolge markiert werden bis zum Ende (ähnlich wie das Suche im Windows-Editor).

Ich habe schon überall gesucht aber nichts passendes gefunden. :(
Hat jemand solches schon geschrieben?

_________________
DELPHIn
=> Errare humanum est
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Di 10.06.03 14:03 
Hallo!

Mit der Funktion Pos kannst Du in einem String nach einem Text suchen. Mit den Eigenschaften SelStart und SelLength kannst Du einen bestimmten Text im Memo markieren lassen.

Gruß
Tino
DELPHIn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Windows Vista
Delphi 2007 für Win 32 Prof.
BeitragVerfasst: Di 10.06.03 14:20 
Mit pos kann ich aber immer nur den ersten Treffer finden, wie finde ich den Nächsten?

Ich habe ziemliche Probleme mit dem Code.
Wenn ich den Ersten gefunden habe und mir die Position für den nächsten Suchdurchlauf merke habe ich das Problem, dass ich bei pos nicht angeben kann, ab wo er suchen soll.
Ich müsste den Rest des Memoinhaltes (ab der gemerkten Position) in einen String kopieren und diesen durchsuchen lassen. Aber eine Memo kann doch mehr Text enthalten als ein String?!

Oder bin ich auf der falschen Fährte?

_________________
DELPHIn
=> Errare humanum est
StefanH
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1144

Win XP
D5 Standard, D7 Pers, D2005 Pers
BeitragVerfasst: Di 10.06.03 16:23 
Hallo!

Guck dir mal das da an:
Delphihilfe hat folgendes geschrieben:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
procedure TForm1.Button1Click(Sender: TObject);
begin
  FindDialog1.Position := Point(RichEdit1.Left + RichEdit1.Width, RichEdit1.Top);
  FindDialog1.Execute;
end;

procedure TForm1.FindDialog1Find(Sender: TObject);
var
  FoundAt: LongInt;
  StartPos, ToEnd: Integer;
begin
  with RichEdit1 do
  begin
    { Suchbeginn nach der aktuellen Markierung (falls vorhanden), }
    { andernfalls am Textanfang starten }

    if SelLength <> 0 then
      StartPos := SelStart + SelLength;
    else

      StartPos := 0;

    { ToEnd ist die Länge von StartPos bis zum Ende des Textes im RTF-Eingabefeld }

    ToEnd := Length(Text) - StartPos;

    FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, [stMatchCase]);
    if FoundAt <> -1 then
    begin
      SetFocus;
      SelStart := FoundAt;
      SelLength := Length(FindDialog1.FindText);
    end;
  end;
end;

:wink:
Stefan

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.

_________________
"Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
DELPHIn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Windows Vista
Delphi 2007 für Win 32 Prof.
BeitragVerfasst: Mi 11.06.03 07:34 
Vielen Dank, ich hab das mal ein bisschen erweitert.
Es werden jetzt noch zusätzlich die Optionen wie Groß-Kleinschreibung beachtet:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
procedure TCode.SuchenClick(Sender: TObject);
begin
  if RichEditCode.SelLength > 0 then
    FindDialog.FindText := RichEditCode.SelText;
  FindDialog.Options := [frHideUpDown];  //schaltet die Möglichkeit aus, die Suchrichtung zu bestimmen (wie geht das?)
  FindDialog.Execute;
end;

procedure TCode.FindDialogFind(Sender: TObject);
  var
  FoundAt: LongInt;
  StartPos, ToEnd: Integer;
begin
  if FindDialog.FindText = '' then
    exit;
  with RichEditCode do
  begin
    //Suche hinter aktueller Markierung beginnen (falls vorhanden), andernfalls am Textanfang starten.
    if SelLength <> 0 then
      StartPos := SelStart + SelLength
    else
      StartPos := 0;
    //ToEnd ist die Länge von StartPos bis zum Textende im RTF-Eingabefeld
    ToEnd := Length(Text) - StartPos;
    if (frMatchCase in FindDialog.Options) and (frWholeWord in FindDialog.Options) then
      FoundAt := FindText(FindDialog.FindText, StartPos, ToEnd, [stWholeWord,stMatchCase])
    else
      if frWholeWord in FindDialog.Options then
        FoundAt := FindText(FindDialog.FindText, StartPos, ToEnd, [stWholeWord])
      else
        if frMatchCase in FindDialog.Options then
          FoundAt := FindText(FindDialog.FindText, StartPos, ToEnd, [stMatchCase])
        else
          FoundAt := FindText(FindDialog.FindText, StartPos, ToEnd, []);
    if FoundAt <> -1 then
    begin
      SelStart := FoundAt;
      SelLength := Length(FindDialog.FindText);
      SetFocus;
    end
    else
      MessageDlg('Kein Suchergebnis!',mtInformation,[mbOK],0);
  end;
end;

_________________
DELPHIn
=> Errare humanum est
focus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 187

XP, 2k, 98, Me
D6 Prof
BeitragVerfasst: Mi 11.06.03 08:55 
da ich heute morgen noch keine lust habe mir deinen code vorzunehmen schreib ich jetzt einfach mal wie ichs gemacht hätte:

-inhalt des memos in einen suchstring kopieren
-mit pos in dem suchstring nach dem ersten treffer suchen und den index merken(auf alten wert aufaddieren)
-element im memo einfärben (mit hilfe von index)
-(neuer suchstring) = (alter suchstring) - (index)+(länge des substrings)
-loop bis pos not found als rückgabe hat

gruss
michael