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 :

Utiliser un TVertScrollBox dans un TVertScrollBox


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Février 2017
    Messages : 43
    Par défaut Utiliser un TVertScrollBox dans un TVertScrollBox
    Bonjour ou bonsoir à tous ! Je rencontre un souci assez contre intuitif.
    Ce que je voudrais faire c'est que lorsque je scroll dans un TVertScrollBox, une fois à la fin du scroll, que le deuxième TVertScrollBox prenne le relais et continue de scroller (dans un scénario où les TVertScrollBox sont imbriqué) un peu comme ce qui existe sur le forum lorsqu'on lit du code dans une reponse.

  2. #2
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 543
    Billets dans le blog
    10
    Par défaut
    Je pense qu'il faut changer de parent/enfant. Donc un seul ScrollBox et deux contenus différents. Un petit exemple est possible si tu nous dis ce que contient le scrollBox

  3. #3
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Pas certain que ce soit une bonne idée en terme d'ergonomie (puis j'ai repensé aux listes qui fonctionnent comme ça), mais rien ne t'empêche techniquement de le faire. Il faut juste que le TVertScrollBox soit dans un élément à la taille définie pour qu'il puisse être contenu proprement dans un autre.

    Par contre que l'un prenne le pas sur l'autre une fois le défilement terminé, je crois voir ce que tu veux, mais un cas concret ou un dessin d'interface sera plus sûr.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 940
    Par défaut
    Si c'est en VCL, tu peux surcharger TScrollBox et intercepter le message WM_VSCROLL. Lorsque la boîte de défilement est en butée, tu remontes le message au parent scroll-able le plus proche.

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    type
      TScrollBox = class(Vcl.Forms.TScrollBox)
      protected
        procedure WMVScroll(var Msg :TWMVScroll); message WM_VSCROLL;
      end;
     
    procedure TScrollBox.WMVScroll(var Msg: TWMVScroll);
    var
      P :TWinControl;
     
    begin
      if ((Msg.ScrollCode = SB_LINEUP)   and (VertScrollBar.Position = 0)) or
         ((Msg.ScrollCode = SB_LINEDOWN) and (VertScrollBar.Position = VertScrollBar.Range -ClientHeight)) then
      begin
        // Cherche le parent scroll-able.
        // Pas forcément le parent direct si par exemple ce composant est posé sur un TPanel.
        P := Parent;
     
        while Assigned(P) do
          if GetWindowLong(P.Handle, GWL_STYLE) and WS_VSCROLL <> 0 then
          begin
            P.Dispatch(Msg);
            Break;
          end
          else P := P.Parent;
      end;
     
      inherited;
    end;
    Ca fonctionne pour les boîtes de défilement mais également pour la fiche si elle est en AutoScroll.

  5. #5
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    ah ! je viens de comprendre la question ^^

    en fait le soucis est sur la gestion de MouseWheel, et la bonne blague c'est que le comportement de celle-ci dépend de la version de Windows...et oui !

    jusque je ne sais plus qu'elle version le message passait d'abord par le parent, et du coup les enfants ne voyaient par forcément le message, puis Microsoft a changé la logique pour permettre de scroller le composant sous la souris, il reçoit donc le message en premier (alors c'est ça ou l'inverse je ne sais plus ^^) attends voir que je regarde ce que j'ai fait à ce sujet...

    voici des portions de codes que j'ai mis dans un projet pour gérer ce merdier...notamment si tu places une ComboBox ou un DateTimePicker dans une ScrollBox tu as des surprises, car une fois la fenêtre popup affichée, elle ne suis pas son parent quand tu scrolles ! du coup je force la gestion de la mousewheel par ces composants quand ils sont DroppedDown

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    type
      TOpenControl = class(TControl)
        // accès à DoMouseWheel qui est "protected"
      end;
     
     
    function TScrollBox.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
      MousePos: TPoint): Boolean;
    begin
    { ATTENTION !
       Sous Windows 7 c'est le TV qui a le focus qui capte le MouseWheel
       sous Windows 10 c'est le composant sous la souris qui reçoit le message
       cela donne des différences de comportement
       la version du code actuel est testée sous W10 uniquement
    }
      Result := inherited; // on laisse une chance aux enfants de gérer l'évènement
      if Result = False then
      begin
        // W10: le message est envoyé au TV sous la souris et remonte ici, il ne faut pas l'intercepter !
        if FindVCLWindow(MousePos) is TBaseVirtualTree then
        begin
          Exit(False); // on ne le gère pas nous même
        end;
     
        // Windows 10 répond False sur une combo quand la souris est en dehors du component
        if (Screen.ActiveControl <> nil) and IsChildOf(Self, Screen.ActiveControl) then
        begin
          Result := TOpenControl(Screen.ActiveControl).DoMouseWheel(Shift, WheelDelta, MousePos);
          if Result then
            Exit;
        end;
     
        if WheelDelta > 0 then
          Perform(WM_VSCROLL, 0, 0)
        else
          Perform(WM_VSCROLL, 1, 0);
        Result := True;
      end;
    end;
     
    // ...
     
    function TComboBox.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
      MousePos: TPoint): Boolean;
    begin
      Result := inherited or DroppedDown; // évite un détachement de la popup dans un TScrollBox
    end;
     
    // ...
    function TDateTimePicker.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
      MousePos: TPoint): Boolean;
    begin
      Result := inherited or DroppedDown;
    end;
    après c'est aussi une question de choix : faut-il que le mousewheel fasse réagir le composants sous la souris ou le conteneur de celui-ci.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Février 2017
    Messages : 43
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    voici des portions de codes que j'ai mis dans un projet pour gérer ce merdier.
    Je travail avec FMX pour une application Windows et Android, et ce code n'est pas interpreté sur Android parce que l'evènement MouseWheel n'est pas appélé et la fonction FindVCLWindow je crois est spécifique à VLC

    Citation Envoyé par pprem Voir le message
    Par contre que l'un prenne le pas sur l'autre une fois le défilement terminé, je crois voir ce que tu veux, mais un cas concret ou un dessin d'interface sera plus sûr.
    Alors pour donner une idée concrète, je dirait, on à un affichage (scrollable) avec nom, prénom et un autre petit affichage compétance scrollable aussi contenant les compétances d'un utilisateur et en bas d'autres éléments. Petit exemple :
    Nom : exempleScroll.PNG
Affichages : 706
Taille : 7,9 Ko

Discussions similaires

  1. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  2. Utilisation fonction définie dans un .Dll
    Par jeab. dans le forum Windows
    Réponses: 5
    Dernier message: 23/03/2004, 16h23
  3. Réponses: 3
    Dernier message: 11/03/2004, 10h58
  4. impossible d'utiliser ma fonction dans un insert
    Par caramel dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/04/2003, 15h04
  5. Utilisation de Pointeurs dans API windows
    Par Drooxy dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 13/03/2003, 22h39

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