Zaznaczenie CheckBox w VirtualStringTree

0

Witam.

Jak w pętli zaznaczyć dzióbkiem wszystkie bądź wybrane wiersze w komponencie
VirtualStringTree. Przy generowaniu listy każdy wiersz posiada element CheckBox.
Generalnie chodzi mi o metodę z VST do zaznaczania CheckBoxa.

Help Adam

0

Node.CheckState := csCheckedNormal; //zaznaczone
Node.CheckState := csUnCheckedNormal; //odznaczone
iterowanie po nodach

var
  node: PVirtualNode;
begin
  Node := VST.GetFirst;
  while Node <> nil do
  begin
    //tu cokolwiek chcesz zrobić
    Node := VST.GetNext(Node);
  end;

i oczywiście czytałeś helpa i oglądałeś dema i NIGDZIE nie było...

0

Dzięki....... możesz mi jeszcze pomóc w temacie CheckBox-ów które są przypisane do
dzieci - jak (ręcznie) kliknę, zaznaczę Boxa rodzica to automatem zaznaczają się także CheckBox-y
dzieci.

CheckBox-y tworzę w zdarzeniu OnInitNode komponentu VST tak;

var
Poziom:Integer;
begin
 Poziom:=Sender.GetNodeLevel(Node);
  if Poziom<1 then
    Include(InitialStates, ivsExpanded);
  if Poziom>0 then
    Node.CheckType:=ctCheckBox
  else
    Node.CheckType:=ctTriStateCheckBox;
end;
 

Jak to zmienić aby CheckBox-y dzieci były niezależne

HELP
Adam

0

przypomnij się w okolicach wtorku bo teraz nie mam gdzie sprawdzić. BTW dobrze by było jakbyś gdzieś wrzucił testową aplikację z przykładem błędnego działania

0

........ posiedziałem na testowym przykładzie (bo na takim lepiej się pracuje) i mam takie rozwiązanie:

  • dodałem dodatkową zmienną PVNChild w procedurze ładującej dane do wirtualnego rekordu z VST
procedure TForm1.BtGoClick(Sender: TObject);
var
I,J:Integer;
PVN,PVNChild:PVirtualNode;
begin
Randomize();
 for I:=1 to 10 do
 begin
  VST1.RootNodeCount:=VST1.RootNodeCount+1;//kolejne linie
  PVN:=VST1.GetLast;
  DataVST1:=VST1.GetNodeData(PVN);
  //nadanie wartosci
  DataVST1.IdxParent:=I;
  DataVST1.IdxChild:=0;
  DataVST1.Nazwa:='Rodzic '+IntToStr(DataVST1.IdxParent);
  if (I mod 2 = 0) then // child
  begin
   for J:=1 to RandomRange(2,6) do
   begin
    VST1.ChildCount[PVN]:=VST1.ChildCount[PVN]+1;
    PVNChild:=VST1.GetLastChild(PVN);
    DataVST1:=VST1.GetNodeData(PVNChild);
    //nadanie wartosci
    DataVST1.IdxParent:=I;
    DataVST1.IdxChild:=J;
    DataVST1.Nazwa:='Child '+IntToStr(DataVST1.IdxParent)+' - '+IntToStr(DataVST1.IdxChild);
   end;
  end;
 end;
end;
 
  • w zdarzeniu onInitNode pozostało bez zmian
 
procedure TForm1.VST1InitNode(Sender: TBaseVirtualTree; ParentNode,
  Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
Poziom:Integer;
begin
 Poziom:=Sender.GetNodeLevel(Node);
  if Poziom<1 then
    Include(InitialStates, ivsExpanded);
  if Poziom>0 then
    Node.CheckType:=ctCheckBox
  else
    Node.CheckType:=ctTriStateCheckBox;
end;

Teraz ChecBoxy wyświetlają się wszystkie jako kolejne dziecko głównego rodzica a nie każde dziecko jako dziecko dziecka
oraz zaznaczanie i odznaczanie jest niezależne.

Pytanko: jak najlepiej (z praktyki) rozwiązać przechowywani danych dziecka?? rekord danych dziecka jako obiekt w rekordzie przechowującym dane rodzica ???

Pozdrawiam
Adam

1 użytkowników online, w tym zalogowanych: 0, gości: 1