Creation d'un composant graphique

Signaler
Messages postés
166
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
13 octobre 2008
-
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
-
Bonjour!

Je me suis lancée dans la création de mon premier composant graphique, mais j'ai un petit probleme.
En gros, je veut creer un composant de type Panel avec des composant (Tedit, TLabel, etc... ) deja incorporer dessus.
Jusque là pas de soucis! Le probleme vient lorsque je veut ajouter un TCombobox...

Voilà un bout de code pour vous permettre de comprendre:

type  TMyPanelPerso = class(TCustomPanel)
  private
   fMyBox : TComboBox;
 public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
end;

constructor TMyPanelPerso .Create(AOwner: TComponent);
begin
  inherited Create(aOwner);
  Height := 88;                           
  Width  := 272;
  fMyBox := TComboBox.Create(Self);
  OrganizeComponent;              
end;

procedure TMyPanelPerso .OrganizeComponent;
begin
   with  fMyBox do
      begin
        Parent  := Self;
        Top     := 14;
        Left    := 90;
        Width   := 65;
        Items.Add('blablabla1');
        Items.Add('blablabla2');
        Items.Add('blablabla3');
        ItemIndex := 0;  
        Style   := csDropDownList;
      end;
end;

J'ai laissé ici que le code concernant la Combobox. En rouge le code qui pose probleme avec l'erreur 'control has no parent windows' . A noté que le reste de mon code fonctionne (il y a egalement des Edit, Label, RadioButton, etc...) et que sans les lignes en rouge cela fonctionne parfaitement.

Ma question est donc de savoir comment remplir ma combobox, puisque apparement je ne le fait pas au bon endroit.

En esperant que j'ai été a peut pret clair dans ma requete!

3 réponses

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
constructor TMyPanelPerso.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  Height := 88;
  Width  := 272;

  if AOwner is TWinControl then
    Parent := TWinControl(AOwner)
  else
  begin
    MessageDlg('Ce composant doit etre créé dans un descendant de TWinControl',mtWarning,[mbOk],0);
    exit;
  end;

  fMyBox := TComboBox.Create(Self);

  OrganizeComponent;
end;
Messages postés
166
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
13 octobre 2008

Re-bonjour!

Merci fOxi! Ca marche! Tu est mon heros!

J'ai encore deux autres petis soucis avec la création de mon composant:

1)
Dans le constructeur de mon TMyPanelPerso, je fait un
Caption := '' ;
Lorsque je creé mon composant dynamiquement, ca marche. Par contre, en mode conception si je place mon composant sur ma fiche, il y a un horrible 'MyPanelPerso1' en plein milleu! Si j'execute le programme, ça disparait (donc il apparait juste en mode conception). Comment faire pour ne pas l'affiché non plus en mode conception?

2)
J'ai creer une propriété a mon Panel, pour permettre en mode conception d'afficher tout les element du Panel, ou juste une partie:
  property toutMontrer : boolean read fMontrer write setMontrerTout;
où setMontrerTout est une fonction qui prend un boolean en parametre et qui rend visible ou non les composant en questions.
Lorsque dynamiquement dans mon programme je fais:
monPanel.toutMontrer : = True;
monPanel.toutMontrer := False;
ca marche sans probleme. Mais en mode conception, le changement de ce parametre (dans l'inspecteur d'objet) ne produit aucun effet.

Si jamais quelqu'un a une idée sur ces deux points, je les remercie d'avance!
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
quand tu modifie l'etat visuel d'un composant tu doit appeler sa procedure de modification qui est generalement :

Change, Changed, Update, ou encore Invalidate.

regarde dans l'aide delphi dans la classe de base que tu utilise.

il faut parfois faire par exemple :

protected
   procedure change; override;

procedure MonCompo.Change;
begin
...   Changement perso

   Inherited Change;
end;