TListView Sub Items 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

TListView Sub Items Hint Göstermek

Mesaj gönderen RamazanG »

Makale: Zarko Gajic.
Çeviri: Ramazan Gülbahar.

TListView Sub Items Hint Göstermek
Resim

ListView Item Hintleri Nedir?
TListView’de Hint göstermek için ShowHint özelliğini kullanırız, fare ListView üzerinde gezinirken hint gösterir.
En iyi çözüm ise, list view kullandığımız zaman custom hints özelliğinin her list view nesnesi için ayrı bir hint göstermesidir. Daha fazlasıda var, list view’in her sub item’i için hint göstermesi.

ListView’in OnInfoTip olayı, Eğer fare bir nesne üzerinde durursa, farenin üzerinde durduğu nesneyi algılar. Varsayılan olarak hint kullanılabilir olduğu zaman (ShowHint özelliği true olduğu zaman), list view belirtilen yerdeki hint’i Hint özelliğini kullanarak gösterir.

List view’de her alt nesnenin hint göstermesi için: OnInfoTip ve OnMouseMove olaylarını kullanmaya ihtiyacımız var.

OnInfoTip olayının nasıl kullanıldığını görelim.

Kod: Tümünü seç

procedure TLVHintsForm.ListView1InfoTip(Sender: TObject; Item: TListItem; var InfoTip: string) ;
 begin
   {Bütün nesneleri(items) alt nesneleriyle(sub items) beraber göster}
   InfoTip := InfoTip + #13#10 + item.SubItems[0] + #13#10 + item.SubItems[1];
 end;
Bütün alt nesneler{sub item} için hint göster. OnMouseMove olayı.

Kod: Tümünü seç

uses CommCtrl;
procedure TLVHintsForm.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer) ;
 var
   pt: TPoint;
   li : TLIstItem;
   lvHitInfo: TLVHitTestInfo;
   hint : string;
 begin
   pt := ListView1.ScreenToClient(Mouse.CursorPos) ;
   li := ListView1.GetItemAt(pt.x, pt.y) ;
 
   {Alt nesnenin(sub item) üzerindemi?}
   if li = nil then
   begin
     FillChar(lvHitInfo, SizeOf(lvHitInfo), 0) ;
     lvHitInfo.pt := pt;
     {Alt nesnenin(sub item) üzerinde ise!}
     if -1 <> ListView1.Perform(LVM_SUBITEMHITTEST, 0, LParam(@lvHitInfo)) then
     begin
       hint := Format('Name: %s, %s : %s',[
         ListView1.Items[lvHitInfo.iItem].Caption,
         ListView1.Columns[lvHitInfo.iSubItem].Caption,
         ListView1.Items[lvHitInfo.iItem].SubItems[-1 + lvHitInfo.iSubItem]]) ;
 
       if hint <> Memo1.Lines[0] then
       begin
         Memo1.Lines.Insert(0, hint) ;
{Hinti aktif yap}
         ListView1.Hint := hint;
         Application.ActivateHint(Mouse.CursorPos) ;
       end;
    end;
   end;
 end;
Farenin pozisyonunu algıladıktan sonra (Mouse.CursorPos), ScreenToClient kullanarak ListView1 üzerindeki farenin koordinatlarını algılıyabiliriz.
ListView’e LVM_SUBITEMHITTEST mesajını yolluyarak TLVHitTestInfo kayıdından (record) bütün nesneleri(items) ve alt nesneleri(Sub Items) ListView’e doldurabiliriz.
Eğer fare alt nesnenin(sub-item) üzerine gelirse, hint penceresi Application.ActivateHint metodunu kullanarak aktif olacak.
Cevapla