Stack overflow avec Delphi 10.4.2 Sydney
Bonjour à tous,
J'ai créé une base de données avec des clés permettant de créer un treeviev en Delphi avec FIREBIRD 3/0.
En résumé ceci qui marche très bien sur un orddi Winows 10 qu j'appellerai "A".
VBARIABLE|Variableprecedente6libelle
exemple simplifié
N° |N°précédent|N° précédent|nom
1234|456|'SOLANUM'
et avant dans la base
456|123|"SOLANACEES"
Et un programme récursif pour créer un treeview avec la base :
Je précise : ça marche très bin sur un ordi portable "A" avec Delphi XE.3 Rio
Mias là, sur un autre ordi que j'appellerais "B" juste un message d'erreur au lancement de la création du TreeView récursif
"Erreur STACK OVERFLOW"
Rien à faire depiuis 2 semaines. Donc je viens ici, on ne sait jamais.
Soit je laisse le programme là ou ça marche, soit j'ai une réponse pour migrer vers Delphi Sydney sur un autre ordi.
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
//loquaége swwapOverflow
function Recursive(Level : Integer) : Integer;
begin
try
Level := Level + 1;
Result := Recursive(Level);
except
on E: EStackOverflow do
Result := Level;
end;
end; |
En clair : Quels sont les paramétrages de windows 10 et Delphi pour éviter le "stack overflow" en cas de base de données/programme récursifs.
Merci d'avance si il y a quelqu'un qui a une idée
Vadim
En fait la boucle a une fin
Non. La boucle récursive cesse quand l'item n'a pas de parent. (Renvoi de valeur "NULL" donc : pas de parent.
Ce programme transposé sans changer la mondre ligne marche très bien sur un ordi W10 avec Delphi "Rio" mais "stack overflow sur un autre ordi W10 avec Delphi "Sydey"
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
mark:=readstring('DATA','mark','NULL');
VAR
i:integer;
Cpt:integer;
Procedure CreeNoeudEnfant(Maitre:String);
var
j:Integer;
stf:string;
Begin
If (maitre=mark) then
Begin
Dec(Niveau);
Exit; //fin Totale
End;
Inc(Niveau);
For j:=0 To Cpt-1 DO
If (ListePrec[j]=Maitre) then
Begin
NoeudAuNiveau[Niveau]:=Tv2.items.AddChild(NoeudAuNiveau[Niveau-1],ListeLib[j]);
CreeNoeudEnfant(ListeObj[j]);
End;
dec(Niveau);
End;
begin
TRY
TV2.Items.Clear;
TV2.Items.BeginUpdate;
Table1.DisableControls;
ListeObj.clear;
ListePrec.clear;
ListeLib.clear;
With table1 do
Begin
open;
first;
niveau:=0;
cpt:=0;
While Not table1.Eof do
Begin
ListePrec.Add(FieldByName(IdPreced).AsString);
ListeObj.Add(FieldByName(IdentObj).AsString);
ListeLib.Add(FieldByName(Nom).AsString);
next;
End;
End;
cpt:=ListeObj.count; //Nombre de noeuds en fait
For i:=0 TO Cpt-1 DO Begin //Cherche
If ListePrec[i]=mark then
Begin
NoeudAuNiveau[0]:=Tv2.items.Add(nil,ListeLib[i]);
Inc(Niveau);
CreeNoeudEnfant(ListeObj[i]);
Break;
end;
end;
TV2.Items.EndUpdate;
Table1.EnableControls;
ShowMessage('Succès : '+intTostr(TV2.Items.count)+' noeuds créés...');
// instructions connexes pour libérer objets aux.
EXCEPT
ShowMessage('Echec');
If not table1.Active then table1.Open;
END;
end;
(* Pas indispensable, mais c'est plus prudent...*)
procedure NettoieEnSortant;
begin
table1.close;
table1:=nil;
ListeObj.free;
ListePrec.Free;
ListeLib.Free;
end; |
Effectivement, c'était un souci de connexion
Bon, ben voilà, suite à vos divers avis, et devant le fait que le code marche sur un autre ordi j'ai regardé de plus près la connexion.
En fait j'ai migré de Firebird 2.5 a Firebird 3.0 comme base de données et j'avais oublié de copier la bonne dll dans le dossier system32.
C'était tout bête. (Hem...) Cela connectait cependant à la base mais les paramètres renvoyés, notamment la marque de fin, étaient farfelus ou absents.
Le programme tournait en rond au lieu de construire le TreeView.
Souvent, la solution a un problème est la plus simpliste (Le fameux "Rasoir d'Occam")
Il me reste maintenant à rendre le code plus élégant et simplifier un peu.
Donc voilà, un gros merci à SergioMaster, Paul Toth et vous tous.
Bonne journée à tous!
Vadim