Was ich damit meine, ist folgendes:
Code: Alles auswählen
var
F1: TField;
F2: TField;
begin
F1 := Dataset.FieldByName('Field1');
F2 := Dataset.FieldByName('Field2');
Dataset.First;
while not Dataset.EoF do begin
TreeView.Items.AddObject(nil, F1.AsString + ' / ' + F2.AsString);
// Nicht: TreeView.Items.AddObject(nil, Dataset.FieldByName('Field1').AsString + ' / ' +
// Dataset.FieldByName('Field2').AsString);
Dataset.Next;
end;
end;
Wenn du bei Lazarus die Ausgabe der ZEOS-Komponenten durch Dummy-Text ersetzt, ist der Vergleich natürlich nicht fair. Vielleicht sind die ZEOS-Datasets so langsam oder nicht richtig konfiguriert. Ich have viel mit Microsofts ADO gemacht, und da hat die Änderung des Cursor-Typs schlagartig die Geschwindigkeit erhöht!
Achja, und das wichtigste noch: Bei einer großen Tabelle solltest du natürlich nicht alle Datensätzeauf einmal einlesen, sondern zunächst nur die im Tree ganz oben. Dann könntest du einen Hintergrund-Thread starten, der für jeden der eingelesenen Nodes feststellt, ob Kinder vorhanden sind. Erst wenn ein Node expandiert wird (Ereignis OnExpand), werden die von dem expandierten Node abhängigen Datensätze eingelesen, usw.
Die Funktionen von CNPack und GExperts sind so ähnlich bereits in Lazarus integriert. Siehe z.B. http://wiki.freepascal.org/Lazarus_IDE_Tools/de