Zum Aufruf der beiden Dialoge, benötigen wir zuerst ein Record vom Typ
var fnd : TFindReplace; FindStr : array[0..4096]of char; FindLen : DWORD = sizeof(FindStr) - 1;
Die Größe des Records muss, natürlich, wieder festgelegt werden
fnd.lStructSize := sizeof(TFindReplace);
Als Besitzerfenster geben wir das Handle unseres Editorfensters an. Gleichzeitig setzen wir ein Flag, das aber vom verwendeten RichEdit abhängig ist. Konnte ein RichEdit 2.0 erzeugt werden, setzen wir die Suchrichtung auf "Abwärts". Ist nur ein RichEdit 1.0 verfügbar, dann setzen wir das Abwärtsflag natürlich auch (um Fehler zu vermeiden), verbergen aber die Auswahl der Richtung:
nd.hWndOwner := wnd; if(RichEdit20) then fnd.Flags := FR_DOWN else fnd.Flags := FR_HIDEUPDOWN or FR_DOWN;
Das Programm benutzt zwar eine etwas andere Methode, aber das Prinzip bleibt das selbe.
Zu guter Letzt weisen wir noch den Textpuffer zu
fnd.lpstrFindWhat := FindStr; fnd.wFindWhatLen := FindLen;
Bevor wir den Dialog nun tatsächlich aufrufen können, müssen wir den Wert der so genannten FINDMSGSTRING-Nachricht herausfinden. Diese ist vom System bereits vorgeben, und mit Hilfe der Funktion "RegisterWindowMessage" können wir den numerischen Wert ermitteln:
var FindTextMsgId : UINT;
{ ... }
FindTextMsgId := RegisterWindowMessage(FINDMSGSTRING);
Diese Nachricht wird später an unser Fenster gesendet. Um dann entsprechend reagieren zu können, benötigen wir den numerischen Wert.
Jetzt können wir den Suchendialog aber erst einmal aufrufen:
CommDlg.FindText(fnd);
Wollen wir stattdessen den Ersetzendialog aufrufen, benötigen wir zunächst einen weiteren Textpuffer:
var ReplStr : array[0..4096]of char;
Dass sich der Aufruf nicht groß vom Suchendialog unterscheidet, erkennen Sie bereits daran, dass unser Editor in beiden Fällen die Prozedur "Find" benutzt. Wir müssen lediglich den neuen Textpuffer zuweisen:
if(fReplaceMode) then begin fnd.lpstrReplaceWith := ReplStr; fnd.wReplaceWithLen := FindLen; end;
und die Flags anpassen, da wir den Text grundsätzlich in Richtung Textende suchen und ersetzen wollen:
if(RichEdit20) and (not fReplaceMode) then fnd.Flags := FR_DOWN else fnd.Flags := FR_DOWN or FR_HIDEUPDOWN;
Und bis auf den Aufruf des Dialogs bleibt alles andere unverändert:
CommDlg.ReplaceText(fnd);