OcHre
Messages postés44Date d'inscriptionmercredi 23 mars 2005StatutMembreDernière intervention26 avril 2008
-
23 nov. 2006 à 13:45
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 2022
-
23 nov. 2006 à 18:25
Salut, j'aimerais savoir comment associer une procedure à une
propriété d'un composant créé dynamiquement (dans ce cas la propriété
OnClick d'un Tbutton) sachant que ce composant n'a pas comme owner
TForm1 mais une form créée dynamiquement...Voila à quoi ressemble mon
code pour l'instant :
procedure creaform;
var
form:Tform;
begin
form:=Tform.creat(form1);
form.parent:=nil;
with tbutton.create(form) do
begin
parent:=form;
OnClick:=?????;
end;
form.show;
end;
Voila en espérant avoir été assez clair, merci d'avance pour les eventuelles réponses.
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 23 nov. 2006 à 14:23
Salut,
type TForm1 = class (TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
private { Déclarations privées }
public { Déclarations publiques } Procedure MonButtonClick(Sender : TObject);
end;
var Form1: TForm1;
MonButton : TButton;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin MonButton : = TButton.Create(Self);
With MonButton Do Begin Left := 10;
Top := 10;
Parent := Self;
Caption := 'MonButton';
OnClick := MonButtonClick;
End ;
end;
procedure TForm1.MonButtonClick(Sender: TObject);
begin ShowMessage('Cliqué');
end;
cs_Loda
Messages postés814Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention30 juillet 20093 23 nov. 2006 à 14:38
salut,
d'abord un conseil: Fait attention à qui est le "owner" de ce que tu crée dynamiquement. dans ton code, si je ferme Form1, ta nouvelle form serra détruite.
(je pense que c'est ce que tu veux, mais fait juste gaffe.)
Aussi c'est souvent utile (ou indispensable) de garder une liste des forms crée dynamiquement (pour les afficher, lire des propriétés, ...) . Donc je te conseille de transformer ta procedure en function (:TForm) et d'utiliser un TComponentList ou qqch comme ça.
(suivant ce que tu fais dans ton applic ou si c'est des MDIChild, c'est peut-être inutile)
pour ta question,
t'y était presque !
OnClick := MonOnClickBtn;
avec
procedure TForm1.MonOnClickBtn(sender : TObject);
Si tu regarde le type de la propriété OnClick, c'est TNotifyEvent. qui est un type de methode.
je te conseille de jeter un coup d'oeil sur les TYPE procedure/methode. Tout deviendra limpide à tes yeux :D
fait attention, car tu pourrais avoir des problèmes d'AV si par exemple, la form qui contient le MonOnClickBtn est detruit mais pas la nouvelle form. lorsque tu cliquera sur le bouton, il essayera d'appeler un methode qui n'existe plus !
En fonction de ce que ton boutton doit faire,
Tu devrais peut-être crée un type de form avec la methode MonOnClickBtn.
Crée une nouvelle fiche (dans l'EDI) avec
.name = frmNouvelleFiche (nom du type TfrmNouvelleFiche )
ajoute une methode MonOnClickBtn
et remplace
TForm par TfrmNouvelleFiche dans ta function CreaForm
OnClick := Form.MonOnClickBtn;
et ici, ta methode serra dans la nouvelle form, et donc serra toujours disponible quand tu cliquera sur le bouton.
bon continuation,
PS: t'as bien poser ta question. merci.
PS2: si je me suis pas bien fait comprendre, demande moi.
OcHre
Messages postés44Date d'inscriptionmercredi 23 mars 2005StatutMembreDernière intervention26 avril 2008 23 nov. 2006 à 15:23
Merci pour vos réponses, je pense que ce qui pose probleme ici c'est entre autre mes lacunes concernant les TYPE procedure/methode...
Sinon oui le but ici est que ma form soit detruite quand la form principale l'est, et pour la liste des form créées je ne sais pas si c'est vraiment utile puisque les fiches créées dynamiquement sont renommées j'y accède donc par leur nom. Parcontre la méthode de Cirec, que j'avais deja essayée, ne marche pas (incompatibilité entre TNotifyEvent et Procedure). Parceque mon TButton créé a comme owner la fiche créée dynamiquement et non la form principale j'imagine...
Voila le code en entier cette fois :
procedure fmsgp(nom:string; msg:string);
var
memo:tmemo;
form:Tform;
begin
form:=tform(form1.FindComponent(nom));
if form=nil then
begin
form:=tform.Create(form1);
with form do begin
parent:=nil;
caption:=nom;
name:=nom;
show;
end;
memo:=tmemo.create(form);
with memo do
begin
Parent:=form;
name:='m'+nom;
lines.Clear;
end;
with tedit.Create(form) do
begin
Parent:=form;
name:='e'+nom;
end;
with tbutton.Create(form) do
begin
caption:='Calotte!';
Parent:=form;
nom:='b'+nom;
onclick:=MonButtonClick;
end;
end;
form.Show;
memo:=tmemo(form.FindComponent('m'+nom));
memo.Lines.Add(msg);
end;
OcHre
Messages postés44Date d'inscriptionmercredi 23 mars 2005StatutMembreDernière intervention26 avril 2008 23 nov. 2006 à 16:47
Ben fait elle est déclaré dans Déclaration publique, j'ai aussi essayé dans Type ca ne change rien, sinon la procedure MonButtonClick est placé au-dessus de la procedure fmsgp (celle qui l'appelle), pour tester j'ai juste fait un c/c de ta procedure donc à ce niveau là rien a changé.