Witam
Mam nadzieję, że to podstawy i znawcy tego komponentu pomogą :)
-
Jak ustalić, aby trzecia kolumna "Nazwa" automatycznie dostosowywała swoją szerokość ?
Mam ustalone takie parametry dla trzeciej kolumny:
[coAllowClick,coEnabled,coParentBidiMode,coResizable,coShowDropMark,coVisible,coSmartResize,coAllowFocus,coWrapCaption,coUseCaptionAlignment] -
Jak ustalić własne TCheckBox w pierwszej kolumnie ?
Chodzi o takie ikony jak są w drugiej kolumnie - ale tam są obrazy przypisane z TImageList, które nie reagują na klikanie.
Obecnie ustawiony jest CheckImageKind = ckXP.
Próbowałem ustawić CheckImageKind = ckCustom oraz własny TImageList do CustomCheckImages, ale wtedy pierwsza kolumna jest pusta. -
Jak sprawdzić, który wpis zawiera przypisany konkretny ImageIndex ?
Głównie chodzi mi jak w pętli poruszać się po całej liście rodziców (po samych korzeniach, bez gałęzi).
Tutaj wyrzuca mi AV:
var
Node: PVirtualNode;
Data: PTreeData;
begin
Node := VST.RootNode;
while Assigned(Node) do
begin
Data := VST.GetNodeData(Node);
if Data.FImage = 0 then ShowMessage(Data.FCaption); // <--------------------- błąd AV
Node := VST.GetNext(Node);
end;
end;
- Jak stworzyć wiele linii tekstu w jednym wpisie ?
- Czy jest możliwość stworzenia gradientowego tła dla zaznaczonego wpisu ?
Użyty kod:
PTreeData = ^TTreeData;
TTreeData = record
FCheck: Boolean;
FImage: Byte;
FCaption: string;
FSubItem1: string;
end;
{Odpowiada za dodanie nowego wpisu}
function AddVirtualListItem(CVST: TCustomVirtualStringTree; ANode: PVirtualNode; ARecord: TTreeData): PVirtualNode;
var
Data: PTreeData;
begin
Result := CVST.AddChild(ANode);
Data := CVST.GetNodeData(Result);
CVST.ValidateNode(Result, False);
Data^.FCheck := ARecord.FCheck; {Zawiera informację, czy wpis zaznaczony}
Data^.FImage := ARecord.FImage; {Zawiera informację o nr indeksu ikony}
Data^.FCaption := ARecord.FCaption; {Zawiera treść kolumny "Nazwa"}
Data^.FSubItem1 := ARecord.FSubItem1; {Zawiera treść kolumny "Rozmiar"}
end;
{Wstawia losowe wpisy}
procedure TForm3.Button1Click(Sender: TObject);
var
i: Byte;
TreeData: TTreeData;
begin
VST.NodeDataSize := SizeOf(TTreeData);
VST.BeginUpdate;
Randomize;
for i := 0 to 25 do
begin
TreeData.FCheck := Bool(Random(2));
TreeData.FImage := Random(2);
TreeData.FCaption := 'Node: ' + InttoStr(i);
TreeData.FSubItem1 := 'SubItem: ' + InttoStr(i);
AddVirtualListItem(VST, nil, TreeData);
end;
VST.EndUpdate;
end;
{Sprawdza, który wpis jest zaznaczony}
procedure TForm3.Button2Click(Sender: TObject);
var
Node: PVirtualNode;
Data: PTreeData;
begin
Node := VST.RootNode;
while Assigned(Node) do
begin
if Node.CheckState = csCheckedNormal then
begin
Data := VST.GetNodeData(Node);
ShowMessage(Data.FCaption);
end;
Node := VST.GetNext(Node);
end;
end;
{Sprawdza, który wpis ma nr indeksu ikony}
procedure TForm3.Button3Click(Sender: TObject);
var
Node: PVirtualNode;
Data: PTreeData;
begin
Node := VST.RootNode;
while Assigned(Node) do
begin
Data := VST.GetNodeData(Node);
if Data.FImage = 0 then ShowMessage(Data.FCaption); // <--------------------- błąd AV
// (jak tu się odwołać do ikony z drugiej kolumny ?
Node := VST.GetNext(Node);
end;
end;
{Ustala zmianę zaznaczenia wpisu}
procedure TForm3.VSTChecking(Sender: TBaseVirtualTree; Node: PVirtualNode;
var NewState: TCheckState; var Allowed: Boolean);
var
Data: PTreeData;
begin
Data := VST.GetNodeData(Node);
Data.FCheck := (NewState = csCheckedNormal);
end;
{Odpowiada za zmianę wysokości wpisu, gdy jest on aktualnie podświetlony}
procedure TForm3.VSTFocusChanging(Sender: TBaseVirtualTree; OldNode,
NewNode: PVirtualNode; OldColumn, NewColumn: TColumnIndex;
var Allowed: Boolean);
begin
with TVirtualStringTree(Sender) do
begin
NodeHeight[OldNode] := DefaultNodeHeight;
NodeHeight[NewNode] := DefaultNodeHeight * 2;
end;
end;
{Zwalnia zawartość}
procedure TForm3.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
Data: PTreeData;
begin
Data := VST.GetNodeData(Node);
if Assigned(Data) then
begin
Data.FCaption := '';
Data.FSubItem1 := '';
end;
Finalize(Data^);
end;
{Przypisuje indeks ikony do drugiej kolumny}
procedure TForm3.VSTGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode;
Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean;
var ImageIndex: Integer);
var
Data: PTreeData;
begin
Data := VST.GetNodeData(Node);
if Column = 1 then ImageIndex := Data.FImage;
end;
{Przypisuje tekst do drugiej i trzeciej kolumny}
procedure TForm3.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
Data: PTreeData;
begin
Data := VST.GetNodeData(Node);
case Column of
2: CellText := Data.FCaption;
3: CellText := Data.FSubItem1;
end;
end;
{Inicjuje, aby wyświetlić w pierwszej kolumnie TCheckBox}
procedure TForm3.VSTInitNode(Sender: TBaseVirtualTree; ParentNode,
Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
begin
VST.CheckType[Node] := ctCheckBox;
end;