Creation d'un composant graphique

Sat83 Messages postés 166 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 13 octobre 2008 - 11 juin 2007 à 15:02
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 12 juin 2007 à 03:41
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

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
11 juin 2007 à 17:17
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;
0
Sat83 Messages postés 166 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 13 octobre 2008
11 juin 2007 à 18:05
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!
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
12 juin 2007 à 03:41
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;
0
Rejoignez-nous