[delphi]Supprimer un compsant lors d'un evenement

Supprimer un compsant lors d'un evenement [delphi] - Delphi/Pascal - Programmation

Marsh Posté le 06-11-2006 à 14:28:00    

Comme le dit très bien l'aide de la methode "free" :

Citation :

Ne libérez jamais explicitement un composant dans un de ses propres gestionnaires d'événement ou dans un gestionnaire d'événement d'un composant qu'il possède ou contient.Par exemple,ne libérez pas un bouton,ou la fiche qui le possède,dans son gestionnaire d'événement OnClick.


 
Oui, mais manque de bol, c'est exactement ce que je souhaite faire  (en fait, détruire un combobox après le "OnSelect" )
 
Quelqu'un a une solution élégante à me sugerer?

Reply

Marsh Posté le 06-11-2006 à 14:28:00   

Reply

Marsh Posté le 11-11-2006 à 14:33:00    

Si tu veux détruire ce composant je ne crois pas que tu puisses le faire dans un de ses évènements ou alors tu devras prendre en compte le code avant et aprés le doSelect.
 
Je m'explique : la méthode que tu affectes au OnSelect de ton composant est déclenchée par le doSelect de son parent en terme d'héritage.
En fait il regarde si tu as rattaché le doSelect à un OnSelect que tu aurais codé. (inspecteur d'objet)
 
Pour savoir si ce parent fais qqch aprés le OnSelect tu dois regarder dans son code, mais si tu détruis le composant il y aura certainement des erreurs du genres "erreur à l'adresse toto...." car il ne se trouvera plus lui même.
 
 
J'espère que je ne suis pas trop flou.
 
Tu devrais plutot nous dire pourquoi tu as à détruire ce composant...

Reply

Marsh Posté le 12-11-2006 à 21:49:34    

--  Veuillez escuser les aproximation syntaxique, je n'ai pas de compileur sous la main. --
 
C'est ça. Il fait le "erreur à l'adresse toto" à la sortie de la procedure OnSelect (il arrive à finir l'execution de la procedure. Solide ces bestioles!).
 
Pour resumer, je suis en train de construire un composant(dérivant de TPanel) contenant une liste de combo.  
 
Chaque combo est affiché sous le precedant.
Le dernier combo de la liste est toujours vide (liste de choix renseignée, mais ItemIndex = -1)
Lorsqu'on selectionne une valeur dans le dernier combo, un nouveau combo apparait en bas de la liste.
 
Ca donne grosso modo le code ci-dessous (avec un Tform "normal comme support):
 

Code :
  1. type TForm1 = class(TForm)
  2. ListCombo : TObjectList;
  3. end;
  4. Procedure TForm1.ReechelonerCombo;
  5. var i : integer;
  6. begin
  7.   //On affiche chaque combo de la liste, chacun espacer de 25 points
  8.   For i := 0 to ListeCombo.count-1 do begin
  9.     TComboBox(Liste[i]).top := (i+1)*25;
  10. end;
  11. function TForm1.AjouterCombo:TComboBox;
  12. begin
  13.   //On crée un Combo qu'on ajoute à la liste
  14.   Result := TComboBox.create(self);
  15.   ListCombo.Add(Result);
  16.   Result.parent := Support;
  17.   Result.items := 'choix1';
  18.   Result.items := 'choix2';
  19.   Result.items := 'choix3';
  20.   Result.items := '--- supprimer ---';
  21.   Result.itemIndex := -1;  //aucun choix selectioné
  22.   Result.OnSelect := TForm1.SelectionCombo;
  23. end;
  24. TForm1.procedure SelectionCombo(sender:TObject);
  25. var combo : TcomboBox;
  26. begin
  27.   Combo := TComboBo(sender);
  28.   If  combo = ListCombo[ListCombo.count-1] // si c'est le dernier combo de  
  29.   and Combo.itemIndex<>-1 then begin   //et qu'on a selectioné quelque chose
  30.     AjouterCombo;         //alors, on ajoute un nouveau combo (vide) au bas de l'écran
  31.     ReechelonerCombo;
  32.   end;
  33. end;


 
Pour l'instant, on a donc une liste de choix qu'on peut etende à l'infini, mais on ne peut pas suprimer un élément.
Tu aura remarqué que dans la liste des choix, j'ai ajouté une valeur "--supprimer--".  L'idée est que si l'utilisateur selectionnne cette valeur, le combo est supprimé et ceux en bas se décalent vers le haut.  
Le code de la suppression est simple:

Code :
  1. Procedure SupprimerCombo(Numero :integer);
  2. begin
  3.   ListeCombo.delete(Numero);// La Liste Own ses élément, donc, le combo est supprimé
  4.   ReechelonerCombo;
  5. end;


Mais où le caser  [:alph-one] .  
Pour l'instant, il est dans le TForm1.Canvas.OnRefresh(je teste chaque combo pour vois si il est sur "suprimer" ). Plutot crade et surtout, c'est galère pour une exécution pas à pas. :cry: .


Message édité par el zozo le 12-11-2006 à 21:58:00
Reply

Marsh Posté le 13-11-2006 à 11:30:50    

Si ça peut vous aider à vous faire une idée, voila un exemple simple d'utilisation
 
http://mapage.noos.fr/zozol/bin/listecombo.zip

Reply

Marsh Posté le 13-11-2006 à 21:25:44    

Je ne vois pas trop de solution, en fait ta solution me semble pas mal mais je l'aurai dédiée à un objet tierce dont l'exécution aurait été déclenchée hors de la Combo. (le OnActivate du panel qui rend la main à la Combo précédente dans la liste ??)
 
C'est pas top mais c'est plus facile à débuguer je crois ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed