Tipy a triky v Delphi, díl 68.

Jak určit souřadnice kurzoru v komponentě Memo a jak zařídit, aby každá buňka komponenty StringGrid měla vlastní bublinkovou nápovědu ? Přesně to si dnes ukážeme.

Pozice kurzoru v komponentě Memo

Ukážeme si velmi jednoduchý trik, jak zjistit pozici kurzoru v komponentě Memo. Následujících několik řádků kódu nám zjistí, na kterém řádku se kurzor nachází, na kolikáté pozici daného řádku je kurzor umístěn a kolik znaků daný řádek obsahuje. Pozice kurzoru, vlastně jakési souřadnice X a Y, jsou počítány od nuly a počátek této "souřadnicové soustavy" je v levém horním rohu Mema. Levý horní roh má tedy souřadnice [0, 0]. Dále je třeba zdůraznit, že souřadnice jsou vždy absolutní, neposouvají se relativně vzhledem k počátku, takže pokud je komponenta Memo plná textu, který je odrolován mimo viditelnou část komponenty, vždy se souřadnice počítají od "odrolovaného" počátku a ne jen z viditelné části.

procedure TForm1.Button1Click(Sender: TObject);
var
  PoziceRadku, PoziceKurzoru, DelkaRadku: integer;
begin
  PoziceRadku := SendMessage(Memo1.Handle, EM_LINEFROMCHAR, Memo1.SelStart, 0);
  PoziceKurzoru := SendMessage(Memo1.Handle, EM_LINEINDEX, PoziceRadku, 0);
  DelkaRadku := SendMessage(Memo1.handle, EM_LINELENGTH, PoziceKurzoru, 0);
  PoziceKurzoru := Memo1.SelStart - PoziceKurzoru;
  ShowMessage(`Řádek: ` + IntToStr(PoziceRadku) + #13 + `Pozice kurzoru na řádku: ` + IntToStr(PoziceKurzoru) + #13 + `Délka řádku: ` + IntToStr(DelkaRadku));
end;

Každá buňka ve StringGrid s vlastním Hintem

I náš druhý dnešní tip souvisí vzdáleně se souřadnicemi. Předvedeme si velmi jednoduchý postup, pomocí kterého zajistíme, aby každá jednotlivá buňka komponenty StringGrid měla svojí vlastní bublinkou nápovědu (Hint). Jistě dobře víte, že standardně je zobrazena pro všechny buňky stejná nápověda, což ale není moc výhodné. Text nápovědy by se měl dynamicky měnit například na základě obsahu buňky, nad kterou se kurzor zrovna nachází a právě to si teď ukážeme.

Celá věc je vlastně náramně jednoduchá. Nejprve nadefinujeme v události OnCreate formuláře počáteční hodnotu nápovědy (v našem případě podle první buňky) a poté do události OnMouseMove komponenty StringGrid přidáme jednoduchý kód. Ten vždy nejprve zjistí, zda se kurzor nachází na jiné buňce než v předchozím případě (souřadnice jsou uloženy v globálních proměnných) a pokud tomu tak je, změní text nápovědy a ta se poté sama zobrazí. V naší malé ukázce se jako text nápovědy vždy zobrazí souřadnice buňky, nad kterou se kurzor právě nachází.

.
.
.
private
    { Private declarations }
    Sloupec: integer;
    Radek: integer;
.
.
.

procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Hint := `[0,0]`;
  StringGrid1.ShowHint := True;
end;

procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  r: integer;
  s: integer;
begin
  StringGrid1.MouseToCell(x, y, s, r);
  if ((Radek <> r) or (Sloupec <> s)) then
  begin
    Radek := r;
    Sloupec := s;
    Application.CancelHint;
    StringGrid1.Hint := `[`+ IntToStr(r) + `,` + IntToStr(s) + `]`;
  end;
end;

Nezapomeňte, že i v tomto případě se souřadnice počítají od nuly a začínají v levém horním rohu.

Diskuze (1) Další článek: SiS oficiálně uvádí grafický čip Xabre 600

Témata článku: Software, Programování, Díl, Jednoduchá pozice, Sloupec, Trik, Jednoduchý trik, Buňka


Určitě si přečtěte


Aktuální číslo časopisu Computer

Jak mobily určují svoji polohu?

Velký test notebooků pro studenty

Nejlepší reproduktory na párty

Služby a aplikace pro výuku angličtiny