Bonjour,

Je suis en train de définir un composant utilisateur qui ressemble un peu à un TComboBox, et est composé de 2 parties :

1- un TEdit, toujours visible
2- un TListBox, qui est affiché en dessous sous certaines conditions.

Je fais descendre le composant de TEdit, et lui associe un TListBox... Ca donne donc un truc comme ca...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
class PACKAGE TMLLookup : public TEdit
{
private:
	TListBox *FAutolist;
__published:
  __property TListBox *AutoList = {read=FAutolist,write=FAutolist};
};
avec dans le constructeur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
__fastcall TMLLookup::TMLLookup(TComponent* Owner)
	: TEdit(Owner)
{
AutoList=new TListBox(this);
AutoList->Parent=this;
AutoList->Visible=false;
AutoList->Width=Width;
AutoList->Top=Height;
}
Et, pour afficher ou cacher la liste, je faire Autolist->Show() ou Hide() et hop !

Oui mais voila, quand je veux afficher le TListBox, comme il doit apparaitre en dessous du TEdit, il est en dehors de la zone d'affichage de son Parent (le TEdit), et donc, il n'est pas visible...

Une solution naive serait de tout faire dépendre d'un TPanel qui aurait la bonne taille. Mais du coup, il faudrait réserver la place d'affichage de la ListBox, même quand elle est invisible. Ca gaspille pas mal de place sur l'écran.

J'ai trouvé une bidouille : lors de l'affichage de la TListBox, je modifie son Parent au vol, et l'affecte au Parent de son parent...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
AutoList->Parent=Parent;
AutoList->Left=Left;
AutoList->Width=Width;
AutoList->Top=Top+Height;
AutoList->Show();
Et je la remet à sa place quand on la cache. Mais ce n'est pas très élégant, et si le parent n'a pas la place d'afficher l'Autolist, je suis ramené au problème précédent...

Y a-t-il une façon propre de permettre à un sous composant de s'afficher en dehors de la zone d'affichage de son parent?

Francois