| Delphi Tips & Tricks | softsale > Delphi Tips & Tricks |
| < poprzednia rada | następna rada > |
Zmiana sposobu wyświetlania HintuZdarzenie 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 |