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

Tipy a triky v Delphi, díl 68. - Pozice kurzoru v komponentě Memo; Každá buňka ve StringGrid s vlastním Hintem

Jan Šindelář - 27.11.2002

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.