Jak se rychle posunovat v textu u komponenty Memo? A jak upravit komponentu Edit tak, aby mohl uživatel vkládat jen vámi definované znaky? To bude náplní dnešního dílu.
Skokový posun v komponentě Memo
Následující jednoduchý tip umožňuje programově bez zásahu uživatele měnit pozici v komponentě Memo. Efekt bude stejný, jako kdyby uživatel listoval v dlouhém textu pomocí kláves PageUp a PageDown. Princip je jednoduchý a opět je využito systému zpráv Windows. Dvě procedury, sloužící ke skoku dopředu a nebo nazpět v textu, vlastně jen pošlou příslušné komponentě Memo zprávu o tom, že má provést daný skok v textu. Parametrem obou procedur je pouze komponenta Memo, na kterou se má celá akce aplikovat.
Obě procedury s jednoduchým příkladem s využitím dvou tlačítek následují:
procedure MemoPageDown(Memo: TMemo);
begin
SendMessage(Memo.Handle, WM_VSCROLL, SB_PAGEDOWN, 0);
end;
procedure MemoPageUp(Memo: TMemo);
begin
SendMessage(Memo.Handle, WM_VSCROLL, SB_PAGEUP, 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MemoPageDown(Memo1);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
MemoPageUp(Memo1);
end;
Omezení rozsahu zadávaného textu v komponentě Edit
Jistě občas potřebuje ve svých aplikacích zajistit to, aby uživatelem vložená data do komponenty Edit splňovala jisté parametry. Někdy jsou data číselná a pak je třeba kontrolovat, zda uživatel nevložil nějaký text a nebo naopak. Vkládaná data je prostě potřeba kontrolovat na správnost vložených údajů či jejich rozsah. A proč to zajišťovat až poté, co uživatel data "odešle" programu? Můžeme to udělat rovnou (tedy alespoň částečně) tím, že omezíme množinu znaků, které bude komponenta akceptovat. Tyto znaky mohou být například jen číslice nebo naopak pouze písmena a nebo třeba jen několik písmen, vše záleží pouze na vás. Pokusí-li se uživatel zadat jiné znaky než povolené, nestane se nic.
Celý kód této jednoduché kontroly vložíme přímo do události OnKeyPress příslušné komponenty Edit. Zde zároveň nadefinujeme konstantu (řetězec), obsahující "povolené" znaky. Následující příklad tedy uživateli dovolí vložit pouze čísla:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
const
Chars: string = `0123456789`;
var
i: Integer;
OK: Boolean;
begin
i := 0;
OK := False;
if Key = #8 then OK := True;
repeat
i := i + 1;
if Key = Chars[i] then OK := True;
until (OK) or (i = Length(Chars));
if not OK then Key := #0;
end;
Kromě znaků definovaných konstantou je ještě povolen jeden "znak" a tím je klávesa BackSpace (reprezentovaná číslem #8). Jinak by totiž nebylo možné napsaný text mazat.