Problème de Tabstop inefficace...

Delphi57 Messages postés 4 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 18 juin 2007 - 14 juin 2007 à 14:29
Delphi57 Messages postés 4 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 18 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:

procedure TFormEditParametersList.CreateParams(var Params: TCreateParams);
begin
       Params.WndParent := MainFormCallerWindowHandle; 
       Params.Style:= WS_CHILD  + WS_CLIPCHILDREN + WS_BORDER+ WS_CLIPSIBLINGS + WS_TABSTOP ;   
end;

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 !

Merci d'avance,

DELPHI57

6 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
14 juin 2007 à 18:01
Salut,

Essaye comme ça ...
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;

 
@+
Cirec

0
Delphi57 Messages postés 4 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 18 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 ...???

DELPHI57
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 2
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...

A+
Flo
0
Delphi57 Messages postés 4 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 18 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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
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.

    Windows.SetParent(Handle_de_la_fenetre, Handle_du_TabSheet);

 
@+
Cirec

0
Delphi57 Messages postés 4 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 18 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.

Que faire ????

DELPHI57
0