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

Tipy a triky v Delphi, díl 133. - měníme tvar kurzoru

Jan Šindelář - 7.4.2004

Jako u většiny textových komponent je po aktivaci Mema zobrazen blikající textový kurzor, který udává aktuální pozici v textu. My se dnes naučíme, jak tento kurzor skrýt. Uznávám, že to není pro uživatele moc praktické, když nevidí, kam zrovna píše, ale reálné využití tohoto tipu už ponechám na vaší fantazii.

Opět využijeme systému zpráv Windows a ošetříme události OnEnter, OnChange a OnExit komponenty Memo. Hlavní práci však pro nás vykoná funkce CreateCaret, která se postará o vytvoření tvaru kurzoru. Může jím být buď běžná čára, kterou známe všichni, blok a nebo bitmapa. Pro bližší zkoumání problému vás odkazuji na adresu MSDN, kde se dozvíte více.

Dnes nám bude stačit jen to, že pokud vynulujeme příslušný parametr funkce, kurzor vlastně zmizí. Na formulář tedy umístíme Memo a zbytek je již vidět ve zdrojovém kódu.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

const
  WM_MYMEMO_ENTER = WM_USER + 500;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure Memo1Enter(Sender: TObject);
    procedure Memo1Exit(Sender: TObject);
    procedure Memo1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure WMMYMEMOENTER(var Message: TMessage); message WM_MYMEMO_ENTER;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Memo1Enter(Sender: TObject);
begin
  PostMessage(Handle, WM_MYMEMO_ENTER, 0, 0);
end;

procedure TForm1.Memo1Exit(Sender: TObject);
begin
  CreateCaret(Memo1.Handle, 1, 1, 1);
end;

procedure TForm1.Memo1Change(Sender: TObject);
begin
  CreateCaret(Memo1.Handle, 0, 0, 0);
end;

procedure TForm1.WMMYMEMOENTER(var Message: TMessage) ;
begin
  CreateCaret(Memo1.Handle, 0, 0, 0);
end;

end.

Přidáte-li na formulář další textovou komponentu, její kurzor bude normální. Vlastníkem nového kurzoru je pouze vybrané Memo a změny se tak týkají pouze této komponenty. Aktivací jiného textového objektu na formuláři si můžete sami ověřit, že kurzor je opět vidět. Z tohoto pohledu se tak může zdát zbytečné i to, co provádíme v události OnExit a dokonce i v OnChange, ale jistota je jistota a máme tak zaručenu neviditelnost (či jiný tvar) kurzoru i v případě, že se tvar pokusí změnit někdo jiný (myšleno cizí aplikace) a navíc po sobě i "uklidíme", když uživatel aktivuje jinou komponentu.