TMemo/de: what changed
Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | 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 | 2 | ||
| 3 | 3 | ## Beschreibung | |
| 4 | 4 | ||
| 5 | 5 | Ein Steuerelement um mehrzeilige Texte zu editieren. | |
| 6 | 6 | ||
| 7 | - | ||
| 8 | - | ||
| 9 | - | ||
| 10 | - | ||
| 7 | + |  | |
| 11 | 8 | ||
| 12 | 9 | ## Verwendung | |
| 13 | 10 | ||
| 14 | 11 | 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 | - | ||
| 12 | + | ||
| 16 | 13 | 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 | 14 | Ebenso können Sie überall im Quelltext auf den hinterlegten Text mit **`myString:=Memo1.Text;`** zugreifen.\ | |
| 18 | 15 | Möglich ist es auch, einen mehrzeiligen Text *Memo1* zuzuweisen mit **`Memo1.Text:='Das'+LineEnding+'ist'+LineEnding+'ein'+LineEnding+'mehrzeiliger'+LineEnding+'Text';`**.\ | |
| 19 | 16 | ||
| 20 | 17 | ### Zuweisung eines TStrings oder TStringList | |
| 21 | 18 | ||
| 22 | 19 | Ü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 | 20 | ||
| 24 | 21 | ``` pascal | |
| 25 | 22 | procedure TForm1.Button1Click(Sender: TObject); | |
| 26 | 23 | var | |
| 27 | 24 | myStringList: TStringList; | |
| 28 | 25 | begin | |
| 29 | 26 | myStringList:=TStringList.Create; //Meine StringList erstellen | |
| 30 | 27 | myStringList.Add('Das ist die erste Zeile.'); //dieser eine Zeile zufügen | |
| 31 | 28 | myStringList.Add('Das ist die zweite Zeile.'); | |
| 32 | 29 | myStringList.Add('Das ist die dritte Zeile.'); | |
| 33 | 30 | myStringList.Add('usw.'); | |
| 34 | 31 | Memo1.Lines.Assign(myStringList); //dem Memo1 den Textinhalt meine StringList zuweisen | |
| 35 | 32 | myStringList.Free; //Meine StringList im Speicher wieder freigeben | |
| 36 | 33 | end; | |
| 37 | 34 | ``` | |
| 38 | 35 | ||
| 39 | 36 | ### Zeilen direkt einfügen | |
| 40 | 37 | ||
| 41 | 38 | Sie können dem Memo den Inhalt auch direkt zufügen z.B.: | |
| 42 | 39 | ||
| 43 | 40 | ``` pascal | |
| 44 | 41 | procedure TForm1.Button1Click(Sender: TObject); | |
| 45 | 42 | begin | |
| 46 | 43 | Memo1.Lines.Clear; //alle Zeilen von Memo1 löschen | |
| 47 | 44 | Memo1.Lines.Add('Das ist die erste Zeile.'); //Zeile hinzufügen | |
| 48 | 45 | Memo1.Lines.Add('Das ist die zweite Zeile.'); | |
| 49 | 46 | Memo1.Lines.Add('Das ist die dritte Zeile.'); | |
| 50 | 47 | Memo1.Lines.Add('usw.'); | |
| 51 | 48 | end; | |
| 52 | 49 | ``` | |
| 53 | 50 | ||
| 54 | 51 | ### Eine Zeile auslesen | |
| 55 | 52 | ||
| 56 | 53 | 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 | 54 | ||
| 58 | 55 | Fügen Sie dem vorhergehenden Beispiel noch einen TButton *Button2* hinzu, können Sie sich die dritte Zeile wie folgt ausgeben lassen: | |
| 59 | 56 | ||
| 60 | 57 | ``` pascal | |
| 61 | 58 | procedure TForm1.Button2Click(Sender: TObject); | |
| 62 | 59 | begin | |
| 63 | 60 | ShowMessage(Memo1.Lines[2]); | |
| 64 | 61 | end; | |
| 65 | 62 | ``` | |
| 66 | 63 | ||
| 67 | 64 | ### Bestimmte Zeile(n) löschen | |
| 68 | 65 | ||
| 69 | 66 | Sie können im Memo Zeilen mit einem bestimmten Inhalt direkt löschen: | |
| 70 | 67 | ||
| 71 | 68 | ``` pascal | |
| 72 | 69 | procedure subZeileLoeschen(AMemo: TMemo; AString: String); | |
| 73 | 70 | var intIndex: Integer; | |
| 74 | 71 | begin | |
| 75 | 72 | ||
| 76 | 73 | intIndex := 0; | |
| 77 | 74 | ||
| 78 | 75 | while intIndex < AMemo.Lines.Count do | |
| 79 | 76 | begin | |
| 80 | 77 | // Enthält die aktuelle Zeile den gesuchten Text, | |
| 81 | 78 | // dann lösch die Zeile und erhöhe nicht den Index | |
| 82 | 79 | if (AnsiContainsStr(AMemo.Lines[intIndex], AString)) then | |
| 83 | 80 | AMemo.Lines.Delete(intIndex) | |
| 84 | 81 | else | |
| 85 | 82 | Inc(intIndex); // erhöhe den Index | |
| 86 | 83 | end; | |
| 87 | 84 | ||
| 88 | 85 | end; | |
| 89 | 86 | ``` | |
| 90 | 87 | ||
| 91 | 88 | ### Textmarkierung | |
| 92 | 89 | ||
| 93 | 90 | 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 | 91 | ||
| 95 | 92 | ``` pascal | |
| 96 | 93 | procedure TForm1.Button2Click(Sender: TObject); | |
| 97 | 94 | begin | |
| 98 | 95 | ShowMessage(Memo1.SelText); | |
| 99 | 96 | end; | |
| 100 | 97 | ``` | |
| 101 | 98 | ||
| 102 | 99 | ### Text suchen | |
| 103 | 100 | ||
| 104 | 101 | 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 | 102 | ||
| 106 | 103 | Folgendes kleines Beispiel zeigt, wie Sie einen Text in einem Memo suchen und weitersuchen können: | |
| 107 | 104 | ||
| 108 | 105 | - Erstellen Sie eine neue Anwendung, mit einem [[TEdit/de|TEdit]] *Edit1*, einem TMemo *Memo1* und zwei [[TButton/de|TButtons]] *Button1* und *Button2*. | |
| 109 | 106 | - Ergänzen Sie die Uses-Klausel um die [[Unit/de|Units]] *LCLProc* und *strutils*. | |
| 110 | 107 | - Füllen Sie im Eventhandler *OnClick* von *Button1* das Memo mit einem beliebigen Text, wie im Beispiel [[TMemo/de|Zeilen direkt einfügen]]. | |
| 111 | 108 | - 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 | 109 | ||
| 113 | 110 | ``` pascal | |
| 114 | 111 | // FindInMemo: gibt die Stelle zurück, wo der zu suchende String gefunden wurde | |
| 115 | 112 | function FindInMemo(AMemo: TMemo; AString: String; StartPos: Integer): Integer; | |
| 116 | 113 | begin | |
| 117 | 114 | Result := PosEx(AString, AMemo.Text, StartPos); | |
| 118 | 115 | if Result > 0 then | |
| 119 | 116 | begin | |
| 120 | 117 | AMemo.SelStart := UTF8Length(PChar(AMemo.Text), Result - 1); | |
| 121 | 118 | AMemo.SelLength := Length(AString); | |
| 122 | 119 | AMemo.SetFocus; | |
| 123 | 120 | end; | |
| 124 | 121 | end; | |
| 125 | 122 | ``` | |
| 126 | 123 | ||
| 127 | 124 | - Ergänzen Sie nun noch im Eventhandler *OnClick* von *Button2* folgenden Code: | |
| 128 | 125 | ||
| 129 | 126 | ``` pascal | |
| 130 | 127 | procedure TForm1.Button2Click(Sender: TObject); | |
| 131 | 128 | const | |
| 132 | 129 | SuchStr: String = ''; // Der zu suchende String | |
| 133 | 130 | SuchStart: Integer = 0; // Letzte Fundstelle des zu suchenden Strings | |
| 134 | 131 | begin | |
| 135 | 132 | if SuchStr <> Edit1.Text then begin // Falls sich der zu suchende String geändert hat | |
| 136 | 133 | SuchStart := 0; | |
| 137 | 134 | SuchStr := Edit1.Text; | |
| 138 | 135 | end; | |
| 139 | 136 | SuchStart := FindInMemo(Memo1, SuchStr, SuchStart + 1); | |
| 140 | 137 | ||
| 141 | 138 | if SuchStart > 0 then | |
| 142 | 139 | Caption := 'Bei Memo1.SelStart['+IntToStr(SuchStart)+'] gefunden!' | |
| 143 | 140 | else | |
| 144 | 141 | Caption := 'Keine weiteren Funde!'; | |
| 145 | 142 | end; | |
| 146 | 143 | ``` | |
| 147 | 144 | ||
| 148 | 145 | - 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 | 146 | ||
| 150 | 147 | ### Speichern und Laden | |
| 151 | 148 | ||
| 152 | 149 | 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 | 150 | ||
| 154 | 151 | Folgendes Beispiel zeigt Ihnen wie: | |
| 155 | 152 | ||
| 156 | 153 | - Erstellen Sie eine neue Anwendung, mit einem TMemo *Memo1* und drei [[TButton/de|TButtons]] *Button1*, *Button2* und *Button3*. | |
| 157 | 154 | - Legen Sie zusätzlich noch ein [[TSaveDialog]] und einen [[TOpenDialog]] von der Komponentenpalette *Dialogs* auf dem Formular ab. | |
| 158 | 155 | - Caption von *Button1* ändern Sie zu *Memo füllen*. | |
| 159 | 156 | - Im Eventhandler *OnClick* von *Button1* befüllen Sie das Memo mit einem beliebigen Text, wie im Beispiel [[TMemo/de|Zeilen direkt einfügen]]. | |
| 160 | 157 | - Caption von *Button2* ändern Sie zu *Memo speichern*. | |
| 161 | 158 | - Caption von *Button3* ändern Sie zu *Memo laden*. | |
| 162 | 159 | - nun ändern Sie noch die Eventhandler *OnClick* der Buttons: | |
| 163 | 160 | ||
| 164 | 161 | ``` pascal | |
| 165 | 162 | procedure TForm1.Button2Click(Sender: TObject); | |
| 166 | 163 | begin | |
| 167 | 164 | if SaveDialog1.Execute then | |
| 168 | 165 | Memo1.Lines.SaveToFile(SaveDialog1.FileName); | |
| 169 | 166 | end; | |
| 170 | 167 | ||
| 171 | 168 | procedure TForm1.Button3Click(Sender: TObject); | |
| 172 | 169 | begin | |
| 173 | 170 | if OpenDialog1.Execute then | |
| 174 | 171 | Memo1.Lines.LoadFromFile(OpenDialog1.FileName); | |
| 175 | 172 | end; | |
| 176 | 173 | ``` | |
| 177 | 174 | ||
| 178 | 175 | ## Siehe auch | |
| 179 | 176 | ||
| 180 | 177 | [[RichMemo|TRichMemo]] - Entspricht Delphi TRichEdit Komponente: formatierte Texte (farbig, Größe etc.)\ | |
| 181 | 178 | [[TListBox/de|TListBox]] - Eine scrollbare Liste von Strings | |
| 182 | 179 | ||
| 183 | 180 | --- | |
| 184 | 181 | *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).* |
