Bonjour,

je n'ai pas trop eu le temps de venir par ici ces derniers jours, une application me monopolisant à 200 %...

Mais maintenant je fais face à un os sévère et je vais avoir besoin de vos lumières : le problème est présent dans la vieille machine 32 bits Laz 1.4 et dans la nouvelle 64 bits / Laz 2.0.12 :

Soit une procédure qui crée dynamiquement des TFrames posées alClient dans des TPanels créés eux aussi dynamiquement avec alTop et tout se passe bien (c'est pour afficher des trucs genre Audacity).

Sauf quand je veux détruire les frames présentes pour en créer des nouvelles, après chargement d'autres fichiers, et là ça coince grave :

Soit une liste de 3 fichiers, et un code où j'appelle ShowMessage avant et après Objet.Free.
je fais F9 et tout se passe bien jusqu'à la destruction des objets existants puis la tentative de recréation de 2 (ou autres, ça n'a pas d'incidence) objets et là, bim ! :
Citation Envoyé par Lazarus
Le projet a levé une classe d'exception "EComponentError" avec le message :
Duplicate name : A component named "frm2" already exists.
Le plus bizarre c'est que si je demande à voir les objets contenus dans le Parent de la frame courante (le TPanel créé dynamiquement), il n'y a pas de Components.
Et pourtant j'ai ce message à la noix...

J'ai essayé avec .Destroy au lieu de .Free et vous le devinez, c'est pareil, tout comme avec FreeAndNil. Je ne sais plus quoi faire pour virer ces objets inexistants mais toujours présents quelque part

La proc dans la presque intégralité :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.CreationFrame(idx: cardinal; dest: TWinControl);
var
  frame: TFrm;
begin
  frame:= TFrm.Create(nil); // ces 5 lignes n'existent pas, au départ : je comptais sur le Free...
  frame.Name := 'frm'+IntToStr(idx);
  if assigned(frame) then ShowMessage(frame.Name+' avant frame.Free'); // toujours vu
  if assigned(frame) then frame.Free;
  if assigned(frame) then ShowMessage(frame.Name+' après frame.Free'); // également vu MAIS PAS le NAME ! donc frame est encore à moitié "assigned"
 
  frame := CreateNewFrame(Self, Dest, 'frm'+IntToStr(idx)); // 1er passage tout va bien, second passage le message + haut.
  with frame do begin
  // qq lignes virées pour ne pas alourdir ici, elles n'ont rien à voir avec le pb
  end;
end;
Cerise sur la gâteau de l'incompréhension, je détruis également le Parent de l'objet, donc l'objet devrait l'être également, non ?
Ce qui est curieux, c'est qu'il doit l'être à moitié car son nom n'est pas affiché au second ShowMessage.

Une bonne idée, quelqu'un, pour détruire totalement ces objets récalcitrants ?

Merci,