Hi,
ich habe einen VirtualStringTree in dem ich in einer Column unterschiedliche Controls einbette.
Während der ToggleSwitch sofort wie gewünscht darstellt wird, wird der Button erst gezeichnet, wenn ich mit der Maus drüberfahre. hat irgendjemand eine Idee woran das liegen könnte?
Ich erzeuge die im InitNode
Delphi-Quellcode:
procedure Tfrm_main.vrtlstrngtr1InitNode(Sender: TBaseVirtualTree; ParentNode,
Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
element: TElement;
begin
if Node.Parent<>vrtlstrngtr1.RootNode then
begin
element:=TElement(vrtlstrngtr1.GetNodeData(node)^);
case element.elementType of
etSwitch:
begin
element.Switch:=TToggleSwitch.Create(vrtlstrngtr1);
element.Switch.Parent:=vrtlstrngtr1;
element.Switch.State:=TToggleSwitchState(element.state);
//element.Switch.ShowStateCaption:=False;
element.Switch.Tag:=node.Index;
element.Switch.OnClick:=SwitchClick;
end;
etButton:
begin
element.Button:=TButton.Create(vrtlstrngtr1);
element.Button.Parent:=vrtlstrngtr1;
element.Button.Caption:='Ausführen';
element.Button.Parent:=vrtlstrngtr1;
element.Button.Tag:=node.Index;
element.Button.OnClick:=ButtonClick;
end;
end;
DoResize(Node);
end;
end;
Und gebe sie im FreeNode wieder frei.
Über DoResize werden sie dann an die Cell angepasst.
Delphi-Quellcode:
procedure Tfrm_main.DoResize(node: PVirtualNode);
var
CellRect: TRect;
Element: TElement;
begin
if node.Parent<>vrtlstrngtr1.RootNode then
begin
Element:=TElement(vrtlstrngtr1.GetNodeData(node)^);
CellRect:=vrtlstrngtr1.GetDisplayRect(node, 4, false);
if Element.Button<>nil then
begin
Element.Button.Left:=CellRect.Left;
Element.Button.Top:=CellRect.Top;
Element.Button.Width:=CellRect.Width;
Element.Button.Height:=CellRect.Height;
end;
if Element.Switch<>nil then
begin
Element.Switch.Left:=CellRect.Left;
Element.Switch.Top:=CellRect.Top;
Element.Switch.Width:=CellRect.Width;
Element.Switch.Height:=CellRect.Height;
end;
end;
end;