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

Langage Delphi Discussion :

Menu "brique" Maison


Sujet :

Langage Delphi

  1. #1
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    773
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 773
    Points : 500
    Points
    500
    Par défaut Menu "brique" Maison
    Bonjour à tous,

    W7.
    Delphi X2.

    Pour adapter une application à un système tactile, j'ai modifié l'interface graphique en remplaçant un TMenu standard par :
    Un Panel qui possède <= un ScrollBox1 <= autant de boutons dynamiques que d'items du menu.
    Cela ressemble au peu aux briques de W10.

    Donc un (gros) bouton existe pour afficher ce panel, les boutons qu'il contient et ce panel redevient invisible quand on clique sur un bouton ou ailleurs dans la fiche.
    Comme cette fiche possède beaucoup de composants et que je ne voulais pas passer par l'événement "OnClick" de la souris de chaque composant, je suis passé par un application.message qui détecte un appuie sur un bouton de la souris (voir ci-dessous)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Procedure TFThemis.AppMessage(Var Msg: TMsg; Var Handled: Boolean);
    Begin
        If (GetAsyncKeyState(1) And 32768 <> 0) then
        begin
            panelBrique.Visible:=false;
            panelAdmin.Visible:=false;
        end;
    end;
    Mais voici mon problème.
    Tous cela convenait très bien tant que le nombre de bouton n'activait pas les ScrollBars du schrollbox, car quand c'est le cas et quand je souhaite déplacer le ScrollBar pour accèder aux boutons non visible, ben le panel redevient invisible a cause de la procédure ci dessus.

    Donc je souhaiterai savoir si il est possible, et comment faire pour garder le fonctionnement actuel (le détection d'un click souris par un application.message) mais en sachant qui est dessous pour en déterminer le comportement. Sans passer par les événements de tous les composants.

    Merci pour vos idées.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 885
    Points : 11 403
    Points
    11 403
    Billets dans le blog
    6
    Par défaut
    pê suffirait-il de vérifier si la souris se trouve dans la zone ClientWidth du ScrollBox, si ses ScrollBars sont en dehors ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Pourquoi ne pas faire un seul OnClick et l'affecter à l'ensemble de tes panels ? si tu connais le Sender tu peux regarder que ce soit bien un de tes panels.

    Par contre dans la condition le 32768 <> 0 ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 831
    Points : 13 579
    Points
    13 579
    Par défaut
    ControlAtPos.

    Pour tester un bouton appuyé : GetAsyncKeyState(VK_LBUTTON) < 0 (bit de poids fort égale valeur négative) et bien sûr contrôler le type de message. Ici, tout y passe sans distinction.

    Mais à voir s'il ne serait pas possible de passer par les fonctions gestuelles à la place.

    Perso, je trouve qu'il serait aussi plus logique de tester le bouton relâché que pressé.
    Si je devais faire quelque chose comme cela, je me passerais de TButton et passerais simplement par du dessin sur un PaintBox en testant des zones (les "boutons"). Cela permettrait le défilement même si le doigt est sur un bouton (un MouseMove annulant l'appui)

  5. #5
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Sur les Form, tu as un evenement OnDeactivate(), peut etre qu'il existe aussi sur les scrollbox, ce qui te permettrai de savoir quan dle focus n'est plus dans ton scrollbox ou un de ses composants

  6. #6
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    773
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 773
    Points : 500
    Points
    500
    Par défaut
    merci pour vos réponses .

    Mais les ScrollBars sont bien spéciaux me semble t il !!!

    retwas : On souhait était justement de ne pas avoir a affecter les "Onclick de tous les composants, avec ma méthode, qu'importe ou se passe le "Click souris" si le menu (panel comprenant les boutons dynamiques) est visible, je le rend invisible ( de plus j'ai plusieurs fiche qui utilise cette méthode)

    Andnotor : Pourquoi ne pas avoir dessiné sur un canvas? c'est simplement pour conserver le même design que le reste de l'application (donc des bouton TMS avec dégradé...)
    j'ai essayer le ControlAtPos avec le procedure ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm60.AppMessage(var Msg: TMsg; var Handled: Boolean);
    var AControl:TControl;
         APoint:TPoint;
    begin
         if Msg.message =WM_MOUSEMOVE then
         begin
           AControl:=Form60.ControlAtPos(ScreenToClient(Mouse.CursorPos),false,true);
           if AControl<>nil then
              label1.Caption:=label1.Caption+' Nom : '+AControl.Name+' Classe : '+AControl.ClassName;
         end;
    end;
    Cela marche pour beaucoup de control/composant, mais pas pour le ScrollBars il me retoune rien..

    tourlourou :j'ai aussi tenté cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm60.AppMessage(var Msg: TMsg; var Handled: Boolean);
    var  APoint:TPoint;
    begin
        if Msg.message = WM_MOUSEMOVE then  
        begin
             label1.Caption:='x:'+IntToStr(Mouse.CursorPos.x)+' y:'+inttostr(mouse.CursorPos.y);
        end;
    end;
    Qui me retourne la position de la souris sur ma fiche et d'en déterminer qui est sous ma souris. Sauf pour le ScrollBar du ScrollBox. Des que je passe dessus je perd les coordonnées ! J'ai aussi tenté les OnMouseEnter et OnMouseleave qui ne marche pas , car les ScrollBars sont a l’extérieur de la zone du ScrollBox...

    Il faut que j'arrive à commuter un boolean quand ma souris rentre dans la zone du ScrollBar du ScrollBox ! je vais encore chercher ...

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