Results 1 to 3 of 3

Thread: CreateAnonymousThread geeft 'has no parent window'

  1. #1
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747

    CreateAnonymousThread geeft 'has no parent window'

    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;
    Delphi is great. Lazarus is more powerfull

  2. #2
    Gebruik. Geen. Visuele. Componenten. In. Threads. Punt. Er is vast wel een manier om het werkend te krijgen, maar het zou gewoon niet nodig moeten zijn, en het levert waarschijnlijk geen winst op.

    Als je snelheid wilt, vul dan eerst de lijst, en zet daarna pas sorted up true. Je huidige oplossing zal ervoor zorgen dat elke nieuwe soort direct op de juiste plaats wordt ingevoegd. Lijkt heel handig, maar dat betekent dus een zoekactie in de lijst, maar ook dat alle soorten die er na komen op moeten schuiven. Beter dus eerst de lijst opbouwen en daarna sorteren.

    Ik ben bang dat je er niet onderuit gaat komen dat het tekenen in de hoofdthread gebeurt. Normaliter zou dat ook niet zo'n probleem moeten zijn, tenzij je duizenden items in de lijst hebt staan, maar dan moet je misschien nadenken of zo'n lijst wel de juiste oplossing is.

    Waarom dan een thread? Voor trage operaties die wél in de achtergrond kunnen gebeuren omdat ze niét resulteren in een tekenactie. Bijvoorbeeld het (relatief trage) lezen van je soortenlijst uit een bestand of een database.
    Last edited by GolezTrol; 26-Apr-18 at 09:54.
    1+1=b

  3. #3
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Of het kopiëren van een record naar een ander tabel

    Point taken!

    Maar wel een hele organisatie om het goed uit te vogelen.
    Ik heb iets in gedachte om het voor elkaar te krijgen.

    Laat het weten als ik klaar ben.

    Ondanks alles moet er toch een manier zijn om een treeview te vullen met data in de achtergrond.
    Delphi is great. Lazarus is more powerfull

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •