Tipy a triky v Delphi, díl 198. - další vylepšení Mema

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í.

Diskuze (1) Další článek: Ani VyVolení nebudou mít živý přenos zdarma

Témata článku: , , , , , , , , , , , ,