TComboBox Nesneleri İçin Hint Göstermek

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
RamazanG
Üye
Mesajlar: 73
Kayıt: 16 Tem 2010 03:38

TComboBox Nesneleri İçin Hint Göstermek

Mesaj gönderen RamazanG »

Makale Zarko Gajic.
Ç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

Resim

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*)
Bu kod “ApplicationIdle” uygulamasını OnDropDown olayıyla aktif eder; Application.OnIdle uygulamasının benzeridir,OnCloseUp çağrıldığı zaman nil değerini kurar.

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; 
Cevapla