Composant dynamique : comment coder pour un compos non encore créé

0/5 (14 avis)

Vue 5 784 fois - Téléchargée 393 fois

Description

Quand vous créez des compos en mode runtime, il est difficile d'y faire référence dans votre code...
Ok?
Bon!
Mais difficile n'est pas impossible.
...Et puis, finalement, c'est très facile!

Source / Exemple :


unit Unit1;

interface

uses
  Windows, Messages, StdCtrls, Classes, Controls, Forms, Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1    : TPanel;
    Btn_Creer : TButton;
    Btn_Ecrire: TButton;
    procedure Btn_CreerClick(Sender: TObject);
    procedure Btn_EcrireClick(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Btn_CreerClick(Sender: TObject);
  var
      NewEdit : TEdit;
  begin
  if   Panel1.ComponentCount=0 then begin
       NewEdit        := TEdit.Create(Panel1);
       NewEdit.Parent := Panel1;
       NewEdit.Left   := 4;
       NewEdit.Top    := 4; end
  else ShowMessage('L''Edit est déjà créé!');
end;

procedure TForm1.Btn_EcrireClick(Sender: TObject);
  begin
  if Panel1.ComponentCount = 1 then begin
       {Le TEdit est identifié en tant que compos indexé du TPanel}
       (Panel1.Components[0] as TEdit).Text := 'Bonjour !'; end
  else ShowMessage('L''Edit n''est pas encore créé!');
end;

end.

Conclusion :


Je me demande si je n'enfonce pas une porte ouverte...
En tout cas, je n'avais rien trouvé.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
lord948 Messages postés 34 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 19 mai 2009
8 janv. 2009 à 02:59
bizarre !!!
cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
22 avril 2006 à 21:29
--> Delphiprog
Je ne proposait cette méthode que pour la faire coonnaitre. J'utilise régulièrement la création dynamique et quand ce n'est que pour quelques objets j'utilise bien sur le transtypage et les objet existants ( TComponent.Components, TWinControl.Controls ).

Mais dans le cas d'un grand nombre avec des besoin particulier un héritage est bien mieux adapté.

PS : je viens te voir ici vu que l'on ne te vois pas beaucoup là ba. :wink:
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
21 avril 2006 à 23:31
Tout d'abord, je salue la présence de Nono40 parmi nous.
Comme la création dynamique de composants, leur sauvegarde et leur restauration à partir d'un flux fichier est un sujet sur lequel nous avons collaboré, j'invite les curieux à se rendre à cette adresse : http://tinyurl.com/k72zj

Toutefois, voici un point sur lequel je suis un peu moins d'accord quand il écrit "Tu dérives une classe descendante de TObjectList ou même un TComponentList et tu n'as plus rien à transtyper non plus."
Je trouve que c'est se donner beaucoup de mal quand on n'a besoin que de deux ou trois méthodes de TObjectList, TComponentList ou autres semblables. Il faut pratiquement surcharger toutes les méthodes alors qu'elles ont été définies comme statiques par les concepteurs de la VCL.
Dans ces cas là, je vous conseille d'opter pour la composition et non l'héritage.

Caribensila a écrit : "j'avais rencontré des problèmes pour traiter les événements des compos créés après un 'ReadComponentResFile' dans le code"
Quand tu affectes une méthode à un évènement, tu affectes en réalité un pointeur de méthode. Si au cours de la session courante de ton logiciel tu affectes Nil puis que tu affectes de nouveau une méthode à un évènement, pas de problème. Mais comme les exe sont relogeables et rien ne permet de dire que la session suivante s'effectuera avec les mêmes adresses mémoire, je te laisse imaginer les dégâts que cela pourrait causer si tu affectais une adresse qui ne serait alors plus valide !...
GPF garantie 8-S
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
21 avril 2006 à 19:21
--> Salut HURRYCANE
Moi, j'avais rencontré des problèmes pour traiter les événements des compos créés après un 'ReadComponentResFile' dans le code...

Par exemple, on 'Read' un TPanel contenant un TImage et :

MyImage.OnMouseDown := Action1Execute; // ne fonctionne pas!

Par contre, ça, ça fonctionne:

(MonPanel.Components[0] as TImage).OnMouseDown := Action1Execute;

Je ne comprends très bien pkoi.
Un exemple pourrait aider des débutants, je pense...
hurrycane Messages postés 117 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 19 juin 2009 1
21 avril 2006 à 18:37
les compos dynamique leurs création, leur maniements extra ou intra code ainsi que la gestion de leurs evenements dans le code est trop facile et je nai jamais trouvé de probleme la dedans !
je vais vous poster un exemple , faites moi svp un cahier des charges -- serieux je rigole pas !
Afficher les 14 commentaires

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.