I think an Index cannot be the solution.
Running as downloaded from previous message, the 3rd column is empty for all records (-> lookup field seems it is not a "lookup field").
You can replace the block of code after comment " //INSERISCO UN PO' DI DATI NEL DATASET VIRTUALE PRINCIPALE"
with following block.
After replace, you can run and this is what we can expect at startup from a lookup field.
Surely this is not the solution.
procedure TForm1.FormCreate(Sender: TObject);
var
Temf:TField;
CurrKey: integer;
begin
...
//INSERISCO UN PO' DI DATI NEL DATASET VIRTUALE PRINCIPALE
VDSet_Principale.Open; {apro la connessione al dataset virtuale}
CurrKey := 1;
VDSet_Principale.AppendRecord([CurrKey,'root', VDSet_Chiavi.Lookup('ID', CurrKey, 'Chiave') ]);
CurrKey := 2;
VDSet_Principale.AppendRecord([2,'toor', VDSet_Chiavi.Lookup('ID', CurrKey, 'Chiave') ]);
CurrKey := 3;
VDSet_Principale.AppendRecord([3,'pippo', VDSet_Chiavi.Lookup('ID', CurrKey, 'Chiave')]);
...