Autor Beitrag
danielpt
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 2000 Professional SP4
D6 Personal
BeitragVerfasst: 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 user profile iconTino: Titel geändert.

_________________
cu daniel
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 2000 Professional SP4
D6 Personal
BeitragVerfasst: Fr 05.09.03 20:37 
ich hab ja gesucht, aber das waren über 16 Seiten :(

thx erstmal!

_________________
cu daniel
danielpt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 2000 Professional SP4
D6 Personal
BeitragVerfasst: Fr 05.09.03 20:59 
Ich hab jetzt das hier (aus der delphi-hilfe) eingebaut:

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


Allerdings, markiert er das gesuchte bzw. gefundene Wort nicht :( Wie geht das?

thx :)

_________________
cu daniel
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 2000 Professional SP4
D6 Personal
BeitragVerfasst: Sa 06.09.03 11: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?

ausblenden 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
    { Globale, schreibweisensensitive Suche nach FindText in Memo1 }
    SelPos := Pos(FindText, RichEdit1.Lines.Text);
    if SelPos > 0 then
    begin
      RichEdit1.SelStart := SelPos - 1;
      RichEdit1.SelLength := Length(FindText);
      { Markierten Text durch ReplaceText ersetzen }
      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:

_________________
cu daniel
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
2:
3:
      //wieder selektieren {!!! Hideselection des Richedits muß auf false stehen (siehe OH)}
      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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 2000 Professional SP4
D6 Personal
BeitragVerfasst: So 07.09.03 08:42 
danke erstmal... Aber er markiert den Text trotzdem nicht... :(

_________________
cu daniel
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 2000 Professional SP4
D6 Personal
BeitragVerfasst: So 07.09.03 16:14 
Hi Frank!

Kannst du bitte die Source posten... Ich kapier das nicht... :cry:

_________________
cu daniel
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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

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:
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;   //anzahl der vorgenommen Ersetzungen

    //Searchtype für Findtext anHand des ReplaceDialogs festlegen
    Searchtype:=[];
    if frMatchCase in ReplaceDialog.Options then Searchtype:=Searchtype+[stMatchCase];
    if frWholeWord in ReplaceDialog.Options then Searchtype:=Searchtype+[stWholeWord];

    //Suchbeginn und ende festlegen
    if Richedit.SelLength>0 then
      begin
        //nur Markierung durchsuchen
        StartPos := Def_Startpos;
        EndPos   := Richedit.SelLength;
        //wenn die Markierung=replactetext ist, wurde schonmal ersetzen geklickt, also hinter der Markierung beginnen
        if Richedit.SelText=ReplaceDialog.ReplaceText then
          begin
            StartPos := Richedit.SelStart+Richedit.SelLength;
            EndPos   := length(Richedit.Text)-StartPos;
          end;
      end
     else
      begin
        //den ganzen Text ab Cursorpos durchsuchen
        StartPos := Def_Startpos;
        EndPos   := length(Richedit.Text)-StartPos;
      end;

    //Wort ersetzen
    repeat
      selpos:=Richedit.FindText(ReplaceDialog.FindText,StartPos,EndPos,Searchtype);
      if Selpos<>-1 then
        begin
          inc(Result);
          RichEdit.SelStart := SelPos ;
          RichEdit.SelLength := Length(ReplaceDialog.FindText);
          // Markierten Text durch ReplaceText ersetzen
          RichEdit.SelText := ReplaceDialog.ReplaceText;

          //Startpos und Endpos neu festlegen
          Diff:=Selpos-StartPos;
          Startpos := Selpos+length(ReplaceDialog.ReplaceText);
          endpos   := endpos-diff-length(ReplaceDialog.FindText)+length(ReplaceDialog.ReplaceText)-1;

          //wenn nur ersetzen gewählt wurde, Auswahl markieren
          if frreplace in ReplaceDialog.Options then
            begin
              Richedit.SelStart := SelPos;
              Richedit.SelLength:= length(ReplaceDialog.ReplaceText);
            end;

        end;
    //Solange alle Wörter ersetzen, bis alle Vorkommen gefunden wurden oder nur ersetzen im Dialog ausgewählt wurde
    until (Selpos=-1) or (frReplace in ReplaceDialog.Options);
  end;

//ab hier die jeweiligen Ereignisse im OI zuordnen

procedure TForm1.ReplaceDialog1Replace(Sender: TObject);
var Anzahl:integer;
begin
  //suchbeginn ab Cursorpos
  Anzahl:=RichEditReplace(RichEdit1,ReplaceDialog1,RichEdit1.SelStart);
  if (Anzahl = 0) and (Richedit1.SelStart<>0) and (Richedit1.Sellength=0)then
  //wenn keine Vorkommen gefunden wurde, nicht vom Anfang und nicht im "Block" gesucht wurde, dann auf Nachfrage nochmal vom Textanfang duchsuchen
   if MessageDlg('Es wurden keine Vorkommen von "'+ReplaceDialog1.FindText+'" gefunden, soll die Suche vom Textanfang fortgesetzt werden?',mtConfirmation,[mbyes,mbno],0)=mryes then
    begin
      //suchbeginn vom textanfang
      Anzahl:=RichEditReplace(RichEdit1,ReplaceDialog1,0);
    end;
  //wenn alle ersetzt wurden, die Anzahl ausgeben
  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; //sonst siehts du deine Selektion nicht
  //zuweisung zur Probe
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 2000 Professional SP4
D6 Personal
BeitragVerfasst: So 07.09.03 22:46 
super vielen Dank! :) :) :)

Frage:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
//zuweisung zur Probe 
  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?

_________________
cu daniel
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 2000 Professional SP4
D6 Personal
BeitragVerfasst: Mo 08.09.03 07:51 
gut, vielen Dank nochmal!

_________________
cu daniel
danielpt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 2000 Professional SP4
D6 Personal
BeitragVerfasst: Mo 08.09.03 07:58 
:D:D:D Er markiert den Text aber immer noch nicht.... :D:D:D
(bei mir)
Sonst funktioniert aber alles bestens!

_________________
cu daniel
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Mo 08.09.03 08: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?

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
danielpt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 2000 Professional SP4
D6 Personal
BeitragVerfasst: Mo 08.09.03 08:56 
Achso meintest du das... ich dachte, der makiert das was er gefunden hat.. ;)

_________________
cu daniel
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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 :wink:

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)