Çeviri: Ramazan Gülbahar.
TComboBox İçindeki Nesneler İçin OnMouseOver Olayını Kullanarak Hint Göstermek
TcomboBox’un açılır menüsünde, farenin altındaki nesnelerin başlıklarını hint olarak göstereceğiz. Her bir nesne için başlığı algılayacağız ve o başlığı ayrı bir hint göstereceğiz.
TComboBox.Items OnMouseMove
Sıralı nesnelerin üzerine fare gelince hint göstermek için, geçerli olan listeye bir mesaj göndermek gerekir. Bu kodun yerleştirilmesi gereken en mantıklı yer Application.OnIdle olayıdır, bu olay kullanıcı beklerken istenen işlemleri gerçekleştirebilir.
Aşşağıdaki kod TcomboBox içinde farenin altındaki nesnelerin başlıklarını algılar. İlk olarak farenin altındaki pencerenin handle’ını algılayacağız(WindowFromPoint), Pencerenin bir ComboBox olup olmadığını kontrol edeceğiz(GetClassName). İkinci olarak “LB_ITEMFROMPOINT” mesajı ile seçili nesnenin "pre-selected" dizindeki yerini algılayacağız. Daha sonra eğer geçerli bir diziye sahipsek, “LB_GETTEXT “ mesajıyla metnini algılayacağız. Son olarak algıladığımız metni bir TLabel de göstereceğiz.
Kod: Tümünü seç
procedure TForm1.ApplicationIdle(
sender: TObject; var Done: boolean);
var
pt : TPoint;
w : Hwnd;
ItemBuffer : array[0..256] of Char;
idx : Integer;
s : string;
begin
pt := Mouse.CursorPos;
w := WindowFromPoint(pt);
if w = 0 then Exit;
GetClassName(w, ItemBuffer, SizeOf(ItemBuffer));
if StrIComp(ItemBuffer, 'ComboLBox') = 0 then
begin
Windows.ScreenToClient(w, pt);
idx := SendMessage(w,
LB_ITEMFROMPOINT,
0,
LParam(PointToSmallPoint(pt)));
if idx >= 0 then
begin
if LB_ERR <> SendMessage(w,
LB_GETTEXT,
idx,
LParam(@ItemBuffer)) then
begin
s:= 'Mouse over item: ' + #13#10 +
Format('Combo.Name: %s,%sItem.Text: %s',
[ActiveControl.Name,#13#10,ItemBuffer]);
ComboItemLabel.Caption := s;
{Harfleri Tanımla}
hw.DoActivateHint(ActiveControl.Name + ItemBuffer,
'Hint for: ' + ItemBuffer);
end;
end;
end;
end; (*ApplicationIdle*)
ComboBox.Item Custom Hint Mesajı
Bir ekran görüntüsü gibi combo box taki hint metnini görebilirsin. Genellikle bir class “TcomboItemHint”ı, “ThintWindow” sürücüsünden her nesne için metni gösterebilir. “DoActivateHint” procedure “ThintWindow”un ActivateHint metodunu çağırır. ActivateHint istenilen koordinatta hinti gösterir(fare nerdeyse).
Kod: Tümünü seç
type
TComboItemHint = class(THintWindow)
private
DoHint : boolean;
FControlName: string;
procedure SetControlName(const Value: string);
private
property ControlName : string
read FControlName write SetControlName;
public
procedure DoActivateHint(
ControlName : string; Text : string);
end;
...
procedure TComboItemHint.DoActivateHint(
ControlName : string; Text: string);
var
pt : TPoint;
r : TRect;
begin
self.ControlName := ControlName;
if DoHint then
begin
pt := Mouse.CursorPos;
r:= Rect(pt.X + 16,
pt.Y + 16,
pt.X + 100,
pt.Y + 32);
ActivateHint(r,Text);
DoHint := false;
end;
end;
procedure TComboItemHint.SetControlName(
const Value: string);
begin
if FControlName <> Value then
begin
ReleaseHandle;
{titremeyi yok et}
DoHint := True;
FControlName := Value;
end;
end;