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

Soyez le premier à donner votre avis sur cette source.

Vue 5 589 fois - Téléchargée 384 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
Messages postés
34
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
19 mai 2009

bizarre !!!
Messages postés
962
Date d'inscription
mercredi 3 avril 2002
Statut
Membre
Dernière intervention
12 septembre 2006
1
--> 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:
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
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
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
--> 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...
Messages postés
117
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
19 juin 2009
1
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.