SuperNoizo
Messages postés23Date d'inscriptiondimanche 23 juin 2002StatutMembreDernière intervention30 janvier 2005
-
15 août 2002 à 16:05
cs_Bestiol
Messages postés833Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention 3 novembre 2005
-
17 août 2002 à 23:18
J'aimerais ajouter des ToolButtons pendant l'execution de mon soft qq1 pourrait-il m'aider ?
Merci
Youyou0214
Messages postés89Date d'inscriptionjeudi 11 avril 2002StatutMembreDernière intervention 3 juillet 2003 15 août 2002 à 17:00
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;
cs_Nono40
Messages postés962Date d'inscriptionmercredi 3 avril 2002StatutMembreDernière intervention12 septembre 20062 15 août 2002 à 21:26
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.
cs_Bestiol
Messages postés833Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention 3 novembre 20051 16 août 2002 à 01:39
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...
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Bestiol
Messages postés833Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention 3 novembre 20051 16 août 2002 à 01:45
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 ! :)
cs_Nono40
Messages postés962Date d'inscriptionmercredi 3 avril 2002StatutMembreDernière intervention12 septembre 20062 16 août 2002 à 05:55
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.
cs_Bestiol
Messages postés833Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention 3 novembre 20051 16 août 2002 à 21:44
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 !)
cs_Nono40
Messages postés962Date d'inscriptionmercredi 3 avril 2002StatutMembreDernière intervention12 septembre 20062 16 août 2002 à 22:47
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".
cs_Bestiol
Messages postés833Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention 3 novembre 20051 16 août 2002 à 23:58
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é !