Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > EDI
EDI Configuration/utilisation de l'EDI
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 08/11/2012, 15h54   #1
Lung
Membre Expert
 
Avatar de Lung
 
Analyste-programmeur
Inscription : mai 2002
Messages : 2 140
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Yonne (Bourgogne)

Informations professionnelles :
Activité : Analyste-programmeur
Secteur : Industrie

Informations forums :
Inscription : mai 2002
Messages : 2 140
Points : 2 357
Points : 2 357
Par défaut [D2010] Problème de clic sur bouton dans une DLL

Depuis que mes DLL ont été migrées de Delphi 6 à Delphi 2010, le clic sur les boutons (TBitBtn) fonctionnent mal. En fait, il faut cliquer deux fois (pas un double-clic).
Le premier clic donne le focus, et le deuxième clic fait réellement le clic sur le bouton (il s'enfonce).

J'ai remarqué que les boutons de la barre d'outils de la fenêtre de prévisualisation de QuickReport avaient désormais le même problème.

Par contre, aucun problème avec un exe normal (seulement dans les DLL).
Ce problème est très génant pour les utilisateurs qui utilise très fréquement certains boutons : ca leur fait perdre du temps (et c'est agaçant).

Quelqu'un aurait l'ombre d'une idée (parce que là, je ne vois pas ce que je peux y faire) ?
__________________
L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.
______________________________________________________________________________________________

Delphi 6#2 Entreprise - Delphi 2010 Architecte - Delphi XE2 Entreprise
Win XP Pro - OpenGL 2.1 - Oracle 11g - Firebird 2.5.0.2
Écrivez dans un français correct !!
Lung est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2012, 17h14   #2
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 195
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Développeur C++\Delphi
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : juillet 2006
Messages : 9 195
Points : 13 245
Points : 13 245
Joue avec MainFormOnTaskBar, au lieu que TApplication soit l'objet de la Barre des Taches, c'est ton MainForm

Est-ce des fenêtres ancrées ?
via Windows.SetParent, j'ai constaté des problèmes de Focus aussi
via TControl.Parent, nettement mieux mais nécessite BPL avec RTL Dynamique en C++Builder ou FastShareMem\Brlndmm.dll en Delphi
via Dock ?

Est-ce des fenêtres NON ancrées ?

Tu peux tenter ceci, la fenêtre ainsi créée aura son propre bouton dans la barre des taches
Code c++ :
1
2
3
4
5
6
//---------------------------------------------------------------------------
void __fastcall T***Form::CreateParams(Controls::TCreateParams &Params)
{
  inherited::CreateParams(Params);
  Params.WndParent = GetDesktopWindow();
}

Tu as l'inverse en affectant un Handle genre HInstance au TApplication.Handle DANS la DLL, j'ai plus l'astuce exacte en tête
__________________
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !

L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2012, 08h34   #3
Lung
Membre Expert
 
Avatar de Lung
 
Analyste-programmeur
Inscription : mai 2002
Messages : 2 140
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Yonne (Bourgogne)

Informations professionnelles :
Activité : Analyste-programmeur
Secteur : Industrie

Informations forums :
Inscription : mai 2002
Messages : 2 140
Points : 2 357
Points : 2 357
Citation:
Envoyé par ShaiLeTroll Voir le message
Joue avec MainFormOnTaskBar, au lieu que TApplication soit l'objet de la Barre des Taches, c'est ton MainForm
Je ne vois pas le rapport avec mon problème.
J'ai essayé quand même, mais ça ne change rien.


Citation:
Envoyé par ShaiLeTroll Voir le message
Est-ce des fenêtres ancrées ?
Je ne comprend pas la question.
Si tu demandes comment mes fenêtres sont affichées, j'en ai une qui est maximisée avec :
Code :
SendMessage(Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);

Citation:
Envoyé par ShaiLeTroll Voir le message
Tu peux tenter ceci, la fenêtre ainsi créée aura son propre bouton dans la barre des taches
Code c++ :
1
2
3
4
5
6
//---------------------------------------------------------------------------
void __fastcall T***Form::CreateParams(Controls::TCreateParams &Params)
{
  inherited::CreateParams(Params);
  Params.WndParent = GetDesktopWindow();
}
J'ai essayé, mais ça ne change rien.
Code :
1
2
3
4
5
procedure TFormColisage.CreateParams(Params: TCreateParams);
begin
   inherited CreateParams(Params);
   Params.WndParent := GetDesktopWindow;
end;

Citation:
Envoyé par ShaiLeTroll Voir le message
Tu as l'inverse en affectant un Handle genre HInstance au TApplication.Handle DANS la DLL, j'ai plus l'astuce exacte en tête
Je ne comprend pas bien non plus.
Au début de mes DLL, je leur fournis le Handle de l'exe appelant, pour qu'elles partagent le même élément dans la barre Windows (c'est plus propre).
Code :
   Application.Handle := HandleApp;
Cà a pas de rapport avec mon problème, si ?
__________________
L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.
______________________________________________________________________________________________

Delphi 6#2 Entreprise - Delphi 2010 Architecte - Delphi XE2 Entreprise
Win XP Pro - OpenGL 2.1 - Oracle 11g - Firebird 2.5.0.2
Écrivez dans un français correct !!
Lung est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2012, 11h51   #4
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 195
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Développeur C++\Delphi
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : juillet 2006
Messages : 9 195
Points : 13 245
Points : 13 245
Citation:
Envoyé par Lung Voir le message
Je ne vois pas le rapport avec mon problème. ?
Cela change la gestion de la prise de Focus par la MainForm, fait une application en D6 et la même en D2010
une MainForm et un form secondaire créée et affiché à la volée, regarde la différence de prise de focus !
D6 : la MainForm passe par dessus les autres fenêtres
D210 : La MainForm reste toujours en dessous

Citation:
Envoyé par Lung Voir le message
J'ai essayé quand même, mais ça ne change rien.
Dommage

Citation:
Envoyé par Lung Voir le message
Je ne comprend pas la question.
Si tu demandes comment mes fenêtres sont affichées, j'en ai une qui est maximisée .
Donc j'en déduiis que tes fenêtres sont affichées par Show ou ShowModal sans ancrage !

Ta fenêtre s'appelle TFormColisage, j'avais créée une TFrmColisage en 2001 lorsque j'étais apprenti le monde est petit


Citation:
Envoyé par Lung Voir le message
Je ne comprend pas bien non plus.
... partagent le même élément dans la barre Windows
Eh bien tu comprends plus que tu ne le crois, as-tu essayé de retirer cette ligne ?
Cela change la gestion de prise de focus des fenêtres, et comme en D2010 la gestion de la barre windows a justement changé (voir MainFormOnTaskBar)

Avec CreateParams, tu peux cacher l'icone de la fenêtre sans jouer avec le Handle

Dans le projet dont je m'occupe, on a beaucoup de fenêtre contenu dans des DLL, l'EXE appel des fonctions qui se chargent de l'instanciation, ShowModal et libération, on a presque exclusivement des BitBtn, pas de problème de Focus
Et pourtant, je ne trouve pas le fameeux Application->Handle = ...Je ne sais pas comment mon responsable a masquer cela
Le plus proche serait la ligne dans le constructeur ancêtre de TOUTES les fenêtres de nos applications :
Code :
DefaultMonitor = dmDesktop;

Seules les fenêtres ancrées avec l'API SetParent lors du passage de BCB2007 à BCBXE2 provoquait un problème de focus, le OnExit d'un TDBEdit par exemple n'était pas provoqué par le clic sur un BitBtn (lui directement dans le Parent) du coup pas de modification du DataLink->DataField ...

J'ai aussi eu un phénomène de prise de focus pénible comme le tien mais avec des TComboBox, il fallait cliquer deux fois pour l'ouvrir
En passant par la propriété Parent impliquant l'échange d'un TWinControl entre EXE et DLL au lieu d'un Handle, le problème était résolu
__________________
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !

L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2012, 13h56   #5
Lung
Membre Expert
 
Avatar de Lung
 
Analyste-programmeur
Inscription : mai 2002
Messages : 2 140
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Yonne (Bourgogne)

Informations professionnelles :
Activité : Analyste-programmeur
Secteur : Industrie

Informations forums :
Inscription : mai 2002
Messages : 2 140
Points : 2 357
Points : 2 357
Citation:
Envoyé par ShaiLeTroll Voir le message
Donc j'en déduiis que tes fenêtres sont affichées par Show ou ShowModal sans ancrage !
Oui, je les affiche avec un ShowModal.
(A part Show ou ShowModal, il existe quoi d'autre ? )

Citation:
Envoyé par ShaiLeTroll Voir le message
Eh bien tu comprends plus que tu ne le crois, as-tu essayé de retirer cette ligne ?
Si tu parles du Application.Handle := HandleApp; situé dans la DLL, j'ai essayé de l'enlever, mais ça ne change rien.

Citation:
Envoyé par ShaiLeTroll Voir le message
Dans le projet dont je m'occupe, on a beaucoup de fenêtre contenu dans des DLL, l'EXE appel des fonctions qui se chargent de l'instanciation, ShowModal et libération, on a presque exclusivement des BitBtn, pas de problème de Focus
J'ai ça aussi : c'est une fonction de ma DLL (appelée par l'exe), qui se charge de créer, afficher (par un ShowModal), et détruire la fenêtre.

Citation:
Envoyé par ShaiLeTroll Voir le message
J'ai aussi eu un phénomène de prise de focus pénible comme le tien mais avec des TComboBox, il fallait cliquer deux fois pour l'ouvrir
En passant par la propriété Parent impliquant l'échange d'un TWinControl entre EXE et DLL au lieu d'un Handle, le problème était résolu
J'ai pas compris : tu passais un TComboBox en paramètre à ta DLL ?
__________________
L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.
______________________________________________________________________________________________

Delphi 6#2 Entreprise - Delphi 2010 Architecte - Delphi XE2 Entreprise
Win XP Pro - OpenGL 2.1 - Oracle 11g - Firebird 2.5.0.2
Écrivez dans un français correct !!
Lung est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2012, 15h14   #6
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 195
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Développeur C++\Delphi
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : juillet 2006
Messages : 9 195
Points : 13 245
Points : 13 245
Citation:
Envoyé par Lung Voir le message
Oui, je les affiche avec un ShowModal.
(A part Show ou ShowModal, il existe quoi d'autre ? )
Show\Hide n'est qu'un raccourci pour l'affectation de Visible à true\false
l'important n'était pas Show ou ShowModal mais le terme "sans ancrage"

Citation:
Envoyé par Lung Voir le message
J'ai pas compris : tu passais un TComboBox en paramètre à ta DLL ?
Non
Suis-je aussi peu clair des mes propos ?

L'échange d'objet entre EXE et DLL a l'air de te choquer, pour les BPL ont été justement conçus pour cela !
Je vais t'expliquer mon propre contexte, mais je previens, cela va te paraître comme osé !

Ma DLL contient plusieurs fenêtres,
Ces fenêtres contiennent diverses contrôles comme TDBEdit, TDBCheckBox, TDBRadioGroup et TComboBox ainsi que des TBitBtn d'ailleurs

J'évoquais un problème de focus similaire au tient, sur les ComboBox pour les déployer (Drop Down), il fallait cliquer dedans puis sur le bouton

Cette fenêtre TForm (la fenêtre contenant la combo)utilisée comme une Frame (d'où le terme fenêtre avec ancrage),
en lui spécifiant un Parent une TForm se comporte comme une Frame, c'est visuellement indétectable.
Cela me permet de "choisir" l'écran adaptée à la situation, c'est dans le cadre d'une gestion de périphérique
Chaque marque\modèle ayant ses particularités, un seul écran dans l'EXE pour configurer par exemples les Caméras, depuis l'exe, on défini les valeurs de base comme un nom, la marque et le modèle
la marque indiquera la Dll associé, le modèle une classe (interface) dans la DLL
chaque modèle a un écran de configuration différent que j'intègre dans la fenêtre de l'Exe comme une Frame

Ma fenêtre est mappée par une interface c++ (équivalent d'une classe abstraite en delphi, interface au sens POO) que la DLL fourni à l'EXE, l'interface expose différentes méthodes, il y a évidemment une séparation IHM\Métier, il y a une interface pour l'écran relié à une interface métier, tous ces objets étant créés par la DLL est utilisée par l'EXE
En plus, j'utilise aussi des DelphiInterface, le GUID, le Support en parallèle des pseudo-interface C++ mais je m'écarte !

Ce bug de focus n'apparaissait qu'avec unz TForm (la fenêtre contenant la combo) ancrée par l'API SetParent encapsulé par ma méthode SetParentHandle en lui passant un Handle d'un TScrollBox
Echanger un Handle me semblait moins violent que d'échanger un TWinControl
Mais en XE2, le comportement de l'ancrage était moins bon par Windows.SetParent(Handle) que par TControl.SetParent(TWinControl).


J'ai donc renommé SetParentHandle en SetParentVCL avec comme paramètre un TWinControl (souvent un ScrollBox ou un Panel), ce control est affecté à la propriété Parent de ma fenêtre, cela l'intègre comme une Frame (nécessite un BorderStyle à bsNone)

Eh oui, j'échange un TWinControl entre EXE et DLL ce qui est tout à fait possible avec les BPL d'execution et la RTL Dynamique (ShareMem pour les Delphiste)
A savoir que l'affectation dans la DLL de la propriété Parent de la TForm avec ce TWinControl modifie la propriété Controls[] de ce dernier, donc allocation mémoire et tout le tralala mais comme ce code est contenu dans les BPL, il n'y a pas de problème de mémoire

Pour les fenêtres non ancrées, je n'ai jamais vu ce problème de focus, désolé, je suis à cours d'idée !
__________________
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !

L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2012, 08h17   #7
Lung
Membre Expert
 
Avatar de Lung
 
Analyste-programmeur
Inscription : mai 2002
Messages : 2 140
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Yonne (Bourgogne)

Informations professionnelles :
Activité : Analyste-programmeur
Secteur : Industrie

Informations forums :
Inscription : mai 2002
Messages : 2 140
Points : 2 357
Points : 2 357
Je comprend mieux.

Citation:
Envoyé par ShaiLeTroll Voir le message
Cette fenêtre TForm (la fenêtre contenant la combo)utilisée comme une Frame (d'où le terme fenêtre avec ancrage),
en lui spécifiant un Parent une TForm se comporte comme une Frame, c'est visuellement indétectable.
J'ai déjà fait ça aussi.

Citation:
Envoyé par ShaiLeTroll Voir le message
Mais en XE2, le comportement de l'ancrage était moins bon par Windows.SetParent(Handle) que par TControl.SetParent(TWinControl).
Bon à savoir.

Citation:
Envoyé par ShaiLeTroll Voir le message
Pour les fenêtres non ancrées, je n'ai jamais vu ce problème de focus, désolé, je suis à cours d'idée !
Je vais envoyer un message à Embarcadero (un de plus). On verra ce que ça donnera ...
__________________
L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.
______________________________________________________________________________________________

Delphi 6#2 Entreprise - Delphi 2010 Architecte - Delphi XE2 Entreprise
Win XP Pro - OpenGL 2.1 - Oracle 11g - Firebird 2.5.0.2
Écrivez dans un français correct !!
Lung est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h13.


 
 
 
 
Partenaires

Hébergement Web