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
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:
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.
Ş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
hiç kirli değil! thats aslında oldukça güzel! çok teşekkür ederim! –
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