TMemo/de: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: TMemo/de
| Old | New | Line | |
|---|---|---|---|
| 1 | + | Diese Seite erklärt, wie man die [[doc:lcl/stdctrls/tmemo.html|TMemo]] Komponente verwendet. Auf etwas klicken bedeutet immer ein Linksklick, ein Rechtsklick wird explizit erwähnt. | |
| 2 | + | ||
| 3 | + | ## Beschreibung | |
| 4 | + | ||
| 5 | + | Ein Steuerelement um mehrzeilige Texte zu editieren. | |
| 6 | + | ||
| 7 | + | <figure> | |
| 8 | + | <img src="Comp_Standard_TMemo.png" title="Comp_Standard_TMemo.png" /> | |
| 9 | + | <figcaption>Comp_Standard_TMemo.png</figcaption> | |
| 10 | + | </figure> | |
| 11 | + | ||
| 12 | + | ## Verwendung | |
| 13 | + | ||
| 14 | + | Um ein [[doc:lcl/stdctrls/tmemo.html|TMemo]] auf einem [[TForm/de|Formular]] zu nutzen, kann man es einfach auf der Komponentenpalette *Standard* auswählen und, mit einem Klick auf das Formular, platzieren. In diesem Textfeld können Sie nun zur Laufzeit einen mehrzeiligen Text bearbeiten.\ | |
| 15 | + | \ | |
| 16 | + | Haben Sie zum Beispiel zu Ihrem Formular *Form1* ein TMemo *Memo1* hinzugefügt, können Sie mit **`Memo1.Text:='Das ist ein einzeiliger Text';`** dem Textfeld einen [[String/de|String]] zuweisen.\ | |
| 17 | + | Ebenso können Sie überall im Quelltext auf den hinterlegten Text mit **`myString:=Memo1.Text;`** zugreifen.\ | |
| 18 | + | Möglich ist es auch, einen mehrzeiligen Text *Memo1* zuzuweisen mit **`Memo1.Text:='Das'+LineEnding+'ist'+LineEnding+'ein'+LineEnding+'mehrzeiliger'+LineEnding+'Text';`**.\ | |
| 19 | + | ||
| 20 | + | ### Zuweisung eines TStrings oder TStringList | |
| 21 | + | ||
| 22 | + | Üblich, um einem TMemo einen Text zuzuweisen, ist die Verwendung einer [[TStringList-TStrings Tutorial/de|TStringList]] oder ihres Vorfahrens [[TStringList-TStrings Tutorial/de|TStrings]]. Folgendes kleines Beispiel zeigt dies (im Eventhandler eines in *Form1* eingefügten TButtons *Button1* und einem TMemo *Memo1*): | |
| 23 | + | ||
| 24 | + | ``` pascal | |
| 25 | + | procedure TForm1.Button1Click(Sender: TObject); | |
| 26 | + | var | |
| 27 | + | myStringList: TStringList; | |
| 28 | + | begin | |
| 29 | + | myStringList:=TStringList.Create; //Meine StringList erstellen | |
| 30 | + | myStringList.Add('Das ist die erste Zeile.'); //dieser eine Zeile zufügen | |
| 31 | + | myStringList.Add('Das ist die zweite Zeile.'); | |
| 32 | + | myStringList.Add('Das ist die dritte Zeile.'); | |
| 33 | + | myStringList.Add('usw.'); | |
| 34 | + | Memo1.Lines.Assign(myStringList); //dem Memo1 den Textinhalt meine StringList zuweisen | |
| 35 | + | myStringList.Free; //Meine StringList im Speicher wieder freigeben | |
| 36 | + | end; | |
| 37 | + | ``` | |
| 38 | + | ||
| 39 | + | ### Zeilen direkt einfügen | |
| 40 | + | ||
| 41 | + | Sie können dem Memo den Inhalt auch direkt zufügen z.B.: | |
| 42 | + | ||
| 43 | + | ``` pascal | |
| 44 | + | procedure TForm1.Button1Click(Sender: TObject); | |
| 45 | + | begin | |
| 46 | + | Memo1.Lines.Clear; //alle Zeilen von Memo1 löschen | |
| 47 | + | Memo1.Lines.Add('Das ist die erste Zeile.'); //Zeile hinzufügen | |
| 48 | + | Memo1.Lines.Add('Das ist die zweite Zeile.'); | |
| 49 | + | Memo1.Lines.Add('Das ist die dritte Zeile.'); | |
| 50 | + | Memo1.Lines.Add('usw.'); | |
| 51 | + | end; | |
| 52 | + | ``` | |
| 53 | + | ||
| 54 | + | ### Eine Zeile auslesen | |
| 55 | + | ||
| 56 | + | Wollen Sie wissen, was in einer bestimmten Zeile steht, können Sie diese direkt auslesen mit **`myString:=Memo1.Lines[Index];`**. Achtung: der Index von *TMemo.Lines* ist nullbasiert, d.h. die erste Zeile wäre: **`myString:=Memo1.Lines[0];`** | |
| 57 | + | ||
| 58 | + | Fügen Sie dem vorhergehenden Beispiel noch einen TButton *Button2* hinzu, können Sie sich die dritte Zeile wie folgt ausgeben lassen: | |
| 59 | + | ||
| 60 | + | ``` pascal | |
| 61 | + | procedure TForm1.Button2Click(Sender: TObject); | |
| 62 | + | begin | |
| 63 | + | ShowMessage(Memo1.Lines[2]); | |
| 64 | + | end; | |
| 65 | + | ``` | |
| 66 | + | ||
| 67 | + | ### Bestimmte Zeile(n) löschen | |
| 68 | + | ||
| 69 | + | Sie können im Memo Zeilen mit einem bestimmten Inhalt direkt löschen: | |
| 70 | + | ||
| 71 | + | ``` pascal | |
| 72 | + | procedure subZeileLoeschen(AMemo: TMemo; AString: String); | |
| 73 | + | var intIndex: Integer; | |
| 74 | + | begin | |
| 75 | + | ||
| 76 | + | intIndex := 0; | |
| 77 | + | ||
| 78 | + | while intIndex < AMemo.Lines.Count do | |
| 79 | + | begin | |
| 80 | + | // Enthält die aktuelle Zeile den gesuchten Text, | |
| 81 | + | // dann lösch die Zeile und erhöhe nicht den Index | |
| 82 | + | if (AnsiContainsStr(AMemo.Lines[intIndex], AString)) then | |
| 83 | + | AMemo.Lines.Delete(intIndex) | |
| 84 | + | else | |
| 85 | + | Inc(intIndex); // erhöhe den Index | |
| 86 | + | end; | |
| 87 | + | ||
| 88 | + | end; | |
| 89 | + | ``` | |
| 90 | + | ||
| 91 | + | ### Textmarkierung | |
| 92 | + | ||
| 93 | + | Sie können zur Laufzeit Textteile markieren, indem Sie die linke Maustaste gedrückt halten oder die \[Shift\]-Taste gedrückt halten und mit der Maus oder Tastatur den Text selektieren. Diesen Text ([[String/de|String]]) können Sie dann zum Beispiel so ausgeben: | |
| 94 | + | ||
| 95 | + | ``` pascal | |
| 96 | + | procedure TForm1.Button2Click(Sender: TObject); | |
| 97 | + | begin | |
| 98 | + | ShowMessage(Memo1.SelText); | |
| 99 | + | end; | |
| 100 | + | ``` | |
| 101 | + | ||
| 102 | + | ### Text suchen | |
| 103 | + | ||
| 104 | + | Entgegen dem vorherigen Beispiel können Sie auch einen Text ([[String/de|String]]) in einem TMemo suchen und sich die Stelle, wo sich der Text befindet mit **`Stelle:=Memo1.SelStart;`** zurückgeben lassen. | |
| 105 | + | ||
| 106 | + | Folgendes kleines Beispiel zeigt, wie Sie einen Text in einem Memo suchen und weitersuchen können: | |
| 107 | + | ||
| 108 | + | - Erstellen Sie eine neue Anwendung, mit einem [[TEdit/de|TEdit]] *Edit1*, einem TMemo *Memo1* und zwei [[TButton/de|TButtons]] *Button1* und *Button2*. | |
| 109 | + | - Ergänzen Sie die Uses-Klausel um die [[Unit/de|Units]] *LCLProc* und *strutils*. | |
| 110 | + | - Füllen Sie im Eventhandler *OnClick* von *Button1* das Memo mit einem beliebigen Text, wie im Beispiel [[TMemo/de|Zeilen direkt einfügen]]. | |
| 111 | + | - Fügen Sie im Quelltexteditor folgende Funktion zu (angelehnt an das [Beispiel](http://www.lazarusforum.de/viewtopic.php?p=39260#p39260) aus dem deutschen Lazarusforum): | |
| 112 | + | ||
| 113 | + | ``` pascal | |
| 114 | + | // FindInMemo: gibt die Stelle zurück, wo der zu suchende String gefunden wurde | |
| 115 | + | function FindInMemo(AMemo: TMemo; AString: String; StartPos: Integer): Integer; | |
| 116 | + | begin | |
| 117 | + | Result := PosEx(AString, AMemo.Text, StartPos); | |
| 118 | + | if Result > 0 then | |
| 119 | + | begin | |
| 120 | + | AMemo.SelStart := UTF8Length(PChar(AMemo.Text), Result - 1); | |
| 121 | + | AMemo.SelLength := Length(AString); | |
| 122 | + | AMemo.SetFocus; | |
| 123 | + | end; | |
| 124 | + | end; | |
| 125 | + | ``` | |
| 126 | + | ||
| 127 | + | - Ergänzen Sie nun noch im Eventhandler *OnClick* von *Button2* folgenden Code: | |
| 128 | + | ||
| 129 | + | ``` pascal | |
| 130 | + | procedure TForm1.Button2Click(Sender: TObject); | |
| 131 | + | const | |
| 132 | + | SuchStr: String = ''; // Der zu suchende String | |
| 133 | + | SuchStart: Integer = 0; // Letzte Fundstelle des zu suchenden Strings | |
| 134 | + | begin | |
| 135 | + | if SuchStr <> Edit1.Text then begin // Falls sich der zu suchende String geändert hat | |
| 136 | + | SuchStart := 0; | |
| 137 | + | SuchStr := Edit1.Text; | |
| 138 | + | end; | |
| 139 | + | SuchStart := FindInMemo(Memo1, SuchStr, SuchStart + 1); | |
| 140 | + | ||
| 141 | + | if SuchStart > 0 then | |
| 142 | + | Caption := 'Bei Memo1.SelStart['+IntToStr(SuchStart)+'] gefunden!' | |
| 143 | + | else | |
| 144 | + | Caption := 'Keine weiteren Funde!'; | |
| 145 | + | end; | |
| 146 | + | ``` | |
| 147 | + | ||
| 148 | + | - Nun können Sie zur Laufzeit mit *Button1* das Memo mit einem Text füllen, den zu suchenden Text in *Edit1* einfügen und mit *Button2* diesen im Memo suchen bzw. weitersuchen. | |
| 149 | + | ||
| 150 | + | ### Speichern und Laden | |
| 151 | + | ||
| 152 | + | Sie können den Inhalt eines Memos recht einfach Speichern und Laden, indem Sie die Methoden *SaveToFile* und *LoadFromFile* der Klasse [[TStringList-TStrings Tutorial/de|TStrings]] nutzen. | |
| 153 | + | ||
| 154 | + | Folgendes Beispiel zeigt Ihnen wie: | |
| 155 | + | ||
| 156 | + | - Erstellen Sie eine neue Anwendung, mit einem TMemo *Memo1* und drei [[TButton/de|TButtons]] *Button1*, *Button2* und *Button3*. | |
| 157 | + | - Legen Sie zusätzlich noch ein [[TSaveDialog]] und einen [[TOpenDialog]] von der Komponentenpalette *Dialogs* auf dem Formular ab. | |
| 158 | + | - Caption von *Button1* ändern Sie zu *Memo füllen*. | |
| 159 | + | - Im Eventhandler *OnClick* von *Button1* befüllen Sie das Memo mit einem beliebigen Text, wie im Beispiel [[TMemo/de|Zeilen direkt einfügen]]. | |
| 160 | + | - Caption von *Button2* ändern Sie zu *Memo speichern*. | |
| 161 | + | - Caption von *Button3* ändern Sie zu *Memo laden*. | |
| 162 | + | - nun ändern Sie noch die Eventhandler *OnClick* der Buttons: | |
| 163 | + | ||
| 164 | + | ``` pascal | |
| 165 | + | procedure TForm1.Button2Click(Sender: TObject); | |
| 166 | + | begin | |
| 167 | + | if SaveDialog1.Execute then | |
| 168 | + | Memo1.Lines.SaveToFile(SaveDialog1.FileName); | |
| 169 | + | end; | |
| 170 | + | ||
| 171 | + | procedure TForm1.Button3Click(Sender: TObject); | |
| 172 | + | begin | |
| 173 | + | if OpenDialog1.Execute then | |
| 174 | + | Memo1.Lines.LoadFromFile(OpenDialog1.FileName); | |
| 175 | + | end; | |
| 176 | + | ``` | |
| 177 | + | ||
| 178 | + | ## Siehe auch | |
| 179 | + | ||
| 180 | + | [[RichMemo|TRichMemo]] - Entspricht Delphi TRichEdit Komponente: formatierte Texte (farbig, Größe etc.)\ | |
| 181 | + | [[TListBox/de|TListBox]] - Eine scrollbare Liste von Strings | |
| 182 | + | ||
| 183 | + | --- | |
| 184 | + | *From the Free Pascal wiki, page "TMemo/de", as it stood on 2020-03-01 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
