2012-06-25 16 views
5

ben (sadece bir TListView olduğu gibi) tam ızgara çizgileri etkinleştirmek için bir yol var mıHenüz mevcut olmayan düğümler için sanal ağaç görünümü ızgara çizgilerini nasıl gösteririm?

Delphi 7. SoftGem en VirtualStringTree kullanılır? Yalnızca geçerli düğümlerin satırlarını gösteren toShowHorzGridLines'u bulabilirim, boş alandaki hiçbir şey değil, yalnızca dikey çizgiler gösteren toShowVertGridLines.

Öğeleri eklenmeden önce bunları boş alanda nasıl gösteririm?

cevap

5

PaintTree yöntemini değiştirmeden bunu uygulamak için kolay bir yol olduğunu düşünmüyorum çünkü düğüm çizgilerinin henüz çizilmemesi gereken düğümler nedeniyle düğüm olaylarının hiçbiri tetiklenemiyor.

kirli yolla, yolunda, en düşük görülebilir düğüme göre yatay çizgiler nasıl çizilir. Aslında bu ekran görüntüsünde turuncu renkle dolu alanda DefaultNodeHeight değerinin mesafe ile çizgiler çizer: Burada

enter image description here

kodudur:

type 
    TVirtualStringTree = class(VirtualTrees.TVirtualStringTree) 
    public 
    procedure PaintTree(TargetCanvas: TCanvas; Window: TRect; Target: TPoint; 
     PaintOptions: TVTInternalPaintOptions; PixelFormat: TPixelFormat = pfDevice); override; 
    end; 

implementation 

{ TVirtualStringTree } 

procedure TVirtualStringTree.PaintTree(TargetCanvas: TCanvas; Window: TRect; 
    Target: TPoint; PaintOptions: TVTInternalPaintOptions; 
    PixelFormat: TPixelFormat); 
var 
    I: Integer; 
    EmptyRect: TRect; 
    PaintInfo: TVTPaintInfo; 
begin 
    inherited; 
    if (poGridLines in PaintOptions) and (toShowHorzGridLines in TreeOptions.PaintOptions) and 
    (GetLastVisible <> nil) then 
    begin 
    EmptyRect := GetDisplayRect(GetLastVisible, 
     Header.Columns[Header.Columns.GetLastVisibleColumn].Index, False); 
    EmptyRect := Rect(ClientRect.Left, EmptyRect.Bottom + DefaultNodeHeight, 
     EmptyRect.Right, ClientRect.Bottom); 
    ZeroMemory(@PaintInfo, SizeOf(PaintInfo)); 
    PaintInfo.Canvas := TargetCanvas; 
    for I := 0 to ((EmptyRect.Bottom - EmptyRect.Top) div DefaultNodeHeight) do 
    begin 
     PaintInfo.Canvas.Font.Color := Colors.GridLineColor; 
     DrawDottedHLine(PaintInfo, EmptyRect.Left, EmptyRect.Right, 
     EmptyRect.Top + (I * DefaultNodeHeight)); 
    end; 
    end; 
end; 

Ve burada sabit olan sonuç ve değişken düğüm yüksekliği:

enter image description here

aksaklık (Yukarıdaki ekran görüntüsünde görünen sol taraftaki çizgiler soldan sağa doğru bir çizgi oluşturmanın bir sonucudur. Sanal ağaç görünümünüzde LineStyle özelliğini lsSolid olarak ayarlarsanız, doğru sonucu görürsünüz.

+2

Şimdi sonuca bakarak, dikdörtgen kaydırılır. Daha sonra tamir edeceğim (şimdi gitmeliyim). Ama yine de oldukça kirli bir çözüm. – TLama

+0

hiç kirli değil! thats aslında oldukça güzel! çok teşekkür ederim! –

+2

Phew, satır konumları doğruydu. Noktalı çizgi oluşturma neden oldu. Ancak bir hata vardı. Çizginin doğru sınırını belirlemek için 'Header.Columns.Count - 1' dizini ile sütun kullanıyordum. Eğer ör. 2 sütun ve ikincisini ilk konuma taşıdım, kullanmam gereken dizin (en sağdaki sütunun indeksi) 0, değil (Header.Columns.Count - 1' idi). Şimdi bu 'GetLastVisibleColumn' için kullanıyorum doğru yol ne olmalıdır. – TLama

İlgili konular