Dva dnešní tipy se týkají komponenty Memo. V prvním tipu se naučíme označovat celý řádek textu po kliknutí myší, druhý příklad pak ukazuje, jak nastavit odsazení textu od okraje.
Označování řádku myší
První tip se týká označení celého řádku textu, pokud na něj uživatel klikne. Je to obvyklá funkce textových editorů, samozřejmě se liší způsob a místo, kam je třeba kliknout. V našem případě to bude přímo do textu a daný řádek se celý označí.
Jak na to? Začneme nejprve vytvořením nového projektu. Jelikož se oba dnešní tipy týkají komponenty Memo, použijeme jeden společný program. Na formulář pak už stačí umístit jen Memo. Příklad s označováním řádku bude "navěšen" na událost OnClick této komponenty. Ta spustí funkci SelectMemoLine, kterou si pro tento účel připravíme.
Jak jinak, opět půjde o zprávy systému. Funkci pošleme jako parametr pouze jméno komponenty Memo, o kterou se nám jedná. Funkce si pak sama zjistí, na kterém řádku se nacházíme a pomocí vlastností SelStart a SelLength označíme text řádku. Vše je velmi názorně vidět ve zdrojovém kódu (viz dále)
Pravý a levý okraj
Pro druhý příklad budeme potřebovat tlačítko, které celou akci spustí, takže jej přidáme na formulář. Co bude umět? Nastaví v komponentě Memo okraje, které si sami zvolíme. Implicitně jsou nulové a text se píše od levého horního rohu. Jednoduchým způsobem můžeme zařídit odsazení celého textu zleva i zprava a to opět s využitím zpráv Windows. V ukázce jsou použity hodnoty 20 a 10 pixelů. Nyní již tedy slibovaný zdrojový kód:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Memo1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure SelectMemoLine(Memo: TCustomMemo) ;
var
Line: integer;
begin
with Memo do
begin
Line := Perform(EM_LINEFROMCHAR, SelStart, 0) ;
SelStart := Perform(EM_LINEINDEX, Line, 0) ;
SelLength := Length(Lines[Line]);
end;
end;
procedure TForm1.Memo1Click(Sender: TObject);
begin
SelectMemoLine(Memo1);
end;
procedure TForm1.Button1Click(Sender: TObject) ;
var
R: TRect;
LeftMargin, RightMargin: integer;
begin
LeftMargin := 20;
RightMargin := 10;
R := Memo1.ClientRect;
R.Left := R.Left + LeftMargin;
R.Top := R.Top + 2;
R.Bottom := R.Bottom - 2;
R.Right := R.Right - RightMargin;
SendMessage(Memo1.Handle, EM_SETRECT, 0, Longint(@R)) ;
end;
end.
Program by měl bez problému běžet i ve starších Windows, ale opět připomínám, že zde je kapacita komponenty Memo omezena na 64 kB. Pro skutečný textový editor tak není tato komponenta příliš vhodná. Pro krátké informační texty je však dostačující.