Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Textsuche im RichEdit
danielpt - Fr 05.09.03 19:18
Titel: Textsuche im RichEdit
Hi!
Meine (vorerst) letzte Frage zu meinem RTF-Editor:
Kann mir bitte jemand sagen, wie ich einen Textsuche (z.B. Im MSIE > Bearbeiten > Suchen...) für ein RichEdit-Textfeld einbaue :?:
thx
Moderiert von
Tino: Titel geändert.
Keldorn - Fr 05.09.03 19:33
Hallo
mit einem Finddialog. da gibt es ein beispiel in der Hilfe bei Finddialog und Richedit.findtext.
Mit der Suche hier im forum hättste auch erfolg gehabt.
Mfg Frank
danielpt - Fr 05.09.03 19:37
ich hab ja gesucht, aber das waren über 16 Seiten :(
thx erstmal!
danielpt - Fr 05.09.03 19:59
Ich hab jetzt das hier (aus der delphi-hilfe) eingebaut:
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:
| 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
if SelLength <> 0 then StartPos := SelStart + SelLength else
StartPos := 0;
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; |
Allerdings, markiert er das gesuchte bzw. gefundene Wort nicht :( Wie geht das?
thx :)
Keldorn - Sa 06.09.03 08:29
- Tfinddialog auf Form packen
- bei Ereignissen im OI mußt du die FindDialog1Find-procedure angeben
könnte mir vorstellen, das es daran liegt.
Mfg Frank
danielpt - Sa 06.09.03 10:24
thx Frank... ich hab jetzt irgentwas geändert und jetzt gehts... :D
Nur zwei Probs. hab ich noch, bei dieser Ersetzen-Funktion markiert er den Text, der ersetzt werden soll nicht... Außerdem ersetzt er immer nur ein Wort, selbst wenn ich auf "Alle ersetzen" klicke... why?
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:
| procedure TForm1.ReplaceDialog1Replace(Sender: TObject); var SelPos: Integer; begin with TReplaceDialog(Sender) do begin SelPos := Pos(FindText, RichEdit1.Lines.Text); if SelPos > 0 then begin RichEdit1.SelStart := SelPos - 1; RichEdit1.SelLength := Length(FindText); RichEdit1.SelText := ReplaceText; end
else MessageDlg(Concat('Der Suchtext "', FindText, '" konnte nicht gefunden werden.'), mtError, [mbOk], 0); end; end;
procedure TForm1.Ersetzen1Click(Sender: TObject); begin ReplaceDialog1.execute; end; |
Source stammt aus der Delphi-Hilfe!
bitte hilfe... :wink:
Keldorn - Sa 06.09.03 19:05
evtl solltest du Richedit.findtext statt pos verwenden
zum thema markieren:
füge folgndes hinter RichEdit1.SelText := ReplaceText; ein
Delphi-Quelltext
1: 2: 3:
| richEdit1.SelStart := SelPos - 1; RichEdit1.Sellength := length(ReplaceText); |
alles ersetzen: keine ahnung, noch nie benutzt. Aber der Code den du hast, ersetzt ja auch immer nur einmal. Du mußt ihgn also mehrmals aufrufen, bzuw eine Schleife einbauen, bis alles gefunden wurde.
Wenn du unter TReplacedialog.options guggst, findest du ein Beispiel. Dort werden auch bei Ersetzen und Alles ersetzen 2 unterschiedliche Proc aufgerufen.
Mfg Frank
danielpt - So 07.09.03 07:42
danke erstmal... Aber er markiert den Text trotzdem nicht... :(
Keldorn - So 07.09.03 08:56
| danielpt hat folgendes geschrieben: |
| danke erstmal... Aber er markiert den Text trotzdem nicht... :( |
ich hatte das gestern probiert. Hideselection hast du geändert?
setze mal einen haltepunkt rein und kontrollier die werte.
danielpt - So 07.09.03 15:14
Hi Frank!
Kannst du bitte die Source posten... Ich kapier das nicht... :cry:
Keldorn - So 07.09.03 20:57
ok, weil heut Sontag ist
1 button, 1 Richedit, 1 replacedialog auf form packen und die alle Proc außer RichEditReplace im OI entsprechend zuweisen.
RichEditReplace ist allgemein gehalten (ein Richedit und ein Replacedialog werden übergeben), kann "wiederverwendet" werden
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: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94:
| function RichEditReplace(Richedit:TRichEdit;ReplaceDialog:TReplaceDialog;Def_Startpos:integer):integer; Var Searchtype:TSearchTypes; StartPos, EndPos, SelPos,Diff: integer; begin Result:=0; Searchtype:=[]; if frMatchCase in ReplaceDialog.Options then Searchtype:=Searchtype+[stMatchCase]; if frWholeWord in ReplaceDialog.Options then Searchtype:=Searchtype+[stWholeWord];
if Richedit.SelLength>0 then begin StartPos := Def_Startpos; EndPos := Richedit.SelLength; if Richedit.SelText=ReplaceDialog.ReplaceText then begin StartPos := Richedit.SelStart+Richedit.SelLength; EndPos := length(Richedit.Text)-StartPos; end; end else begin StartPos := Def_Startpos; EndPos := length(Richedit.Text)-StartPos; end;
repeat selpos:=Richedit.FindText(ReplaceDialog.FindText,StartPos,EndPos,Searchtype); if Selpos<>-1 then begin inc(Result); RichEdit.SelStart := SelPos ; RichEdit.SelLength := Length(ReplaceDialog.FindText); RichEdit.SelText := ReplaceDialog.ReplaceText;
Diff:=Selpos-StartPos; Startpos := Selpos+length(ReplaceDialog.ReplaceText); endpos := endpos-diff-length(ReplaceDialog.FindText)+length(ReplaceDialog.ReplaceText)-1;
if frreplace in ReplaceDialog.Options then begin Richedit.SelStart := SelPos; Richedit.SelLength:= length(ReplaceDialog.ReplaceText); end;
end; until (Selpos=-1) or (frReplace in ReplaceDialog.Options); end;
procedure TForm1.ReplaceDialog1Replace(Sender: TObject); var Anzahl:integer; begin Anzahl:=RichEditReplace(RichEdit1,ReplaceDialog1,RichEdit1.SelStart); if (Anzahl = 0) and (Richedit1.SelStart<>0) and (Richedit1.Sellength=0)then if MessageDlg('Es wurden keine Vorkommen von "'+ReplaceDialog1.FindText+'" gefunden, soll die Suche vom Textanfang fortgesetzt werden?',mtConfirmation,[mbyes,mbno],0)=mryes then begin Anzahl:=RichEditReplace(RichEdit1,ReplaceDialog1,0); end; if frReplaceAll in ReplaceDialog1.Options then ShowMessage('Suchstring "'+ReplaceDialog1.FindText+'" wurde '+inttostr(Anzahl)+' x ersetzt'); end;
procedure TForm1.Button1Click(Sender: TObject); begin ReplaceDialog1.Execute end;
procedure TForm1.FormCreate(Sender: TObject); begin RichEdit1.HideSelection:=false; ReplaceDialog1.FindText:='ich'; ReplaceDialog1.ReplaceText:='Ich';
RichEdit1.Text:='thx Frank... ich hab jetzt irgentwas geändert und jetzt gehts...'+ 'Nur zwei Probs. hab ich noch, bei dieser Ersetzen-Funktion markiert'+ 'er den Text, der ersetzt werden soll nicht... Außerdem ersetzt er'+ 'immer nur ein Wort, selbst wenn ich auf "Alle ersetzen" klicke...'; end; |
ich habe nicht alles bis aufs kleinste durchgetest, kann sein, daß ich etwas übersehen habe, probiers einfach mal aus.
Frank
danielpt - So 07.09.03 21:46
super vielen Dank! :) :) :)
Frage:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| ReplaceDialog1.FindText:='ich'; ReplaceDialog1.ReplaceText:='Ich';
RichEdit1.Text:='thx Frank... ich hab jetzt irgentwas geändert und jetzt gehts...'+ 'Nur zwei Probs. hab ich noch, bei dieser Ersetzen-Funktion markiert'+ 'er den Text, der ersetzt werden soll nicht... Außerdem ersetzt er'+ 'immer nur ein Wort, selbst wenn ich auf "Alle ersetzen" klicke...'; |
Kann ich das dann weglassen? Oder wie?
Keldorn - Mo 08.09.03 06:48
| danielpt hat folgendes geschrieben: |
Kann ich das dann weglassen? Oder wie? |
ja, ist nur zur Probe
danielpt - Mo 08.09.03 06:51
gut, vielen Dank nochmal!
danielpt - Mo 08.09.03 06:58
:D:D:D Er markiert den Text aber immer noch nicht.... :D:D:D
(bei mir)
Sonst funktioniert aber alles bestens!
Keldorn - Mo 08.09.03 07:31
| danielpt hat folgendes geschrieben: |
:D:D:D Er markiert den Text aber immer noch nicht.... :D:D:D
(bei mir)
Sonst funktioniert aber alles bestens! |
der Text wir nur markiert, wenn du auf ersetzen klickst (sonst gehts ja auch nicht) und das hat gestern funktioniert.
Hideselection des Richedit steht auf false?
danielpt - Mo 08.09.03 07:56
Achso meintest du das... ich dachte, der makiert das was er gefunden hat.. ;)
Keldorn - Mo 08.09.03 08:12
| danielpt hat folgendes geschrieben: |
| Achso meintest du das... ich dachte, der makiert das was er gefunden hat.. ;) |
Ich hatte dir doch gesagt, daß du Hideselection in der OH nachlesen sollst. Ich kopier hier keine Scahen rein, die du selbst nachlesen kannst :wink:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!