Delphi Tips & Tricks softsale > Delphi Tips & Tricks      

< poprzednia rada następna rada >

Zmiana sposobu wyświetlania Hintu

Zdarzenie OnShowHint klasy TApplication wywoływane jest przed wyświetleniem Hintu.

Podstawiając tu własną procedurę (tu przed_wys_hintu) możemy zmienić standardowy sposów wyświetlenia Hintu na przykład w zależności od tego, którego elementu na formie dotyczy.

Pola określające atrybuty Hintu znajdują się w rekordzie THintInfo o następującej deklaracji:

THintInfo=record
   HintControl   :Tcontrol;
   HintPos       :TPoint;
   HintMaxWidth  :Integer;
   HintColor     :TColor;
   CursorRect    :TRect;
   CursorPos     :TPoint;

........
Public
// tę deklarację trzeba wpisać ręcznie
procedure przed_wys_hintu(var Hintstr: string;
                          var CanShow:Boolean;
                      var hintInfo:THintInfo);
........

implementation

procedure TForm1.przed_wys_hintu(var Hintstr: string;
                                 var CanShow:Boolean;
                             var hintInfo:THintInfo);
begin
// Hint dla Speedbutton1 w kolorze clred
   if HintInfo.HintControl=SpeedButton1 then
      HintInfo.HintColor:=clred;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   // korzystając z metod klasy TApplication można zmieniać
   // domyślne ustawienia dotyczące Hintu dla całej aplikacji
   // poniżej wszystkie Hinty dla całej aplikacji
   // w kolorze claqua 
   Application.HintColor:=claqua;

   // można również zmieniać np wielkość pauzy
   // przed wyświetleniem Hintu
   Application.HintPause:=100;

   // zobacz także własności: HintShortPause oraz
   // HintHidePause dla obiektu klasy TApplication

   // Hint dla Speedbutton1 w kolorze clred
   // podstawienie własnej procedury obsługi
   Application.OnShowHint:=przed_wys_hintu;
end;

Zwróćmy również uwagę na to, że możemy sami bezpośrednio utworzyć Hint korzystając z klasy THintWindow.

implementation
var r:        thintwindow;

// procedura zwolnienia zasobów
procedure hintz(var Hint:ThintWindow);
begin
   hint.releasehandle;
   hint.free;
   hint:=nil;
end;

// Wykorzystano własność tag do określenia czy okienko ma być
// wyświetlone czy zwolnione po naciśnięciu przycisku

procedure TForm1.Button1Click(Sender: TObject);
begin
   if button1.tag=0 then
   begin
      button1.tag:=1;
      hinto(button1);
   end
   else
   if button1.tag=1 then
   begin
      button1.tag:=0;
      hintz(r);
   end;
end;

W ostatnim przykładzie wyświetlenie okienka Hintu wymagało naciśnięcia przycisku. Okienko było wyświetlane do momentu ponownego naciśnięcia przycisku. Zwróćmy uwagę, że położenie okienka na ekranie jest ściśle ustalone. Aby okienko Hintu wyświetlane było bez naciskania przycisku, tak jak standardowy Hint, ale na czas przez nas określony,( ustawienie Application.HintHidePause działa dla całej aplikacji), można wykorzystać zdarzenie OnHint klasy TApplication oraz komponent timer. Wymaga to zadeklarowania procedury w sekcji Public modułu, oraz zmiennej logicznej zwolnij. Należy też lekko zmodyfikować funkcję hinto.

Public
........

procedure moja(Sender:TObject);
   ........
   implementation
   var r:        thintwindow;
   var zwolnij   :boolean;


function hinto(Control:Tcontrol):ThintWindow;
   var
   tekst_hintu:string;
   Ahint:array[0..255] of char;
   HintPos:TPoint;
   HintBox:TRect;

   begin

      // modyfikacja funkcji hinto
      if not zwolnij then
      begin
         // ........
         // utwórz okienko
         // ........

         // bez zmian

         // ........
         // pokaż okienko
         Result.ActivateHint(HintBox,tekst_hintu);

         // modyfikacja funkcji hinto
         // ........
         zwolnij:=true;
      end;
   // ........
   end;


procedure TForm1.moja(Sender:TObject);
begin
   hinto(button1);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
// podstawienie własnej procedury obsługi zdarzenia OnHint
   Application.OnHint:=moja;
   zwolnij:=false;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
   if zwolnij then
   begin
      r.ReleaseHandle;
      r.free;
      r:=nil;
      zwolnij:=false;
   end;
end;

Aby wszystko zadziałało prawidłowo należy jeszcze: zmienić defoltową wartość własności Interval komponentu TTimer np na 3000 (3s), oraz wpisać cokolwiek do własności Hint naszego przycisku, aby wygenerować zdarzenie OnHint. Zwróćmy uwagę, że własność ShowHint przycisku może mieć wartość False.


SOFTSALE - Oprogramowanie i Szkolenia
softsale@softsale.com.pl

03-565 Warszawa , ul. Borzymowska 43 lok. 301C
tel/fax:4084840,GSM:0607612428