Im kürzlich veranstalteten Workshop mit dem Thema “Effiziente Programmierung” haben wir unter anderem das Konzept der Modularen Programmierung präsentiert. Anhand eines Beispiels zur Ergänzung von RTFEdit-Objekten um eine Suchleiste haben wir die Anwendung in CONZEPT 16 erläutert.
Dieses Beispiel möchte ich im Folgenden noch einmal aufgreifen und vorstellen. Am Ende des Artikels steht das Modul in einer überarbeiteten Version zum Download bereit.
Das Modul dient der einfachen Erweiterung von RTFEdit-Objekten um eine einheitliche Oberfläche zum Suchen und Ersetzen von Textpassagen.
Das RTFEdit-Objekt kann beispielsweise zur Ein- und Ausgabe von formatierten Beschreibungstexten oder als Quelltexteditor verwendet werden. Gerade für derartige Anwendungsfälle ist eine solche Oberflächenfunktion unverzichtbar.
Die Suchleiste kann in drei verschiedenen Modi genutzt werden:
- Suchen von Textpassagen
- Suchen und Ersetzen von Textpassagen
- Positionieren auf Zeilen
Verwendung
Zur Anbindung der Suchleiste müssen innerhalb des Fensters, in dem sich das RTFEdit-Objekt befindet, weitere Objekte angelegt werden: Die Suchleiste besteht aus einem GroupTile-Objekt, in dem alle Unterobjekte der Suchleiste, wie Schaltflächen und Eingabefelder, enthalten sind:
Um die Suchleiste zu verwenden, muss lediglich eine Instanz des Moduls erzeugt werden, typischerweise beim Initialisieren des Fensters.
Zur Erzeugung einer Instanz wird die Funktion Init()
– der Konstuktor des Moduls – aufgerufen. Dabei müssen neben dem Deskriptor auf das RTFEdit-Objekt weitere Deskriptoren für die Objekte der Suchleiste übergeben werden. Der Rückgabewert der Funktion – der Instanz-Deskriptor – muss zur späteren Zerstörung der Instanz gespeichert werden:
tVarMdlWinRTFEdit # MdlWinRTFEdit:Init(
$:rtRTFEdit, // RTFEdit-Objekt
$:gtRTFCtrl, // GroupTile-Objekt als Suchleiste
$:bnRTFCtrlExit, // Button-Objekt zum Schließen der Suchleiste
$:edRTFCtrlText, // Edit-Objekt zur Eingabe des Suchwertes
$:bnRTFCtrlTextNext, // Button-Objekt zum Suchen des näch. Vorkommens
$:bnRTFCtrlTextPrev, // Button-Objekt zum Suchen des vorh. Vorkommens
$:cbRTFCtrlTextCase, // CheckBox-Objekt für "Groß-/Kleinschreibung"
$:cbRTFCtrlTextWord, // CheckBox-Objekt für "Ganzes Wort"
$:lbRTFCtrlTextReplace, // Label-Objekt für Ersetzungswert
$:edRTFCtrlTextReplace, // Edit-Objekt zur Eingabe des Ersetzungswert
$:bnRTFCtrlTextReplaceOne, // Button-Objekt zum Ersetzen eines Vork.
$:bnRTFCtrlTextReplaceAll, // Button-Objekt zum Ersetzen aller Vork.
$:ieRTFCtrlLine, // IntEdit-Objekt zur Eingabe der Zeilennummer
$:bnRTFCtrlLine // Button-Objekt zum Positionieren auf Zeilen
);
Innerhalb dieser Funktion werden die einzelnen Objekte konfiguriert: Über das Modul SysEvt werden Ereignisse registriert. Mit dem Modul SysAct werden Aktionen definiert und mit den Oberflächenobjekten verknüpft.
Das Modul übernimmt ab diesem Zeitpunkt sämtliche Logik und Steuerung, die zum Suchen und Ersetzen im RTFEdit-Objekt notwendig ist, zum Beispiel:
- Ein- und Ausblenden der Suchleiste
- Erzeugen und Anpassen des Kontextmenüs
- Reaktion auf Tastaturkürzel
- Durchsuchen, Ersetzen und Markieren von Textpassagen
Um die Instanz nach deren Verwendung zu zerstören, wird die Funktion Term()
– der Destruktor des Moduls – aufgerufen. Dabei muss lediglich der Instanz-Deskriptor übergeben werden:
tVarMdlWinRTFEdit->MdlWinRTFEdit:Term();
2 Antworten
In der Funktion MdlWinRTFEdit:Init() wird der Editiermodus über den Wert der ReadOnly-Eigenschaft des RTFEdit-Objektes ermittelt. Dem entsprechend, wird der Ersetzungsmodus aktiviert bzw. deaktiviert.
Außerdem kann über die Funktion MdlWinRTFEdit:EditSet() nachträglich der Editiermodus gesetzt werden.
Läßt man für ReadOnly-Objekte dann einfach die Felder für die Ersetzungs-Option weg, oder gibt es einen Schalter oder eine Automatik ?