Bevor wir den Suchen- und den Ersetzendialog nutzen können, müssen wir (leider) ein paar Änderungen am Programm vornehmen. Die Textsuche wird nämlich nur von RichEdit-Controls unterstützt, daher müssen wir unser Programm damit ausrüsten. Aber der Aufwand hält sich in Grenzen:
program editor;
uses { ... }, RichEdit;
begin LoadLibrary('riched20.dll'); // RichEdit 2.0 LoadLibrary('riched32.dll'); // RichEdit
{ ... } end.
Die Rückgabeergebnisse von "LoadLibrary" interessieren uns nicht, da wir im Fehlerfall immer noch das normale Edit-Control erzeugen werden. Folgendes ist dabei zu sagen: Das RichEdit 2.0 unterstützt beim Suchen die Auswahl der Suchrichtung. Wir können also vom Textanfang in Richtung Textende suchen, oder umgekehrt.
Deshalb versuchen wir zuerst auch, ein RichEdit 2.0 zu erzeugen. Funktioniert das nicht, erstellen wir ein normales RichEdit-Control. Klappt das auch nicht, bleiben wir bei unserem Multi-Line-Edit-Control:
case uMsg of
WM_CREATE:
begin
{ ... }
{ RichEdit 2.0 erzeugen }
hEdit := CreateWindowEx(WS_EX_CLIENTEDGE,'RichEdit20A',nil,WS_CHILD or
WS_VISIBLE or ES_MULTILINE or ES_NOHIDESEL or WS_VSCROLL or
ES_AUTOVSCROLL,0,0,0,0,wnd,IDC_EDIT,hInstance,nil);
RichEdit20 := (hEdit <> 0);
{ RichEdit 1.0 erzeugen, wenn R2.0 nicht möglich ist }
if(not RichEdit20) then
hEdit := CreateWindowEx(WS_EX_CLIENTEDGE,'RICHEDIT',nil,WS_CHILD or
WS_VISIBLE or ES_MULTILINE or ES_NOHIDESEL or WS_VSCROLL or
ES_AUTOVSCROLL,0,0,0,0,wnd,IDC_EDIT,hInstance,nil);
RichEdit10 := (hEdit <> 0);
{ es ist auch kein RichEdit 1.0 möglich, :o( }
if(not RichEdit10) and (not RichEdit20) then
hEdit := CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', '', WS_VISIBLE or
WS_CHILD or ES_MULTILINE or WS_VSCROLL or ES_AUTOVSCROLL, 0, 0, 0, 0,
wnd, IDC_EDIT, hInstance, nil);
SetFocus(hEdit);
{ ... }
end;
end;
Und nur wenn min. eins der beiden RichEdit-Controls (v2.0 oder v1.0) erzeugt werden konnte, erweitern wir das Hauptmenü des Editors um die Punkte "Suchen" und "Ersetzen":
if(RichEdit10) or (RichEdit20) then begin AppendMenu(hSubmenu,MF_STRING,IDM_SEARCH,'Suchen'); AppendMenu(hSubmenu,MF_STRING,IDM_REPLACE,'Ersetzen'); end;
"RichEdit10" und "RichEdit20" sind zwei globale bool-Variablen, die hauptsächlich der Kontrolle dienen.