Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2716 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  [delphi]Supprimer un compsant lors d'un evenement

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[delphi]Supprimer un compsant lors d'un evenement

n°1471106
el zozo
Stroumf Grognon
Posté le 06-11-2006 à 14:28:00  profilanswer
 

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?

mood
Publicité
Posté le 06-11-2006 à 14:28:00  profilanswer
 

n°1473895
xlogan
Tu l'as vu ?
Posté le 11-11-2006 à 14:33:00  profilanswer
 

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...

n°1474271
el zozo
Stroumf Grognon
Posté le 12-11-2006 à 21:49:34  profilanswer
 

--  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
n°1474407
el zozo
Stroumf Grognon
Posté le 13-11-2006 à 11:30:50  profilanswer
 

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

n°1474890
xlogan
Tu l'as vu ?
Posté le 13-11-2006 à 21:25:44  profilanswer
 

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 ?


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  [delphi]Supprimer un compsant lors d'un evenement

 

Sujets relatifs
installer composants dans delphi[Résolu] Question Poo en delphi
Me lancer dans le Delphi?ide delphi gratuit et efficace; merci
Problème évènement et JTable[Résolu]Fenêtres existentes et fenêtre active
[CSS / HTML] Supprimer le Scrolling vertical IFRAMEBatch - Supprimer les attributs lecture seule d'une archive zip
Est-il possible de supprimer un popup ? 
Plus de sujets relatifs à : [delphi]Supprimer un compsant lors d'un evenement


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR