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...
avec dans le constructeur :
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}; };
Et, pour afficher ou cacher la liste, je faire Autolist->Show() ou Hide() et hop !
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; }
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...
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...
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();
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
Partager