Delphi57
Messages postés4Date d'inscriptionjeudi 14 juin 2007StatutMembreDernière intervention18 juin 2007
-
14 juin 2007 à 14:29
Delphi57
Messages postés4Date d'inscriptionjeudi 14 juin 2007StatutMembreDernière intervention18 juin 2007
-
18 juin 2007 à 10:23
Bonjour à tous,
J'ai petit soucis de "tabstop" inefficace :
Mon application principale appelle une fonction contenue dans une DLL. Cette fonction crée une fenetre TForm en passant dans la méthode CreateParams un handle identifiant le contrôle (TTabSheet) de mon application principale, qui accueillera cette fenetre:
Or quand cette fenetre est créée dans ces conditions le tabstop sur les contrôles ne fonctionne pas.
Par Contre quand celle-ci est appelée sans passer par ce CreateParams les tabstop fonctionnent tout à fait normalement !
PS: L'application principale est en delphi 2005, et la DLL en Delphi 5
Si vous avez des idées, je vous en serais éternellement reconnaissant... car moi, je séche !
Delphi57
Messages postés4Date d'inscriptionjeudi 14 juin 2007StatutMembreDernière intervention18 juin 2007 15 juin 2007 à 09:31
Merci pour ta réponse.
Je viens de vérifier dans mon code : je me suis aperçu qu'en simplifiant le code que j'ai collé dans mon message initial, j'avais oublié la ligne que tu me préconise...Mille excuses ! Du coup, on peut considérer que la surcharge de mon CreateParams l'intégre déjà ...
Aurais-tu une autre piste ?
Ce que je me demandais c'est : ne faut-il pas plutôt agir sur le contrôle TTabSheet qui "acceuille" cette fenetre ? Car en fait, j'ai la nette impression que ce contrôle ignore qu'il a un contrôle enfant (la fenetre) et que dans ce cas il semblerait "normal" que la gestion des tabstop soit inefficace ...???
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 15 juin 2007 à 12:48
Salut !
Je te cite un peu: "en simplifiant le code que j'ai collé dans mon message initial"
Question: mais pourquoi simplifier le code ? Donne le nous tel quel, on sait jamais, des fois que le problème vienne d'un conflit avec autre chose (ce qui est souvent le cas dans les "choses" faisant intervenir les objets Windows).
Pour ton problème, je trouve que la solution que tu utilises est bizarre. As-tu déjà essayé d'utiliser les propriétés TabStop et TabOrder du TTabSheet ?
A part ça, les fenêtres VCL dans le dll, ça risque de te causer quelques soucis. C'est pas Cirec qui te dira le contraire mais je vais le laisser te répondre: il s'y connait mieux que moi sur le sujet...
Delphi57
Messages postés4Date d'inscriptionjeudi 14 juin 2007StatutMembreDernière intervention18 juin 2007 15 juin 2007 à 13:55
Pourquoi Simplifier ? car les autres éléments sont sans influence et traite d'autre cas d'utilisation de la fenetre ... On peut considérer le code comme ceci :
procedure TFormEditParametersList.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.WndParent := MainFormCallerWindowHandle;
Params.Style:= WS_CHILD + WS_CLIPCHILDREN + WS_BORDER+ WS_CLIPSIBLINGS + WS_TABSTOP ;
end;
Une précision cenpendant, MainFormCallerWindowHandle contient le handle du TabSheet.
DELPHI57
Vous n’avez pas trouvé la réponse que vous recherchez ?
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 15 juin 2007 à 16:31
En effet les fiches dans les DLL's provoquent souvant des erreurs
Je ne m'attarderai pas sur le sujet (il existe des codes ici qui traitent du problème) mais ce qu'il faut retenir dans un premier temps
Si on utilise pas le Style XP (XPMan) il est possible de les utiliser avec quand mêmes quelques petites précautions.
Mais pour ton cas si tu veux changer le parent de la fenêtre que tu viens de créer
je te propose l'utilisation de SetParent de l'unité Windows.
Delphi57
Messages postés4Date d'inscriptionjeudi 14 juin 2007StatutMembreDernière intervention18 juin 2007 18 juin 2007 à 10:23
Merci de ta réponse.
J'ai mis le code que tu m'as indiqué dans le Create de la form de la DLL :
Windows.SetParent(Handle_de_la_fenetre, Handle_du_TabSheet);
Ceci ne change rien....malheureusement !
Sais-tu comment faire pour indiquer au TTabSheet qu'il a un enfant ? Est-ce que la méthode Insert peut fonctionner dans ce cas : TabSheet.insert( Handle_de_la_fenetre as Tcontrol)
Car ce que j'ai observé, c'est que le controlcount du TTabSheet est à zéro....(aprés création de la fenetre évidemment !)
J'ai essayé de faire coté application principale :
tabsheet.InsertControl(tabsheet1.CreateParentedControl(HWnd(Message.WParam)));
Où Message.WParam est le handle de la fenetre de la DLL
Mais encore une fois ceci ne change rien au problème de tabstop.