| Autor |
Beitrag |
danielpt
      
Beiträge: 81
Windows 2000 Professional SP4
D6 Personal
|
Verfasst: Fr 05.09.03 20:18
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.
_________________ cu daniel
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Fr 05.09.03 20: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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
danielpt 
      
Beiträge: 81
Windows 2000 Professional SP4
D6 Personal
|
Verfasst: Fr 05.09.03 20:37
ich hab ja gesucht, aber das waren über 16 Seiten
thx erstmal!
_________________ cu daniel
|
|
danielpt 
      
Beiträge: 81
Windows 2000 Professional SP4
D6 Personal
|
Verfasst: Fr 05.09.03 20:59
Ich hab jetzt das hier (aus der delphi-hilfe) eingebaut:
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 
_________________ cu daniel
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Sa 06.09.03 09: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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
danielpt 
      
Beiträge: 81
Windows 2000 Professional SP4
D6 Personal
|
Verfasst: Sa 06.09.03 11:24
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... 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... 
_________________ cu daniel
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Sa 06.09.03 20: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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
danielpt 
      
Beiträge: 81
Windows 2000 Professional SP4
D6 Personal
|
Verfasst: So 07.09.03 08:42
danke erstmal... Aber er markiert den Text trotzdem nicht... 
_________________ cu daniel
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: So 07.09.03 09: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.
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
danielpt 
      
Beiträge: 81
Windows 2000 Professional SP4
D6 Personal
|
Verfasst: So 07.09.03 16:14
Hi Frank!
Kannst du bitte die Source posten... Ich kapier das nicht... 
_________________ cu daniel
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: So 07.09.03 21: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
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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
danielpt 
      
Beiträge: 81
Windows 2000 Professional SP4
D6 Personal
|
Verfasst: So 07.09.03 22:46
_________________ cu daniel
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Mo 08.09.03 07:48
| danielpt hat folgendes geschrieben: |
Kann ich das dann weglassen? Oder wie? |
ja, ist nur zur Probe
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
danielpt 
      
Beiträge: 81
Windows 2000 Professional SP4
D6 Personal
|
Verfasst: Mo 08.09.03 07:51
gut, vielen Dank nochmal!
_________________ cu daniel
|
|
danielpt 
      
Beiträge: 81
Windows 2000 Professional SP4
D6 Personal
|
Verfasst: Mo 08.09.03 07:58
_________________ cu daniel
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Mo 08.09.03 08:31
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
danielpt 
      
Beiträge: 81
Windows 2000 Professional SP4
D6 Personal
|
Verfasst: Mo 08.09.03 08:56
Achso meintest du das... ich dachte, der makiert das was er gefunden hat.. 
_________________ cu daniel
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Mo 08.09.03 09: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 
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|