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

Composants FMX Delphi Discussion :

Comment synchroniser deux ScrollBox


Sujet :

Composants FMX Delphi

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Par défaut Comment synchroniser deux ScrollBox
    Bonjour à tous,

    une petite question surement bête mais bon :

    je souhaite synchroniser deux ScrollBox dans leurs positions horizontales, elles ont toutes les deux la même taille horizontale.

    soit avec la barre de défilement de la première ScrollBox soit avec un composant TscrollBar commune au deux.

    merci pour votre aide.

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 657
    Billets dans le blog
    65
    Par défaut
    Il faudrait que je teste, mais je me lancerai dans un truc du genre
    un prototypebindsource avec un record et une valeur (integer ou single)
    puis une liaison entre les srollbox.horizontal.position
    enfin si elles sont liables

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Par défaut
    merci pour ton retour,

    faudrait utiliser plutôt ViewportPosition ? non ?

    je teste là sans succès.

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 657
    Billets dans le blog
    65
    Par défaut
    Au temps pour moi, pas de liaison possible
    Reste effectivement l'évènement ViewportPositionChange

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Par défaut
    je tente ça sans succès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TFormMain.ScrollBox1HScrollChange(Sender: TObject);
    begin
         ScrollBox12.ScrollBy(ScrollBox1.ViewportPosition.X,0);
    end;

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 657
    Billets dans le blog
    65
    Par défaut
    Il faut certainement encadré ça avec un ScrollBox.BeginUpdate/EndUpdate

    j'ai essayé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    HorzScrollbox2.BeginUpdate;
    HorzScrollbox2.ScrollBy(NewViewportPosition.X-OldViewportPosition.x,0);
    HorzScrollbox2.EndUpdate;
    mais j'ai un drole d'effet
    une erreur de comprehension, en modifiant le calcul
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.HorzScrollBox1ViewportPositionChange(Sender: TObject;
      const OldViewportPosition, NewViewportPosition: TPointF;
      const ContentSizeChanged: Boolean);
    begin
    //HorzScrollbox2.BeginUpdate;
    HorzScrollbox2.ScrollBy(OldViewportPosition.x-NewViewportPosition.X,0);
    // HorzScrollbox2.EndUpdate;
    end;
    c'est synchro

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Par défaut
    Génial c'était bien cela qu'il fallait faire.

    Merci et très bon we !

  8. #8
    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
    On est d'accord que vous êtes sur FMX là, hein ?

    Parce qu'en VCL, pas de viewport accessible sur le TScrollBox ni l'événement et l'utilisation de ScrollBy ne passe pas.
    (j'ai dû jouer avec la position sur la scrollbar à la place, bidouille douteuse mais ça passe)

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 657
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par pprem Voir le message
    On est d'accord que vous êtes sur FMX là, hein ?
    On est bien dans le forum FMX donc, OUI
    Cela dit, ça a été fait presque en direct et même avec en tâche de fond, ta présentation Twitch. D'où mes tâtonnements.
    Je n'ai toujours pas saisi pourquoi seul ScrollBy fonctionnait, j'ai cherché sans succés à initialiser une position au démarrage car durant mon design (succint) ma deuxième scrollbox n'est pas en position 0

    Nom : Capture.PNG
Affichages : 134
Taille : 4,9 Ko

    d'ailleurs, je ne sais même pas comment procéder au design si quelqu'un le sait et passe ici ?
    au temps pour moi, après quelques contrôles c'était la position.x du rectangle qui n'était pas indentique à celle du dessus. J'avais pourtant fait un simple copier coller de la Scrollbox1, une manipulation malheureuse de la souris peut-être

  10. #10
    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
    Citation Envoyé par SergioMaster Voir le message
    On est bien dans le forum FMX donc, OUI
    oups, j'avais même pas vu le détail dans le fil d'ariane, comme quoi les lunettes ne règlent rien aux problèmes que j'ai avec le design trop chargé des forums

    ceci dit, il y a clairement un truc chelou avec Scrollby() qui mérite investigations et/ou adaptation de la documentation qui le concerne

  11. #11
    Membre émérite
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Par défaut
    @pprem:
    Citation Envoyé par pprem Voir le message
    On est d'accord que vous êtes sur FMX là, hein ?

    Parce qu'en VCL, pas de viewport accessible sur le TScrollBox ni l'événement et l'utilisation de ScrollBy ne passe pas.
    (j'ai dû jouer avec la position sur la scrollbar à la place, bidouille douteuse mais ça passe)
    Bonjour,

    j'ai une autre solution à proposer en VCL qui est simple à mettre en œuvre
    et qui permet une synchro circulaire.

    USynchroScrollBox.pas :
    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
    unit USynchroScrollBox;
     
    interface
    uses
      Messages, Forms;
     
    type
     
      TcrSynchronizedScrollBox = class(Forms.TScrollBox)
      private
        FSynchro: TcrSynchronizedScrollBox;
        procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
        procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
      public
        { Déclarations publiques }
        property Synchro: TcrSynchronizedScrollBox read FSynchro write FSynchro;
      end;
     
     
    implementation
     
     
    { TcrSynchronizedScrollBox }
     
    procedure TcrSynchronizedScrollBox.WMHScroll(var Message: TWMHScroll);
    begin
      if Assigned(FSynchro) and (Message.Result <> 1) then
      begin
        Message.Result := 1;               // pour éviter un bouclage sans fin lors de synchro circulaire.
        FSynchro.WMHScroll(Message);      
      end;
        inherited;
    end;
     
    procedure TcrSynchronizedScrollBox.WMVScroll(var Message: TWMVScroll);
    begin
      if Assigned(FSynchro) and (Message.Result <> 1) then
      begin
        Message.Result := 1;
        FSynchro.WMVScroll(Message);
      end;
        inherited;
    end;
     
    end.
    USyncBoxMain.pas :
    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
    unit USyncBoxMain;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, USynchroScrollBox;
     
    type
      // pour éviter d'installer le composant
      TScrollBox = class(USynchroScrollBox.TcrSynchronizedScrollBox);
     
      TSyncBoxMain = class(TForm)
        Panel1: TPanel;
        Panel2: TPanel;
        Image1: TImage;
        Image2: TImage;
        ScrollBox1: TScrollBox;
        ScrollBox2: TScrollBox;
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      SyncBoxMain: TSyncBoxMain;
     
    implementation
     
    {$R *.dfm}
     
    procedure TSyncBoxMain.FormCreate(Sender: TObject);
    var
      aBmp: TBitmap;
    begin
      aBmp := TBitmap.Create;
      try
        aBmp.LoadFromFile('votre image ici (assez grande pour pouvoir scroller)'); 
        Image1.Picture.Assign(aBmp);
        Image2.Picture.Assign(aBmp);
      finally
        aBmp.Free;
      end;
     
      // Synchronisation circulaire
      ScrollBox1.Synchro := ScrollBox2;
      ScrollBox2.Synchro := ScrollBox1;
    end;
     
    end.
    et le dfm :
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    object SyncBoxMain: TSyncBoxMain
      Left = 204
      Top = 131
      BorderStyle = bsDialog
      Caption = 'Synchronisation circulaire de 2 ScrollBox'
      ClientHeight = 327
      ClientWidth = 654
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object Panel1: TPanel
        Left = 0
        Top = 0
        Width = 327
        Height = 327
        Align = alLeft
        Caption = 'Panel1'
        TabOrder = 0
        object ScrollBox1: TScrollBox
          Left = 1
          Top = 1
          Width = 325
          Height = 325
          HorzScrollBar.Tracking = True
          VertScrollBar.Tracking = True
          Align = alClient
          TabOrder = 0
          object Image1: TImage
            Left = 0
            Top = -68
            Width = 105
            Height = 105
            AutoSize = True
            Proportional = True
          end
        end
      end
      object Panel2: TPanel
        Left = 327
        Top = 0
        Width = 327
        Height = 327
        Align = alClient
        Caption = 'Panel2'
        TabOrder = 1
        object ScrollBox2: TScrollBox
          Left = 1
          Top = 1
          Width = 325
          Height = 325
          HorzScrollBar.Tracking = True
          VertScrollBar.Tracking = True
          Align = alClient
          TabOrder = 0
          object Image2: TImage
            Left = 0
            Top = -68
            Width = 105
            Height = 105
            AutoSize = True
            Proportional = True
          end
        end
      end
    end
    Cordialement,

    @+

  12. #12
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 657
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par pprem Voir le message
    il y a clairement un truc chelou avec Scrollby() qui mérite investigations et/ou adaptation de la documentation qui le concerne
    Il est certain que la documentation pêche

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

Discussions similaires

  1. Comment synchroniser deux bases access?
    Par gilles_906 dans le forum VB.NET
    Réponses: 0
    Dernier message: 02/11/2010, 23h05
  2. UI Sortable. Comment synchroniser deux listes ?
    Par quent. dans le forum jQuery
    Réponses: 3
    Dernier message: 28/03/2010, 00h03
  3. UI Datepicker. Comment synchroniser deux calendriers ?
    Par php_de_travers dans le forum jQuery
    Réponses: 2
    Dernier message: 17/02/2010, 09h08
  4. synchroniser deux scrollbox
    Par micprog dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/08/2007, 20h51
  5. Comment synchroniser deux bases de données
    Par apoingsfermes dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 15/11/2006, 22h41

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