Der Aufruf von "VSTFüllen" im FormCreate ist nicht sehr geschickt.
Wie soll der Anwender wissen was los ist, wenn er nichts sieht?
Vieleicht in den erstmaligen Aufruf von FormActivate verlagern.
Dann die Anzahl der Datensätze ermitteln "select count(id) ..." und einen Fortschrittsanzeige beim Lesen der eigentlichen Daten.
In der Methode TreeViewResult werden einige Tempvariablen benutzt, warum nicht gleich das Datenobjekt nehmen?
Der Insert ist soweit ok, aber gibt es vor dem Insert keine Möglichkeit sich von der Datenbank eine neue ID zu holen?
Dann könnte man sich das Lesen des gerade eingefügten Datensatzes sparen.
Falls die Datenbank nicht diese Möglichkeit bereitstellt, würde ich über den Einsatz von
GUID als Primärschlüssel nachdenken.
Die können dann auf dem Client vergeben werden.
Das Select mit anschließendem Last ist an dieser Stelle aber eine Katastrophe.
Hier wird praktisch die gesamte Tabelle gelesen, nur um ein Datenobjekt zu füllen, dessen Inhalt schon bekannt ist.
Einfach ein Select max(ID) ... natürlich in der selben Transaktion wie der Insert würde genügen.