Creation dynamique de controles

Soyez le premier à donner votre avis sur cette source.

Vue 7 949 fois - Téléchargée 812 fois

Description

Un petit exemple sur comment créer des composants controles dynamiquement, et cela en n'utilisant qu'un seul tableau de stockage.
La même méthode peut être utilisé avec des composants qui ne sont pas dérivés de TControl. Il suffit de prendre un ancetre des composants voulus comme base du tableau dynamique.

Source / Exemple :


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button5: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  VertPos:integer;
  Form1: TForm1;
  Objects: array of TControl;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if length(Objects)=0 then
    VertPos:=20;
  setlength(Objects,length(Objects)+1);
  Objects[length(Objects)-1]:=TLabel.create(Application);
  (Objects[length(Objects)-1] as TLabel).Parent:=Form1;
  (Objects[length(Objects)-1] as TLabel).Name:='Label'+inttostr(length(Objects)-1);
  (Objects[length(Objects)-1] as TLabel).Caption:='Label'+inttostr(length(Objects)-1);
  (Objects[length(Objects)-1] as TLabel).Top:=VertPos;
  (Objects[length(Objects)-1] as TLabel).Left:=20;
  VertPos:=VertPos+20;
  end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if length(Objects)=0 then
    VertPos:=20;
  setlength(Objects,length(Objects)+1);
  Objects[length(Objects)-1]:=TButton.create(Application);
  (Objects[length(Objects)-1] as TButton).Parent:=Form1;
  (Objects[length(Objects)-1] as TButton).Name:='Button'+inttostr(length(Objects)-1);
  (Objects[length(Objects)-1] as TButton).Caption:='Button'+inttostr(length(Objects)-1);
  (Objects[length(Objects)-1] as TButton).Top:=VertPos;
  (Objects[length(Objects)-1] as TButton).Left:=20;
  VertPos:=VertPos+30;
  end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  if length(Objects)=0 then
    VertPos:=20;
  setlength(Objects,length(Objects)+1);
  Objects[length(Objects)-1]:=TMemo.create(Application);
  (Objects[length(Objects)-1] as TMemo).Parent:=Form1;
  (Objects[length(Objects)-1] as TMemo).Name:='Memo'+inttostr(length(Objects)-1);
  (Objects[length(Objects)-1] as TMemo).Text:='Memo'+inttostr(length(Objects)-1);
  (Objects[length(Objects)-1] as TMemo).Top:=VertPos;
  (Objects[length(Objects)-1] as TMemo).Left:=20;
  VertPos:=VertPos+95;
  end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  if length(Objects)=0 then
    VertPos:=20;
  setlength(Objects,length(Objects)+1);
  Objects[length(Objects)-1]:=TEdit.create(Application);
  (Objects[length(Objects)-1] as TEdit).Parent:=Form1;
  (Objects[length(Objects)-1] as TEdit).Name:='Edit'+inttostr(length(Objects)-1);
  (Objects[length(Objects)-1] as TEdit).Text:='Edit'+inttostr(length(Objects)-1);
  (Objects[length(Objects)-1] as TEdit).Top:=VertPos;
  (Objects[length(Objects)-1] as TEdit).Left:=20;
  VertPos:=VertPos+30;
  end;

procedure TForm1.Button5Click(Sender: TObject);
var
  iloop:integer;
begin
  for iloop:=0 to length(Objects)-1 do
    Objects[iloop].Free;
  Setlength(Objects,0);
  end;

End.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

MUSTAPH_A
Messages postés
20
Date d'inscription
mardi 30 août 2005
Statut
Membre
Dernière intervention
8 mai 2010

j'ai besion de savoir comment modifier la couleur d'un composant dynamique creer par exemple j'ai utiliser votre méthode pour creer un bitbtn mais j'arrive pas a modifier leur coleur merci pour votre exemple. pour plus de contact voici mon Email: etudiant_mail@yahoo.fr
cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
26
Pour la gestion des évènements OnDragOver, OnMouseDown and so on, les déclarations sont en Protected au niveau de TControl. Ce n'est qu'au niveau du composant directement utilisable que la portée est déclarée Published.Il est donc normal que le compilateur n'accepte pas que tu affectes un pointeur de méthode à ce niveau.

Pour les composants TDbEdit, TDbMemo ou TDbCheckbox, il n'y a pas d'ancêtre commun au delà de TWinControl (si tu as le poster de la hiérarchie de la VCL, jettes-y un oeil). Autant dire que c'est quasiment impossible de réaliser un code commun au traitement des différents cas de figure (composants "simples" et composants orientés données).
Icebird
Messages postés
11
Date d'inscription
lundi 14 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2005

J'ai un souci pour centraliser mon code de création avec quelques proptiétés. Il n'y a aucun problème pour toutes les propriétés communes aux TControl, mais, malgré le fait qu'ils apparaissent dans l'aide dans la liste d'evenements d'un TControl, impossible d'affecter les OnDragOver et OnMouseDown, j'ai une erreur de compilation.

Dans le même genre, je crée des DBEdit, DBMemo et DBCheckBox. A chaque fois je doit définir leur propriété DataField et DataSource. J'ai voulu centraliser çà au lieu d'avoir un cas particulier pour chaque type de composant DB, mais rien à faire, ils n'ont pas de composant parent avec ces propriétés en commun, et je me retrouve obligé de faire une série de "if ... is ... then".
Bref, je ne réussit à avoir en commun que les propriétés les plus basiques: top, left, parent, tag et name.
cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
26
Pour lire les propriétés Caption, il faut charger le projet dans Delphi, n'est-ce pas ?
Or, la lecture d'un code source devrait suffire pour comprendre quelles actions sont réalisées par les différents composants !
Il est également bien venu d'appliquer un minimum de conventions comme préfixer ses boutons par "btn", les TEdit par "ed", etc.
C'est un conseil que je te donne, après tu en fais ce que tu veux...

Pour le TComponentlist, je crois me souvenir qu'il existait déjà sous Delphi 4.

Pour info : les métaclasses sont également appelées références de classe. D'ailleurs, en consultant l'aide en ligne, tu trouveras un exemple de code exploitant le principe des métaclasses.

Que Delphi soit avec toi. ;o)
Icebird
Messages postés
11
Date d'inscription
lundi 14 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2005

Génial! Merci beaucoup, il me manquait en effets deux/trois trucs et je butait dessus depuis un moment:

TComponentList: C'est récent non? Je me suis remit à Delphi depuis très peu de temps après 5 ans d'absence, et à l'époque il me semble que le tableau dynamique était la seule solution. Maintenant que je sais qu'il existe, je vais explorer un peu ce TComponentList avec grand plaisir =)

MetaClasses: Encore quelque chose que j'ignorais, et le point sur lequel je butais. Je vais de ce pas approfondir, je sens que çà va bien m'aider.

Nommage: oui, un peu de fainéantise de ma part, je l'avoue, mais en même temps il n'y a pas 36k boutons, et leurs captions sont assez explicites.

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.

Du même auteur (Icebird)