Difference between revisions of "TMemo"
(9 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
− | + | {{TMemo}} | |
− | + | A '''TMemo''' [[image:tmemo.png]] is a control with multiple lines of editable text. It is available from the [[Standard tab]] of the [[Component Palette]]. | |
+ | ==Usage== | ||
+ | To use a TMemo on a [[TForm|form]], you can simply select it on the ''Standard'' component pallet and place it by clicking on the form. In this text box, you can now edit a multiline text at run time. | ||
+ | For example, have you added a TMemo ''Memo1'' to your form ''Form1'', you can use '''<code>Memo1.Text:='this is a singleline text';</code>''' to assign a [[String]]. | ||
+ | Also you can use anywhere in the source code the stored text of ''Memo1'' with '''<code>myString:=Memo1.Text;</code>'''. | ||
+ | It is also possible to assign a multiline text with '''<code>Memo1.Text:='This'+LineEnding+'is'+LineEnding+'a'+LineEnding+'multiline'+LineEnding+'text'; | ||
+ | </code>'''. | ||
+ | ===Assignment of a TStrings or TStringList=== | ||
+ | Common, to assign a text to a TMemo is the use of a [[TStringList-TStrings Tutorial|TStringList]] or its parent [[TStringList-TStrings Tutorial|TStrings]]. The following example shows this (in the event handler of an inserted [[TButton]] ''Button1'' in a [[TForm|form]] ''Form1'' and a TMemo ''Memo1'' on it): | ||
− | This is a | + | <syntaxhighlight lang=pascal> |
+ | procedure TForm1.Button1Click(Sender: TObject); | ||
+ | var | ||
+ | myStringList: TStringList; | ||
+ | begin | ||
+ | myStringList:=TStringList.Create; //Create my StringList | ||
+ | myStringList.Add('This is the first line.'); //add a line | ||
+ | myStringList.Add('This is the second line.'); | ||
+ | myStringList.Add('This is the third line.'); | ||
+ | myStringList.Add('etc.'); | ||
+ | Memo1.Lines.Assign(myStringList); //assign text content | ||
+ | myStringList.Free; //free my StringList | ||
+ | end; | ||
+ | </syntaxhighlight> | ||
− | + | ===Insert lines directly=== | |
− | + | You can add directly the contents of the memo for example: | |
+ | |||
+ | <syntaxhighlight lang=pascal> | ||
+ | procedure TForm1.Button1Click(Sender: TObject); | ||
+ | begin | ||
+ | Memo1.Lines.Clear; //delete all lines of Memo1 | ||
+ | Memo1.Lines.Add('This is the first line.'); //add a line | ||
+ | Memo1.Lines.Add('This is the second line.'); | ||
+ | Memo1.Lines.Add('This is the third line.'); | ||
+ | Memo1.Lines.Add('etc.'); | ||
+ | end; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===Read a line=== | ||
+ | If you want to know what is in a particular line, you can check it directly with '''<code>myString:=Memo1.Lines[Index];</code>'''. Note, the index of ''TMemo.Lines'' is zero based, i.e. the first line would be: '''<code>myString:=Memo1.Lines[0];</code>''' | ||
+ | |||
+ | The preceding example add yet a TButton ''Button2'', you can display the third line as follows: | ||
+ | |||
+ | <syntaxhighlight lang=pascal> | ||
+ | procedure TForm1.Button2Click(Sender: TObject); | ||
+ | begin | ||
+ | ShowMessage(Memo1.Lines[2]); | ||
+ | end; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===Selected text=== | ||
+ | You can mark text parts at run time by holding the left mouse button or press and hold the [Shift] key and select the text with the mouse or keyboard. This text ([[String]]) you can display like this: | ||
+ | |||
+ | <syntaxhighlight lang=pascal> | ||
+ | procedure TForm1.Button2Click(Sender: TObject); | ||
+ | begin | ||
+ | ShowMessage(Memo1.SelText); | ||
+ | end; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===Search text=== | ||
+ | |||
+ | Contrary to the previous example, you can also looking for a text ([[String]]) in a TMemo and return the place where it is: '''<code>Position:=Memo1.SelStart;</code>''' | ||
+ | |||
+ | The following example shows how you can search and search further for a text in a memo: | ||
+ | * Create a new application with a [[TEdit]] ''Edit1'', a TMemo ''Memo1'' and two [[TButton]] ''Button1'' and ''Button2''. | ||
+ | * Complete the uses clause to '''LCLProc''' and '''strutils'''. | ||
+ | * In the event handler ''OnClick'' of ''Button1'' fill the memo with any text, as in the example [[TMemo#Insert lines directly|Insert lines directly]]. | ||
+ | * In the source text editor add following function (based on the [http://www.lazarusforum.de/viewtopic.php?p=39260#p39260 example] from the German Lazarusforum): | ||
+ | |||
+ | <syntaxhighlight lang=pascal> | ||
+ | // FindInMemo: Returns the position where the string to search was found | ||
+ | function FindInMemo(AMemo: TMemo; AString: String; StartPos: Integer): Integer; | ||
+ | begin | ||
+ | Result := PosEx(AString, AMemo.Text, StartPos); | ||
+ | if Result > 0 then | ||
+ | begin | ||
+ | AMemo.SelStart := UTF8Length(PChar(AMemo.Text), Result - 1); | ||
+ | AMemo.SelLength := Length(AString); | ||
+ | AMemo.SetFocus; | ||
+ | end; | ||
+ | end; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | * Now, add following code in the event handler ''OnClick'' from ''Button2'': | ||
+ | |||
+ | <syntaxhighlight lang=pascal> | ||
+ | procedure TForm1.Button2Click(Sender: TObject); | ||
+ | const | ||
+ | SearchStr: String = ''; // The string to search for | ||
+ | SearchStart: Integer = 0; // Last position of the string to search for | ||
+ | begin | ||
+ | if SearchStr <> Edit1.Text then begin // Falls sich der zu suchende String geändert hat | ||
+ | SearchStart := 0; | ||
+ | SearchStr := Edit1.Text; | ||
+ | end; | ||
+ | SearchStart := FindInMemo(Memo1, SearchStr, SearchStart + 1); | ||
+ | |||
+ | if SearchStart > 0 then | ||
+ | Caption := 'Found at position['+IntToStr(SearchStart)+']!' | ||
+ | else | ||
+ | Caption := 'No further finds!'; | ||
+ | end; | ||
+ | </syntaxhighlight> | ||
+ | * Now at run time, you can fill the memo with a text with ''Button1'', paste the text to be searched in ''Edit1'' and looking or keep looking for these in memo with ''Button2''. | ||
+ | |||
+ | ==== EM_SCROLLCARET ==== | ||
+ | Messages like EM_SCROLLCARET as used in windows are not available in Lazarus and thus need a workaround... | ||
+ | |||
+ | ===Save and load=== | ||
+ | You can quite easily save and load the contents of a memo by using the methods ''SaveToFile'' and ''LoadFromFile'' of the class [[TStringList-TStrings Tutorial|TStrings]]. | ||
+ | |||
+ | The following example shows you how: | ||
+ | |||
+ | * Create a new application with a TMemo ''Memo1'' and three [[TButton]] ''Button1'', ''Button2'' and ''Button3''. | ||
+ | * Additionally put a [[TSaveDialog]] and a [[TOpenDialog]] from the component palette ''Dialogs'' on the form. | ||
+ | * Change Caption of ''Button1'' to "Fill memo". | ||
+ | * In the event handler ''OnClick'' of ''Button1'' fill the memo with any text, as in the example [[TMemo#Insert lines directly|Insert lines directly]]. | ||
+ | * Change Caption of ''Button2'' to "Save memo". | ||
+ | * Change Caption of ''Button3'' to "Load memo". | ||
+ | * now modify the event handler ''OnClick'' of the buttons: | ||
+ | |||
+ | <syntaxhighlight lang=pascal> | ||
+ | procedure TForm1.Button2Click(Sender: TObject); | ||
+ | begin | ||
+ | if SaveDialog1.Execute then | ||
+ | Memo1.Lines.SaveToFile(SaveDialog1.FileName); | ||
+ | end; | ||
+ | |||
+ | procedure TForm1.Button3Click(Sender: TObject); | ||
+ | begin | ||
+ | if OpenDialog1.Execute then | ||
+ | Memo1.Lines.LoadFromFile(OpenDialog1.FileName); | ||
+ | end; | ||
+ | </syntaxhighlight> | ||
+ | ==See also== | ||
+ | * [[doc:lcl/stdctrls/tmemo.html|TMemo doc]] | ||
+ | * [[RichMemo|TRichMemo]] - Like Delphi TRichEdit component: formatted text (color, size, etc.) | ||
+ | * [[TListBox]] - A scrollable list of strings | ||
− | + | {{LCL Components}} |
Latest revision as of 12:14, 25 May 2021
│
Deutsch (de) │
English (en) │
suomi (fi) │
français (fr) │
日本語 (ja) │
русский (ru) │
A TMemo is a control with multiple lines of editable text. It is available from the Standard tab of the Component Palette.
Usage
To use a TMemo on a form, you can simply select it on the Standard component pallet and place it by clicking on the form. In this text box, you can now edit a multiline text at run time.
For example, have you added a TMemo Memo1 to your form Form1, you can use Memo1.Text:='this is a singleline text';
to assign a String.
Also you can use anywhere in the source code the stored text of Memo1 with myString:=Memo1.Text;
.
It is also possible to assign a multiline text with Memo1.Text:='This'+LineEnding+'is'+LineEnding+'a'+LineEnding+'multiline'+LineEnding+'text';
.
Assignment of a TStrings or TStringList
Common, to assign a text to a TMemo is the use of a TStringList or its parent TStrings. The following example shows this (in the event handler of an inserted TButton Button1 in a form Form1 and a TMemo Memo1 on it):
procedure TForm1.Button1Click(Sender: TObject);
var
myStringList: TStringList;
begin
myStringList:=TStringList.Create; //Create my StringList
myStringList.Add('This is the first line.'); //add a line
myStringList.Add('This is the second line.');
myStringList.Add('This is the third line.');
myStringList.Add('etc.');
Memo1.Lines.Assign(myStringList); //assign text content
myStringList.Free; //free my StringList
end;
Insert lines directly
You can add directly the contents of the memo for example:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Clear; //delete all lines of Memo1
Memo1.Lines.Add('This is the first line.'); //add a line
Memo1.Lines.Add('This is the second line.');
Memo1.Lines.Add('This is the third line.');
Memo1.Lines.Add('etc.');
end;
Read a line
If you want to know what is in a particular line, you can check it directly with myString:=Memo1.Lines[Index];
. Note, the index of TMemo.Lines is zero based, i.e. the first line would be: myString:=Memo1.Lines[0];
The preceding example add yet a TButton Button2, you can display the third line as follows:
procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(Memo1.Lines[2]);
end;
Selected text
You can mark text parts at run time by holding the left mouse button or press and hold the [Shift] key and select the text with the mouse or keyboard. This text (String) you can display like this:
procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(Memo1.SelText);
end;
Search text
Contrary to the previous example, you can also looking for a text (String) in a TMemo and return the place where it is: Position:=Memo1.SelStart;
The following example shows how you can search and search further for a text in a memo:
- Create a new application with a TEdit Edit1, a TMemo Memo1 and two TButton Button1 and Button2.
- Complete the uses clause to LCLProc and strutils.
- In the event handler OnClick of Button1 fill the memo with any text, as in the example Insert lines directly.
- In the source text editor add following function (based on the example from the German Lazarusforum):
// FindInMemo: Returns the position where the string to search was found
function FindInMemo(AMemo: TMemo; AString: String; StartPos: Integer): Integer;
begin
Result := PosEx(AString, AMemo.Text, StartPos);
if Result > 0 then
begin
AMemo.SelStart := UTF8Length(PChar(AMemo.Text), Result - 1);
AMemo.SelLength := Length(AString);
AMemo.SetFocus;
end;
end;
- Now, add following code in the event handler OnClick from Button2:
procedure TForm1.Button2Click(Sender: TObject);
const
SearchStr: String = ''; // The string to search for
SearchStart: Integer = 0; // Last position of the string to search for
begin
if SearchStr <> Edit1.Text then begin // Falls sich der zu suchende String geändert hat
SearchStart := 0;
SearchStr := Edit1.Text;
end;
SearchStart := FindInMemo(Memo1, SearchStr, SearchStart + 1);
if SearchStart > 0 then
Caption := 'Found at position['+IntToStr(SearchStart)+']!'
else
Caption := 'No further finds!';
end;
- Now at run time, you can fill the memo with a text with Button1, paste the text to be searched in Edit1 and looking or keep looking for these in memo with Button2.
EM_SCROLLCARET
Messages like EM_SCROLLCARET as used in windows are not available in Lazarus and thus need a workaround...
Save and load
You can quite easily save and load the contents of a memo by using the methods SaveToFile and LoadFromFile of the class TStrings.
The following example shows you how:
- Create a new application with a TMemo Memo1 and three TButton Button1, Button2 and Button3.
- Additionally put a TSaveDialog and a TOpenDialog from the component palette Dialogs on the form.
- Change Caption of Button1 to "Fill memo".
- In the event handler OnClick of Button1 fill the memo with any text, as in the example Insert lines directly.
- Change Caption of Button2 to "Save memo".
- Change Caption of Button3 to "Load memo".
- now modify the event handler OnClick of the buttons:
procedure TForm1.Button2Click(Sender: TObject);
begin
if SaveDialog1.Execute then
Memo1.Lines.SaveToFile(SaveDialog1.FileName);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;
See also
- TMemo doc
- TRichMemo - Like Delphi TRichEdit component: formatted text (color, size, etc.)
- TListBox - A scrollable list of strings