Tipy pro TMemo - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Tipy pro TMemo

8. ledna 2002, 00.00 | V článku si ukážeme dva tipy, které můžete využít při práci se standardní komponentou TMemo v Delphi.

Každý programátor v Delphi zná určitě komponentu TMemo. Dnes se podíváme na dva malé zlepšováky, které vám mohou pomoci při práci s ní.

Režim vkládání a přepisu

Většina slušných textových editorů podporuje oba režimy zmíněné v podnadpisu, TMemo ale umí jenom režim vkládání. Nic nám ale nebrání si režim přepisování naemulovat. Přiznávám ale, že níže uvedená metoda není úplně programátorsky "čistá", jde spíš o malý trik.

Někde na počátku unity s formulářem je potřeba deklarovat globální proměnnou OverwriteMode typu Boolean. V té si budeme pamatovat, jaký režim uživatel zrovna nastavil. Pak do programu přidáme následujících několik řádků, zajišťujících obsluhu některých událostí našeho TMema:

procedure TForm1.Memo1KeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_INSERT) and (Shift = []) then
    OverWriteMode := not OverwriteMode;
end;

procedure TForm1.Memo1KeyPress (Sender: TObject; var Key: Char);
begin
  if ((Memo1.SelLength = 0) and OverwriteMode) then
    Memo1.SelLength := 1;
end;

Myslím, že celkem zřejmé, jak kód funguje. Za prvé obsluhujeme stisk klávesy Insert, která přepíná režim práce, a za druhé vždy pokud je stisknuta "písmenotvorná" klávesa a režim je nastaven na přepisování, zvětšíme délku aktuálního výběru na jedno písmeno. Ten je pak přepsán písmenem, jehož klávesu uživatel stiskl. Tuto činnost samozřejmě provádíme jenom když není vybrán žádný text - jinak by prodloužení výběru mělo nechtěné efekty (prodloužení existujícího výběru o jeden znak).

Mimochodem, teď mě napadá, že obsah procedury Memo1KeyDown by se dal zjednodušit na jeden příkaz:

OverWriteMode := (Key = VK_INSERT) and (Shift = []) xor OverwriteMode;

To už je ale pro optimalizační extremisty.

Zjištění čísla aktuálního řádku/sloupce

Užitečnou funkcí některých textových editorů je zobrazování souřadnic kurzoru. Komponenta TMemo na to nemá žádné speciální vlastnosti (pojmenované třeba Row nebo Col), takže si musíme pomoci "ručně" - přes Win32 API. Zašleme našemu memu zprávu EM_LINEFORMCHAR, pomocí které zjistíme, na kterém řádku se nachází kurzor. Pak pošleme další zprávu EM_LINEINDEX, která pro daný řádek vrátí index jeho prvního znaku. Když vrácenou hodnotu odečteme od vlastnosti SelStart (index znaku, kde se nachází kurzor resp. začátek výběru), získáme sloupec, ve kterém je kurzor. Při celém počítání nesmíme zapomenout na to, že interně jsou souřadnice počítány od nuly, kdežto uživatel by je samozřejmě rád viděl počítané od jedničky. Proto při zobrazování výsledku k přičteme k získaným souřadnicím jedničku.

Kousek kódu, zodpovědný za zobrazení souřadnic třeba na stavové liště je zde:

L := SendMessage(Memo1.Handle, EM_LINEFROMCHAR, Memo1.SelStart, 0);
C := SendMessage(Memo1.Handle, EM_LINEINDEX, L, 0);
StatusBar1.SimpleText := IntToStr(L + 1) + ':' 
  + IntToStr(Memo1.SelStart - C + 1);

Výše uvedený kód je dobré umístit do nějaké procedury a tu volat z procedur obsluhujících události OnKeyUp/Down a OnClick (případně i OnMouseUp/Down) daného mema. Jiným přístupem (ale asi méně vhodným) je volat ji z procedury obsluhující událost Application.OnIdle.

Toť pro dnešek vše a slibuji, že se ke komponentě TMemo ještě někdy vrátím.

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

Diskuse k článku

 

Vložit nový příspěvek   Sbalit příspěvky

 

Zatím nebyl uložen žádný příspěvek, buďte první.

 

 

Vložit nový příspěvek

Jméno:

Pohlaví:

,

E-mail:

Předmět:

Příspěvek:

 

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: