Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VirtualStringTree: Einzelne Zelle einfärben (https://www.delphipraxis.net/143975-virtualstringtree-einzelne-zelle-einfaerben.html)

Piro 27. Nov 2009 09:28


VirtualStringTree: Einzelne Zelle einfärben
 
Moin zusammen,

wie färbe ich eine bestimme Zeiles eines VST ein, wenn ein bestimmter Wert des jeweiligen Datensetzes existiert?

Mein bisheriger Code färbt im Wechsel die Zeilen.
Delphi-Quellcode:
procedure Tfrm_main.vst_network_subnetdetailsAfterItemErase(
  Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  ItemRect: TRect);
var
 SubnetDetailsData : TOSubnetDetailsData;
begin
 if Sender.Selected[Node] then
   Exit;

 if Odd(Node.Index) then
   TargetCanvas.Brush.Color := $F8F8F8
 else
   TargetCanvas.Brush.Color := clWhite;

 TargetCanvas.FillRect(ItemRect);
end;
Wenn ich jetzt folgendes hinzufüge, färbt er leder die ganze Zeile ein. Ich möchte aber nur die Zelle in der 1.Spalte färben.
Delphi-Quellcode:
// Spalte 0 einfärben, wenn es sich um ein Exclude handelt
 SubnetDetailsData := TOSubnetDetailsData(vst_network_subnetdetails.GetNodeData(Node)^);
 if SubnetDetailsData.dhcp_exclude = 0 then
 begin
   TargetCanvas.Brush.Color := clNavy;
   TargetCanvas.FillRect(ItemRect);
 end;
Wie müsste ich meinen Code anpassen, damit das klappt oder muss ich ein anderes Ereignis nehmen? Leider gibt es im AfterItemErase Event keinen Bezug auf die Spalte.

Vielen Dank im voraus. Gruß, Sven

ToFaceTeKilla 27. Nov 2009 09:40

Re: VirtualStringTree: Einzelne Zelle einfärben
 
Dann nimm doch OnBeforePaint. Wenn du eine Möglichkeit hast, genau diese Zelle zu identifizieren, sollte das gehen.
Nach dem Löschen, muss er ja eh neu gezeichnet werden. Zur Not erzwingst du es halt (Update).

Hawkeye219 27. Nov 2009 09:50

Re: VirtualStringTree: Einzelne Zelle einfärben
 
Hallo Sven,

OnBeforeCellPaint klingt gut, oder?

Gruß Hawkeye

Piro 27. Nov 2009 10:16

Re: VirtualStringTree: Einzelne Zelle einfärben
 
Ich habe es jetzt auch selbst herausgefunden. Nur habe ich AfterCellPaint genommen.

Delphi-Quellcode:
procedure Tfrm_main.vst_network_subnetdetailsAfterCellPaint(
  Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  Column: TColumnIndex; CellRect: TRect);
var
 SubnetDetailsData : TOSubnetDetailsData;
begin
 // Spalte 0 einfärben, wenn es sich um ein Exclude handelt
 SubnetDetailsData := TOSubnetDetailsData(vst_network_subnetdetails.GetNodeData(Node)^);
 if vst_network_subnetdetails.Header.Columns[Column].Text = '' then
 begin
   if SubnetDetailsData.dhcp_exclude = 0 then
   begin
     TargetCanvas.Brush.Color := clBlack;
     TargetCanvas.FillRect(CellRect);
   end;
 end;
end;
Was ist denn besser AfterCellPaint oder OnBeforeCellPaint?

Hawkeye219 27. Nov 2009 10:30

Re: VirtualStringTree: Einzelne Zelle einfärben
 
Für ein besseres Verständnis solltest du dir die Hilfedatei zum VST (PDF, 8 MByte) ansehen. Dort wird im Kapitel 5.2 "Paint cycles and stages" die Abfolge der einzelnen Ereignisse detailliert beschrieben.

Gruß Hawkeye

Piro 27. Nov 2009 10:36

Re: VirtualStringTree: Einzelne Zelle einfärben
 
Danke. Das sind ja 801 Seiten. Bei Gelegenheit lesse ich es mir durch.

Benutze das OnBeforeCellPaint Event.

Schönen Tag euch und nochmal vielen Dank.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz