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

 Delphi Discussion :

Limiter le curseur aux limites d'un TColorDialog sous Win11 64bits et D6


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 421
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 421
    Points : 1 325
    Points
    1 325
    Par défaut Limiter le curseur aux limites d'un TColorDialog sous Win11 64bits et D6
    Bonjour à toutes et à tous,

    J'utilise un TColorDialog et j'aimerai pouvoir lorsqu'il est affiché limiter le curseur sur le bouton Oui ou Annulez.

    Pour ce qui est de la Forme c'est assez simple mais si je l'utilise et que je déplace l'affichage du TColorDialog, il sort des limites et peut passer derrière la Forme.

    Ou forcer ce composant à s'afficher devant la Forme.

    En vous remerciant,

    @+,

    cincap

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Quand tu dis "limiter le curseur", tu voudrais empêcher l'utilisateur de déplacer sa souris ailleurs ?

    Si c'est ça ... euh non, repense ton ergonomie !
    Imagine que soudainement ton utilisateur veut savoir le code Hexa de la couleur du Zinzolin ou Lapis-Lazuli en allant sur Internet, il faut bien qu'il puisse bouger sa souris où il veut !

    TColorDialog c'est un modal non ?
    On ne doit pas pouvoir cliquer dans une autre fenêtre du programme tant qu'un modal est ouvert
    Mais on peut aller dans un autre programme et heureusement

    Me dit pas que tu as fait une méthode pour dé-modaliser les fenêtres (moi je l'ai fait, une fenêtre ouverte sur un second écran n'était pas bloqué même lors d'une modale)


    Si c'est changer le curseur d'apparence, une main à la place, tu dois pouvoir chopper les controles et voir si tu peux changer le curseur dessus
    je n'ai pas regardé si c'était un Dialog Windows ou Delphi
    Si Windows, faut jouer avec les API
    Si Delphi, ça doit être plus facile de le copier-coller et modifier tout ce que tu veux dedans

    Et avec https://www.developpez.net/forums/d2...g-messageboxa/
    Tu as surement des pistes


    PS : Pourquoi tu mets tes sujets dans Débuter, ça fait plus de 10 ans que tu fais de la VCL, tu as un souris forum plus approprié : https://www.developpez.net/forums/f7...omposants-vcl/



    A éviter, rendre une fenêtre insensible à la modal d'un dialog

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    //---------------------------------------------------------------------------
    void __fastcall TFrmMonitoringMoveInZones::NewWindowProc(Messages::TMessage &Message)
    {
      // Traitement normal des autres messages
      FOldWindowProc(Message);
     
      // Interception de l'évènement WM_ENABLE pour l'Anti-Modale si la fenêtre est StayOnTop
      if (FormStyle == fsStayOnTop)
      {
        if (Message.Msg == WM_ENABLE)
        {
          if (Message.WParam == FALSE)
            PostMessage(Handle, CM_FORCEENABLED, 0, 0);
        }
        else
          if (Message.Msg == CM_FORCEENABLED)
            EnableWindow(Handle, TRUE);
      }
    }
    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

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 421
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 421
    Points : 1 325
    Points
    1 325
    Par défaut
    @ ShaiLeTroll, merci de ta réponse,

    PS : Pourquoi tu mets tes sujets dans Débuter, ça fait plus de 10 ans que tu fais de la VCL, tu as un souris forum plus approprié : https://www.developpez.net/forums/f7...omposants-vcl/
    Parce que je me considère toujours comme débutant avec D6.

    En fait j'ai une application qui s'affiche sur mon bureau au premier plan et son menu dans la TrayIcon.

    Avec cette application j'ai la possibilité d'afficher le TColorDialog pour choisir une couleur au centre de l'application.

    Le TColorDialog s'affiche bien devant l'application et non derrière.

    Mais j'ai constaté que si je ne réponds pas "Oui ou Annulez" et que je déplace mon curseur sur le menu qui est dans la TrayIcon, le TColorDialog passe derrière l'application et me bloque car le TColorDialog a toujours le focus.

    D'où mes questions.

    En prévoyant un lien dans le TPopupMenu pour rendre l'application principale en Hide, je peus refermer le TColorDialog.

    Ce détournement fonctionne si le problème se présente mais est peu orthodoxe.

    Sinon si il n'existe pas de solution ce n'est pas grave.

    @+,

    cincap

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Ah oui, un Tray Icon, j'en ai rarement fait d'aussi complet mais je pense qu'il te faudrait désactiver le Popup du Tray durant les Dialogs, je l'avais fait pour ma part, en D6 ou D7, si je le retrouve.

    Sinon, je faisais DEUX applications, le Tray restait minimal avec le Menu appelant une seconde application GUI en ligne de commande
    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

  5. #5
    Membre actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Points : 292
    Points
    292
    Par défaut
    Je pense qu'il est possible de garder ce dialogue en top en changeant le formstyle à fsStayOnTop

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 421
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 421
    Points : 1 325
    Points
    1 325
    Par défaut
    Bonjour à toutes et à tous,

    @ Wheel, merci de ton message :

    Je pense qu'il est possible de garder ce dialogue en top en changeant le formstyle à fsStayOnTop
    Mais ce composant TColorDialog n'a pas la propriété formstyle et il est modal et l'application principale est déjà au premier plan.

    @ ShaiLeTroll, je ne dois pas désactiver ce TPopupMenu sinon quand le problème arrive je reste bloqué mais à force de l'âge, j'ai compris que le TPopupMenu dans la TrayIcon restait toujours avec le focus c'est ce qui m'a permis de faire un lien depuis un item pour rendre l'application en Hide puisque j'avais déjà un lien pour la rendre en Show.

    Dès que l'application est en Hide j'ai forcément à nouveau accès au TColorDialog et soit j'accepte la couleur soit je l'annule.

    Maintenant avec le cadre de restriction du curseur je minimize déjà le problème sauf si je modifie la place du composant TColorDialog de quelque cm, le cadre de sélection est annulé et le problème peut survenir.

    Le problème arrive rarement et l'application fonctionne correctement.

    L'idéal c'est de faire afficher le composant et de pouvoir le fermer avec 2 touches du clavier mais.......

    @+,

    cincap

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    J'avais expliqué ici comment forcer une fenêtre à s'afficher derrière une autre.

    Dans ton cas, Ce sera quelque chose comme ceci (ClassName et titre peut-être à adapter) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    type
      TForm1 = class(TForm)
      private
        procedure WMWindowPosChanging(var Message :TWmWindowPosChanging); message WM_WINDOWPOSCHANGING;
      end;
     
    procedure TForm1.WMWindowPosChanging(var Message: TWmWindowPosChanging);
    var
      Wnd :hWnd;
    begin
      Wnd := FindWindow('#32770', 'Couleurs');
     
      if Wnd <> 0 then
        Message.WindowPos.hwndInsertAfter := Wnd;
    end;

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 421
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 421
    Points : 1 325
    Points
    1 325
    Par défaut
    @ Andnotor, merci pour ta réponse que j'ai gardée pour un autre projet le cas échéant car avec mon application le TColorDialog se place encore derrière l'application.

    Par contre comme j'avais créé dans le TPopuMenu 2 items soit application Show et application Hide, j'utilise le sender de Hide avant d'afficher le TColorDialog et le sender de Show si je clique sur Oui ou Non.

    Résultat lors du choix de la couleur l'application est en Hide ce qui laisse uniquement le dialog accessible.

    Je ferme le topic.

    Merci à tous.

    @+,

    cincap

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Sinon as-tu pensé à ouvrir tes Dialogs via un PostMessage depuis le OnClick du Menu ?

    Voit le PostMessage comme une technique du mise en file d'attente (Queue) ... ne pas confondre avec SendMessage.

    J'ai l'impression que tes enchainements sont compliqués, j'ai retrouve un vieux code justement avec Tray et Menu, lançant une modale, je vois que je peux empiler les modales car la boucle du ShowModal permet d'ouvrir le menu du Tray, une chose que j'évitais un maximum, le Modal ou les Dialogs dans un Tray, tu peux créer une ré-entrance alors qu'en ouvrant une fenêtre SDI normale, tu peux à la place faire un BringToFront dessus
    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
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 421
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 421
    Points : 1 325
    Points
    1 325
    Par défaut
    Bonjour à toutes et à tous,

    @ ShaiLeTroll, merci de ton message.

    En fait l'application est toujours au premier plan avec un Hook sur le bureau pour pouvoir surveiller les cellules d'un calendrier placé sur le bureau par transparence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width, Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
    Et c'est sur l'application que j'active le TColorDialog et non par le menu qui est dans la TrayIcon, à ce stade il se comporte comme une forme modal, je clique sur le bureau le TColorDialog reste en avant plan et c'est quand je me dirige vers l'icône du Tpopup (pas un autre !) qui lui prend le focus et que le TColorDialog se place derrière l'application.

    Je pouvais aussi indiquer l'endroit (dans le Onshow) pour l'affichage en dehors des limites de l'application et le problème ne se posait pas ou comme indiqué j'utilise les propriétés de ces composants (Onclose/Onshow) pour afficher l'application principale ou la cacher dès l'utilisation du TColorDialog.

    Le comportement de ce TColorDialog est propre à cette application particulière ou peut être avec Win11 car je n'avais jamais eu ce problème avant.

    Merci pour tout,

    @+,

    cincap

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Je ferais clairement le Widget du Bureau dans un Exe assez isolé et les menus via un autre programme pour tous ces effets de bord
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Un LIMIT comme en SQL sous BIRT
    Par 0x44-0x43-0x53-0x43 dans le forum BIRT
    Réponses: 2
    Dernier message: 11/06/2010, 16h27
  2. impossible d'utiliser LIMIT 1 dans une sous-requête
    Par Christophe Charron dans le forum Requêtes
    Réponses: 13
    Dernier message: 19/12/2009, 22h42
  3. Limitation à la création des sous-sites
    Par Davyd.B dans le forum SharePoint
    Réponses: 1
    Dernier message: 07/12/2008, 10h05
  4. Réponses: 4
    Dernier message: 29/10/2008, 20h44

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