IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Le contrôle '' n'a pas de fenêtre parente ?


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre très actif
    Inscrit en
    Décembre 2007
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 258
    Par défaut Le contrôle '' n'a pas de fenêtre parente ?
    Bonjour;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if cond then
    begin
    LoadKeyboardLayout('0000040c', KLF_ACTIVATE);
    Application.BiDiKeyboard:= '0000040c';
    end;
    l’exécution de ce code déclenche le message d'erreur: Le contrôle '' n'a pas de fenêtre parente. mais pas tout le temps et pas dans tout les PC
    par exemple, ce message ne se déclenche pas dans un PC avec Windows 7 professionnel SP1 32 Bits et se déclenche dans PC avec Windows 10 64 Bits

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 569
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Il est clair dans la doc que le comportement de cette API Windows est différent entre les versions < 8 et >=8.
    Il faudrait tester la valeur retournée(un Handle) (null en cas d'erreur) avant de faire quoique ce soit d'autre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If LoadKeyboardLayout('0000040c', KLF_ACTIVATE)=Null 
      then 
         // utiliser GetLasterror
      else begin
         // traitement 
      end;
    De plus, il est nécessaire que le processus actuel soit dans une fenêtre avec le focus clavier.

  3. #3
    Membre très actif
    Inscrit en
    Décembre 2007
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 258
    Par défaut
    Merci Mr. SergioMaster

    le message d'erreur s'affiche toujours

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 569
    Billets dans le blog
    65
    Par défaut
    Je n'ai pas de clavier pour faire un test et votre propre code est court.
    • Est-ce que ce code s'exécute produit dans une fenêtre contenant un contrôle d'édition ?
    • avez-vous vérifié la valeur obtenue par la fonction ?

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 910
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Qui a le focus clavier au moment de l'appel ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    Avez-vous songer à utiliser le déboggueur pour voir où se produit l'exception en utilisant le DCU de dégogage ?

    Est-ce un gestionnaire d'évènement qui surviendra dans un message qui serait émis par LoadKeyboardLayout, peu probable
    Est-ce à l'affection dans Application.BiDiKeyboard, Application n'a pas de Parent, la MainForm n'a pas de Parent, faudrait savoir qu'elle TWinControl SANS nom qui pose problème, encore une fois, un un gestionnaire d'évènement
    D'ailleurs, il faudrait pas le faire avant le OnActivate de la MainForm (évidemment gérer si c'est le premier OnActivate différemment des suivants, une substitution de gestionnaire d'évènement est l'idéale)

    Saviez-vous que Application.BiDiKeyboard invoque LoadKeyBoardLayout(..., 0) ?
    Est-il pertinent de l'invoquer manuellement, même cela pourrait être contre-productif car vous faussez le clavier courant déjà sélectionné.

    Avez-vous songer à utiliser séparément LoadKeyBoardLayout en récupérant le HKL (THandle) puis ActivateKeyboardLayout ce qui ce traduit par affecter Application.BiDiKeyboard puis invoquer Application.ApplyBiDiKeyboardLayout, vous ne devriez pas utiliser l'API, mais seulement Application
    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

  7. #7
    Membre très actif
    Inscrit en
    Décembre 2007
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 258
    Par défaut
    j’exécute le code dans OnEnter et OnExit d'un TEdit
    pas d'erreur dans mon PC ou je développe l'application mais dans un autre PC win 10 64 bits

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    Avant Windows 8 : cette fonction affecte uniquement la disposition du processus ou du thread actuel.

    À compter de Windows 8 : cette fonction affecte la disposition de l’ensemble du système.
    Jusqu'à là, aucune surprise que selon la version de Windows qu'il y ait un comportement différent.
    Au moins avec un TEdit, on suppose qu'il y a le focus actif ...

    Mais on ignore quel moment est l'exception
    Sur LoadKeyBoardLayout(KLF_ACTIVATE) pouvant émettre un Message windows et l'exception serait dans la WndProc
    Sur BiDiKeyboard qui vu le code est simplement LoadKeyBoardLayout(0), qui a moins d'effet sans le ApplyBiDiKeyboardLayout (soit ActivateKeyboardLayout)

    Faut que vous installiez un Delphi sur un Win10 et que vous fassiez le test, je ne vois pas comment vous pourriez vous en sortir autrement.

    En attendant, avez-vous tenter un programme minimale, Form1, Edit1 et BiDiKeyboard
    Tester sur Win10,
    si bug, c'est dans les trèfonds de la VCL, il faudrait utiliser une version de VCL.Forms modifié (pas l'origine, on peut ajouter une unité avec le même nom dans le projet qui permet de remplacer l'original et faire un peu de débogage)
    si pas de bug, c'est dans votre code qu'il y a une incompatibilité.


    Avez-vous réfléchi sur la pertinence de BiDiKeyboard+ApplyBiDiKeyboardLayout vs LoadKeyBoardLayout(KLF_ACTIVATE) sachant que c'est des opérations identiques et qui ne devraient pas être utilisé simultanément, soit 100% API soit 100% VCL.
    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

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    Soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var
      KBHandle: HKL;
    begin
      KBHandle := LoadKeyBoardLayout('0000040c', 0);
      if Assigned(KBHandle) then
      begin
        if not Assigned(ActivateKeyboardLayout(KBHandle, 0)) then
          RaiseLastOSError();
      end
      else
         RaiseLastOSError();
    end;
    Quand on utilise les API, faut tout de même faire l'effort d'aller jusqu'au bout, de comprendre ce que l'on fait en lisant la documentation, sinon, on passe par le VCL comme le ci-dessous :

    Soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.BiDiKeyboard:= '0000040c';
    Application.ApplyBiDiKeyboardLayout();
    PAS LES DEUX !!!



    Et dans les deux approches, je surveillerais les OnMessage voir si après l'utilisation de ce code, il n'y aurait pas un message Windows qui se propagent comme WM_INPUTLANGCHANGEREQUEST ou WM_INPUTLANGCHANGE
    Eventuellement redéfinir la WndProc toujours dans la logique de traquer les exceptions
    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

  10. #10
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    Evidemment, je testerais cela dans un bouton OnClick ... car OnEnter et OnExit donc justement des gestionnaires d'évènement de changement de Focus, n'est-ce pas le pire moment pour une fonction qui justement est impacté par le focus clavier
    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

  11. #11
    Membre très actif
    Inscrit en
    Décembre 2007
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 258
    Par défaut
    Bonsoir Mr. ShaiLeTroll e merci pour vos réponses, j'ai essayer votre code et toujours le même problème.
    j'utilise DevExpress 19.1.2 dans l'application et je pense que c'est lui qui fait le problème car une autre application exécute le même code et ne déclenche pas l'erreur

  12. #12
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    DevExpress ... D'où la proposition " un programme minimale " pour écarter tout parasite.

    Faut donc maintenant vérifier les DCU de Débogage pour mieux cibler l'erreur, probablement l'infame WndProc que DevExpress met en place dès le moindre composant posé sur form, et voir sur leur forum pour avoir un correctif.
    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

  13. #13
    Membre très actif
    Inscrit en
    Décembre 2007
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 258
    Par défaut
    Bonsoir;
    j'ai exécute le programme pas à pas aprés l'évenement OnExit du TEdit et l'erreur se déclenche dans l'unité Vcl.Forms dans la procedure TApplication.Run a ce niveau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    repeat
         try
            HandleMessage;
         except
            HandleException(Self);
        end;
    until Terminated;

  14. #14
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    Oui, c'est la boucle de message comme évoqué plus haut, maintenant, il faut :
    1- Récupérer le numéro de message et en déduire le nom WM_....
    2- Déboguer plus en profondeur pour savoir quelle WndProc provoque l'erreur, surement celle qu'installe DevExpress
    3- Remonter l'anomalie à DevExpress si c'est bien dans leur code que cela provoque l'erreur
    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

Discussions similaires

  1. Réponses: 11
    Dernier message: 29/09/2019, 14h54
  2. Le contrôle n'a pas de fenêtre parente
    Par bossattac dans le forum Composants VCL
    Réponses: 1
    Dernier message: 06/06/2014, 17h21
  3. Contrôle de la fenêtre parent
    Par sara21 dans le forum Langage
    Réponses: 3
    Dernier message: 04/10/2008, 14h48
  4. Valider un form et lancer le résultat ds la fenêtre parent
    Par [DreaMs] dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 23/08/2005, 17h01
  5. Fenêtre parent
    Par adelavarenne dans le forum Composants VCL
    Réponses: 9
    Dernier message: 20/10/2003, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo