Ajout dynamique de ToolButton

Signaler
Messages postés
23
Date d'inscription
dimanche 23 juin 2002
Statut
Membre
Dernière intervention
30 janvier 2005
-
Messages postés
833
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
-
J'aimerais ajouter des ToolButtons pendant l'execution de mon soft qq1 pourrait-il m'aider ?
Merci

SupeRNoiZo

11 réponses

Messages postés
89
Date d'inscription
jeudi 11 avril 2002
Statut
Membre
Dernière intervention
3 juillet 2003

Je n'ai pas essaye mais il faut surement mettre la propriete visible a false pas default de ton composant et sur un procedure quelquonque tu met Toolbar1.visible:= true;
Messages postés
23
Date d'inscription
dimanche 23 juin 2002
Statut
Membre
Dernière intervention
30 janvier 2005

En fait le prob c'est po avec le ToolBar, ms avec les toolbuttons je c po cmt faire pour en ajouter dynamiquement
Messages postés
962
Date d'inscription
mercredi 3 avril 2002
Statut
Membre
Dernière intervention
12 septembre 2006
2
Voici comment créer un ToolButton à l'exécution, c'est en fait très simple :

procedure TForm1.Button1Click(Sender: TObject);
Var Btn:TToolButton;
begin
// Crétion du nouveau bouton
Btn:=TToolButton.Create(Self);
// Association à la barre d'outils
// Cette ligne est INDISPENSABLE
Btn.Parent:=ToolBar1;
// Ajoute la mise à jour des propriétés :
Btn.
// Associe un événement au bouton :
Btn.OnClick:=MonClick;
end;

L'événement utilise est ici une procédure définie manuellement. Dans la partie "Public" de la fiche ajoute la ligne comme suit :
public
{ Déclarations publiques }
Procedure MonClick(Sender:TObject);
end;

Puis écris le code :
Procedure TForm1.MonClick(Sender: TObject);
Begin
ShowMessage('Click sur le nouveau bouton effectué');
End;

Note que la création d'un événement comme ci-dessus n'est pas indispensable, tu peux associer un événement d'un bouton déjà existant. Tu peux aussi associer la propriété MenuItem ou Action du nouveau bouton pour définir les actions sur les clicks.

Es-tu sur que cette méthode est la meilleure ? Il n'est pas facile ensuite de supprimer les boutons. Regarde plus en détail la réponse de Youyou0214. Il te conseil en fait de créer tous les boutons en conception ( c'est plus facile ) et de metre Visible à False sur ceux que tu ne veux par voir de suite. Puis il suffit de mettre Visible à True pour les afficher.

--- :sleepy) Nono du Moulin :sleepy) ---
Messages postés
833
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
1
Nono40 à raison... Mais s'il s'agit de créer un bouton pour chaque plugin trouvé dans un répertoire, par exemple, la création dynamique est la seule solution qui me vient à l'esprit...

Voici donc comment tu peux libérer la mémoire allouée à tes boutons :

procedure TForm1.FormClose(...);
var i: integer;
Begin
for i := 0 to ComponentsCount - 1 Do
if Components[i] is TToolButton then
TToolButton(Components[i]).free;
end;

Je pense que ça doit marcher, mais attention :
ça peut peut-être créer des erreurs, car cela détruira tous les TToolButton sans exception, y compris ceux détruits automatiquement lors de la destruction de la form... Un essai d'accès ultérieur par la form pour une [seconde] destruction pourrait-être fatal... Tu peux donc, par exemple, rajouter une condition avant de détruire le composant, du genre : "... and (Pos('dynbtn', Components[i].Name) <> 0) then ...

Tu auras peut-être besoin de créer une variable contenatn le nom du composant en cours...

Bestiol.
PS: Le code que je te donne là contient peut-être des erreurs, faute de possibilité de test...
Messages postés
833
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
1
J'ai oublié quelque chose : Tous tes boutons créés dynamiquement devront porter un nom du genre 'dynbtn' + PluginName...
C'était compréhensible en lisant le dernier bout de code que j'acais écrit, mais je préfère préciser ! :)

Bestiol.
Messages postés
962
Date d'inscription
mercredi 3 avril 2002
Statut
Membre
Dernière intervention
12 septembre 2006
2
Désolé Bestiol, mais tu viens de dire une grosse c.....

IL NE FAUT PAS LIBERER LES COMPOSANTS SOI-MEME SOUS PEINE D'UN GROS PLANTAGE !!!

Etant donné que les composants sont créés et associé à un propriétaire ( Self dans l'exemple que je donne désigne la fiche ). Alors le propriétaire se chargera de leur destruction, il ne faut surtout pas le faire soi-même. On ne doit détruire que les composant qui n'ont pas de propriétaires, par exemple si le TToolButton était été créé avec TToolButton.Create(Nil) alors la il faudrait effectivement le détruire en fin de programme. mais par contre dans ce cas il n'est pas conseillé de l'associer au parent ToolBar.

De plus ta boucle ne fonctionnerait pas car tu fait for i:=0 to ComponentCount-1 Do... Or si deux boutons se suivent, dés que le premier serait détruit, les autres seraient décalés vers le bas. Donc le composant suivant ne serait pas testé. De plus à la fin du tableau ComponentCount ayant diminué en cours de route tu n'aboutirais pas. Dans ce genre de boucle il faut toujours parcourir à l'envers :
For i:=ComponentCount-1 DownTo 0 ...

Enfin il ne suffit pas d'appeler free, car la fiche garde en mémoire l'adresse du composant, il faut d'abord lui demander de "l'oublier" avant de le détruire :
procedure TForm1.FormClose(...);
var i: integer;
Begin
for i := ComponentCount-1 DownTo 0 Do
if Components[i] is TToolButton then
Begin
// On le supprime de la liste d'abord
RemoveComponent(Components[i]);
// Puis seulement on le supprime
TToolButton(Components[i]).free;
End;
end;

Voila, mais en fait la procédure ci-dessus est inutile car les composants sont détruits automatiquement. Ce n'est utile que si tu veux les détruire avant la fin du programme.

--- :sleepy) Nono du Moulin :sleepy) ---
Messages postés
833
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
1
Ah... %-6 !!

Moi je voulais juste [essayer de (vu que ça marche pas !)] faire un suite à ton message, car tu posais le problème de la destruction... Mais bon, si y a pas besoin !!! :sad)

Mais j'ai une bonne excuse : J'avais pas Delphi pour tester, na !! (OK, ça n'excuse rien, et puis zut alors !)

Bonne prog' quand même !! :big)
Bestiol.
Messages postés
962
Date d'inscription
mercredi 3 avril 2002
Statut
Membre
Dernière intervention
12 septembre 2006
2
Ce n'est pas grave...

J'ai répondu comme ça car c'est une erreur courante quand on ne le sait pas et qu'ensuite c'est source de messages très bizarres style "Faute de protection générale lecture de l'adresse xxxxxx".

Bonne prog à toi aussi, ô Bestiol.

--- :sleepy) Nono du Moulin :sleepy) ---
Messages postés
833
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
1
Je n'avais pas mal pris ta réponse... Mais disons que t'es toujours déçu, quand tu répond une connerie (pour finir ce que tu n'avais pas voulu écrire !! :big) )...

@+, ô Nono !

Bestiol.
PS: J'ai tellement vu d'erreur du type "Faute de protection générale lecture de l'adresse xxxxxx" que ça ne m'aurait pas beaucoup troublé !
Messages postés
23
Date d'inscription
dimanche 23 juin 2002
Statut
Membre
Dernière intervention
30 janvier 2005

Merci bcp @ tous ceux qui m'ont répondu
& bonne prog'

:big) SupeRNoiZo SuperContent :big)
Messages postés
833
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
1
Alors si t'es SuperContent, on l'est aussi !!

Bonne continuation pour ton prog !
Bestiol.