Propriété composant dynamique [Résolu]

OcHre 46 Messages postés mercredi 23 mars 2005Date d'inscription 26 avril 2008 Dernière intervention - 23 nov. 2006 à 13:45 - Dernière réponse : Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention
- 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.

Rions un peu en attendant la mort.
Afficher la suite 

11 réponses

Répondre au sujet
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 23 nov. 2006 à 14:23
+3
Utile
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;

end.

 
@+
Cirec

<hr size ="2" />
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Cirec
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 23 nov. 2006 à 14:38
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Loda
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 23 nov. 2006 à 14:40
0
Utile
@Cirec:

je me fait vieux. Je suis lent.... :)
Commenter la réponse de cs_Loda
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 23 nov. 2006 à 14:48
0
Utile
C'est pas bien grave d'autant plus que ton message est
complémentaire au mien

je n'ai fait que donner un exemple parmi les plus simples, alors que le tien
donne plus  d'informations sur
d'éventuels pièges





 






@+
Cirec





<hr size="2" />
Commenter la réponse de Cirec
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 23 nov. 2006 à 14:50
0
Utile
on verra si ça l'aide....
Commenter la réponse de cs_Loda
OcHre 46 Messages postés mercredi 23 mars 2005Date d'inscription 26 avril 2008 Dernière intervention - 23 nov. 2006 à 15:23
0
Utile
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;
Commenter la réponse de OcHre
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 23 nov. 2006 à 16:09
0
Utile
Ce qui serait utile de savoir c'est comment (ou) as tu déclaré la procedure MonButtonClick ...

le problème vient certainement de la

 
@+
Cirec

<hr size="2" />
Commenter la réponse de Cirec
OcHre 46 Messages postés mercredi 23 mars 2005Date d'inscription 26 avril 2008 Dernière intervention - 23 nov. 2006 à 16:47
0
Utile
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é.
Commenter la réponse de OcHre
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 23 nov. 2006 à 17:50
0
Utile
Si tu le désires je t'envoie mon Mail par MP et tu m'envoies ton code (complet) par retour et la ce sera plus simple pour moi de trouver ce qui cloche

 
@+
Cirec

<hr size="2" />
Commenter la réponse de Cirec
OcHre 46 Messages postés mercredi 23 mars 2005Date d'inscription 26 avril 2008 Dernière intervention - 23 nov. 2006 à 18:03
0
Utile
Ouais bien sur, c'est cool merci.
Commenter la réponse de OcHre
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 23 nov. 2006 à 18:25
0
Utile
Regarde tes messages ... c'est fait

en haut de page ... "Messages"

 
@+
Cirec

<hr size="2" />
Commenter la réponse de Cirec

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.