Sign in Join
Wiki copytemporary

TMemo/de: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: TMemo/de

OldNewLine
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).*

Back to history