Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 75. - Skokový posun v komponentě Memo; Omezení rozsahu zadávaného textu v komponentě Edit

Jan Šindelář - 29.1.2003

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.