cs_OhAime
Messages postés18Date d'inscriptionvendredi 8 avril 2005StatutMembreDernière intervention 7 avril 2007
-
15 juil. 2006 à 04:57
cs_OhAime
Messages postés18Date d'inscriptionvendredi 8 avril 2005StatutMembreDernière intervention 7 avril 2007
-
15 juil. 2006 à 16:36
Bonjour,
En fait j'ai créer un tableau dynamique de composants TEdit, et lors de l'appui sur un bouton, je souhaites que les composants soient détruits! Voilà mon code:
procedure TForm2.Stop(Sender: TObject);
var
i : integer;
begin
for i:= 0 to Length(Edit) do
begin
Edit[i].free;
end;
SetLength(Edit,0);
end;
Lorsque je met ce code pour la destruction, eh bien j'ai une erreur: Opération de pointeur incorrect.
J'ai essayer divers trucs, et j'ai donc remarqué que c'est uniquement lorsque qu'il essaye de détruire le premier composants du tableau! il peut supprimer tous les autres sans problème mais pas le premier...
Est-ce que vous sauriez pourquoi il fait ça?!
Merci d'avance
A voir également:
Problème destruction tableau dynamique de composants
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 15 juil. 2006 à 16:19
Ce code fonctionne parfaitement, y compris la création des 2 tableaux dans la même boucle.
Le problème vient d'ailleurs.
Moi, je n'aurais pas placé ce code dans l'évènement OnActivate du Form : c'est une source d'emm...s.
Par exemple, si tu "fermes" Form2 (hide) et que tu l'actives à nouveau, je t'explique pas...
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 15 juil. 2006 à 11:09
Salut DeltaFX,
pourrais-tu préciser pourquoi "Faut les détruire dans l'ordre inverse de création" ?
Que je commence par le premier où le dernier il n'y a pas de différence.
Donc si je suis ta logique et je fait :
SetLength(Edit, 10);
For I := 9 Downto 0 Do
Begin
Edit[I] : = TEdit.Create(Self);
...
End;
Je vais devoir les détruires comme ceci :
For I := 0 to 9 Do Edit[I].Free; ???????????????????????????????????????
Le problème de OhAime c'est qu'il à utilisé Length(Edit) au lieu de High(Edit) où encore Length(Edit) - 1
ce qui provoque fatalement une Opération de Pointeur Incorrect Length(Edit) : = 10
@+
Cirec
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_OhAime
Messages postés18Date d'inscriptionvendredi 8 avril 2005StatutMembreDernière intervention 7 avril 2007 15 juil. 2006 à 14:58
J'ai essayer vos propositions, mais aucune ne fonctionne, j'ai toujours la même erreur. Lorsque j'essaye de les détruire à l'envers, c'est le dernier créer qui reste et me met l'erreur, sinon dans le même ordre que la création, le premier disparait, affiche l'erreur, et les autres restes ...
Je vous met le code de la création des compo, peut-être ais-je fait une erreur là...
var
Form2: TForm2;
Edit : Array of TEdit;
Button : TButton;
GB : TGroupBox;
procedure TForm2.FormActivate(Sender: TObject);
var
i : integer;
begin
Button := TButton.Create(Form2); {création du boutton pour détruire les composants}
Button.Parent := Form2;
Button.Top := 20+(NbrPoints*25);
Button.OnClick := Form2.Stop;
SetLength(Edit,NbrPoints -1);
for i := 0 to NbrPoints -1 do {création des TEdit, NbrPoints est une variable provenant d'une autre fiche.}
begin
Edit[i] := TEdit.Create(GB);
Edit[i].Parent := GB;
Edit[i].Name := 'PT'+IntToStr(i);
Edit[i].Top := 20+(i*25);
Edit[i].Width := 60;
Edit[i].Left := 10;
end;
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 15 juil. 2006 à 15:30
Salut cirec, salut DeltaFX,
Il aurait été indispensable de libérer du dernier au premier Edit si on avait opéré de cette manière :
procedure TForm1.FreeAllEdits;
var i: Integer;
begin
for i := ComponentCount - 1 downto 0 do
if Components[i] is TEdit then
Components[i].Free;
end;
end;
Mais il est possible qu'il soit plus élégant, voire efficace (question d'empilage, dépilage...) de libérer d'abord ce que l'on a créé en dernier ? La question reste posée...
cs_OhAime
Messages postés18Date d'inscriptionvendredi 8 avril 2005StatutMembreDernière intervention 7 avril 2007 15 juil. 2006 à 15:58
Alors en fait, j'ai à peu près résolu la chose!! J'avais enlever un peu de code pensant que ce n'était pas ça qui posait problème mais finalement c'était ça!! Voilà le code:
procedure TForm2.FormActivate(Sender: TObject);
var
i : integer;
begin
GB := TGroupBox.Create(Form2);
GB.Parent := Form2;
GB.Height := 25+(NbrPoints*25);
GB.Width := 200;
GB.Caption := 'test';
GB.Left := 40;
for i := 0 to High(Edit) do { je rempli deux tableau de TEdit dans la même boucle }
begin
Edit[i] := TEdit.Create(Self);
Edit[i].Parent := GB;
Edit[i].Name := 'PT'+IntToStr(i);
Edit[i].Top := 20+(i*25);
Edit[i].Width := 60;
Edit[i].Left := 10;
procedure TForm2.Stop(Sender: TObject);
var
i : integer;
begin
for i:= Low(Edit) to High(Edit) do
begin
Edit[i].free;
end;
SetLength(Edit,0);
end;
***
Donc ça ne fonctionne pas quand je rempli les deux tableaux dans la même boucle! Si je met deux boucle l'une après l'autre, ça fonctionne, est-ce que vous en connaitriez la raison?!!
cs_OhAime
Messages postés18Date d'inscriptionvendredi 8 avril 2005StatutMembreDernière intervention 7 avril 2007 15 juil. 2006 à 16:27
lol! c'est justement quand j'ai vu la m.... que ça mettait lorsque je fermais et réouvrai que j'ai penser à les détruire!! Mais chez toi le code fonctionne??? Moi ça ne fonctionne pas!
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 15 juil. 2006 à 16:34
Ben primo ta procedure stop ne purge que Edit, t'as oublié EditDist et concernant ton remplissage , pitet me goure-je, mais bien que Edit et EditDist aient le meme nombre d'élément, utiliser High(Edit) comme limite d'index supérieure pour EditDist, c'est MAL !.
Faut voir ca dans la meme optique que la structure With :
With monTruc Do la salade_interne_a_MonTruc.
Ben là c'est pareil, quand tu appelles High et Low sur un tableau, la logique veut que tu n'utilises ces bornes que pour le tableau en question, et pas pour un autre.
Donc deux boucles. (Ca changeras rien niveau temps CPU comsommé)
Mais tu peux aussi écrire
for i := 0 to NbrPoints do
begin
tripote Edit[i];
tripote EditDist[i];
end;
auxquel cas c'est a toi d'etre sur du nombre d'élément.