Page 2 of 2 FirstFirst 1 2
Results 16 to 27 of 27

Thread: Virtualtree met Subnodes

  1. #16
    gedeclareerd tenzij dat verkeerd is.
    Zoals ik in mijn eerste post aangaf "een sorted stringlist" aanmaken. Daarna heb ik aangegeven dat je FIndex.Sorted vergeten bent (wat GolexTrol ook heeft gemarkeerd in zijn voorlaatste post). Dus:
    Code:
    FIndex := TStringList.Create;
    FIndex.Sorted := True;
    [dcc32 Error] Unit1.pas(111): E2010 Incompatible types: 'TObject' and 'PVirtualNode'
    PVirtualNode is een pointer, dus je kunt dat casten naar elk ander pointer type (zoals TObject). Het wordt dan:

    Code:
    FIndex.AddObject(SwitchQuery.Fields.FieldByName ('Basename').AsString, TObject(Node));

  2. #17
    Dank je
    veranderd het naar TObject(Node) en nu werkt het, en duurt maar een paar ms voor de hele database.

    Hartstikke bedankt voor je help.

    Nu kan ik weer verder borderen op Zoek/filter velden en clicks om de juiste record op te brengen

  3. #18
    Quote Originally Posted by GolezTrol View Post
    Als ik het meet dan duurde het opbouwen van de tree 8 seconden. Na het op sorted zetten van de stringlist, waardoor hij binary search kan doen, is dat 100ms.
    Niet slecht, maak dat moet nog sneller kunnen. Maar ik ben vooral benieuwd hoe lang het duurt als je FIndex als type THashedStringList (uit unit System.IniFiles) declareert. Hoe groter de dataset, hoe meer rendement er is te behalen met de hash tables.

    PS. Ik zou het graag zelf willen proberen, maar die download site wil van alles installeren en ik zit niet op een "speel" omgeving.
    Last edited by havezet; 24-Jun-20 at 09:19.

  4. #19

  5. #20

  6. #21
    Ah ja, dat was nog een fout.

    Twee dingen:

    1. Je moet zoals gezegd de node typecasten naar TObject om 'm toe te kunnen voegen aan de stringlist.

    FIndex.AddObject(SwitchQuery.Fields.FieldByName ('Basename').AsString, PVirtualNode(Node));

    Met een dictionary hoeft dat overigens niet. Dat is een generic type, en die kan je dus specifiek <string, PVirtualNode> maken. Maar dan gaat het dus fout omdat er twee rijen zijn met dezelfde basename en een id dat eindigd op 000.

    2. Je moet dat binnen de if doen. Je moet de node dus alleen aan de stringlist toevoegen als het ID eindigt op 000.
    1+1=b

  7. #22
    Ik had de code wat aangepast zodat ik met 1 knop de Tree kan laden en 1 knop om het te wissen.
    Werkt prima, maar als ik hem dan weer laad, dan krijg een een foutmelding in de buildtree.
    Enig idee wat het zou kunnen zijn?


    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    showtree;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    switchtree.Clear;
    end;
    
    procedure TForm1.FormCreate (Sender: TObject);
    var
      ii: TRomViewerColumns;
    begin
      dbconnection.Params.Database := '..\..\database.db';
      dbconnection.Params.Values['FailIfMissing'] := 'False';
      dbconnection.Params.Values['SharedCache'] := 'True';
      dbconnection.Open;
    
      FIndex:=tstringlist.Create;
      FIndex.Sorted := True;
    end;
    
    
    
    procedure TForm1.showtree;
    begin
    SwitchQuery.SQL.Text := 'SELECT * FROM SWITCHDATA';
      SwitchQuery.Open;
      SwitchQuery.Last;
      BuildTree;
      FFiltered:=true;
      switchTree.RootNodeCount := SwitchQuery.RecordCount;
      FillBookmarks();
    end;
    
    procedure TForm1.BuildTree;
    var
    Node : PVirtualNode;
    begin
    SwitchTree.BeginUpdate;
      try
        SwitchQuery.First;
        while (not SwitchQuery.Eof) do
        begin
          if SwitchQuery.Fields.FieldByName ('ID').AsString.EndsWith ('000') then
          begin
            Node := SwitchTree.AddChild(nil, Pointer (SwitchQuery.RecNo));
            FIndex.AddObject(SwitchQuery.Fields.FieldByName ('Basename').AsString, TObject(Node));
          end;
          SwitchQuery.Next;
        end;
    
        SwitchQuery.First;
        while (not SwitchQuery.Eof) do
        begin
          if not SwitchQuery.Fields.FieldByName ('ID').AsString.EndsWith ('000') then
          begin
            Node := SwitchTree.AddChild (NodeWithBaseName (SwitchQuery.Fields.FieldByName ('Basename').AsString), Pointer (SwitchQuery.RecNo));   // hier gaat het fout als ik het voor de 2e keer laad.
            FIndex.AddObject(SwitchQuery.Fields.FieldByName ('Basename').AsString, TObject(Node));
          end;
          SwitchQuery.Next;
        end;
      finally
        SwitchTree.EndUpdate;
      end;
    end;

  8. #23
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Quote Originally Posted by trainlover View Post
    dan krijg een een foutmelding in de buildtree.
    De eerste vraag die ik dan stel: wat voor foutmelding? De melding zelf is meestal een goede indicatie van wat er mis gaat.
    TMemoryLeak.Create(Nil);

  9. #24
    Je moet FIndex in ieder geval ook leegmaken. Eventueel kan je die helemaal lokaal houden in buildtree. Volgens mij gebruik je'm daarbuiten toch niet.
    1+1=b

  10. #25
    Quote Originally Posted by VideoRipper View Post
    De eerste vraag die ik dan stel: wat voor foutmelding? De melding zelf is meestal een goede indicatie van wat er mis gaat.
    Dit is de foutmelding

    First chance exception at $007A0134. Exception class $C0000005 with message 'access violation at 0x007a0134: write of address 0x00610085'. Process Project1.exe (15352)

  11. #26
    Quote Originally Posted by GolezTrol View Post
    Je moet FIndex in ieder geval ook leegmaken. Eventueel kan je die helemaal lokaal houden in buildtree. Volgens mij gebruik je'm daarbuiten toch niet.
    Zo simpel... dat was het. Bedankt

  12. #27
    Geen idee waarom ik het niet eerder gezien heb, maar als ik de tree geladen heb, dan aan het eind heb ik een heleboel data van dezelfde record op de 1 of andere manier.

    Denk dat het aan deze regel lag: switchTree.RootNodeCount := SwitchQuery.RecordCount;
    Heb deze uitgeschakeld en nu geeft die wel de hele tree normaal.

Page 2 of 2 FirstFirst 1 2

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
  •