Dacht het enigszins te begrijpen hoe het in elkaar zit, maar krijg het nog niet voor elkaar.
Ik wil een treeview opbouwen als een form opstart. Nu doe ik dat ook, maar het scherm wordt pas getoond als alles klaar is. Maar ik wil snelheid. Het scherm opstarten terwijl de treeview wordt opgebouwd. Het is geen grote treeview met veel nodes, maar toch.....

Ik dacht het zo voor elkaar te krijgen. Echter blijkt dat toch niet zo makkelijk. Zodra een item in een treeview wordt aangemaakt, komt het systeem met de melding 'has no parent window'. Er wordt dus getracht naar de canvas te schrijven, wacht niet in de achtergrond kan.

Maar hoe bouw je dan een treeview op in een aparte thread?

Delphi Code:
  1. procedure tdeelnemers.TreeBuildBG(aTreeview : TTreeview);
  2. begin
  3.     TThread.CreateAnonymousThread(
  4.     procedure
  5.     var SoortItems : TStringlist;
  6.         AlfaNode  : TTreenode;
  7.         SoortNode : TTreenode;
  8.         Node      : TTreenode;
  9.         Letter    : char;
  10.         soort     : string;
  11.         TV        : TTReeview;
  12.     begin
  13.       SoortItems := TStringlist.Create;
  14.       TV         := TTReeview.Create(nil);
  15.       try
  16.         SoortItems.Sorted := true;
  17.         while not fPokemonlijst.Eof do
  18.         begin
  19.           SoortItems.Add(fPokemonlijst.FieldByName('soort').AsString);
  20.           fPokemonlijst.Next;
  21.         end;
  22.         AlfaNode :=  TV.Items.AddChild(nil, 'alfabet');
  23.         AlfaNode.Data := pointer(0);
  24.         SoortNode := TV.Items.AddChild(nil, 'op soort');
  25.         SoortNode.Data := pointer(0);
  26.         for Letter in ['A'..'Z'] do
  27.         begin
  28.           Node := TV.Items.AddChild(Alfanode,'Letter : ' + Letter);
  29.           Node.Data := pointer(1)
  30.         end;
  31.         for soort in SoortItems do
  32.         begin
  33.           Node := TV.Items.AddChild(SoortNode,soort);
  34.           Node.Data := pointer(2)
  35.         end;
  36.  
  37.           TThread.Synchronize(TThread.Current, // Geen 'self' beschikbaar
  38.           procedure
  39.             begin
  40.               aTreeview := TV;
  41.             end);
  42.       finally
  43.         SoortItems.Free;
  44.       end;
  45.     end
  46.   ).Start;
  47. end;