2017-06-13 6 views
-2

J'ai un formulaire avec une barre de défilement horizontale, mais je veux supprimer la barre de défilement en utilisant le mouvement de la souris (horizaontally) sur le formulaire comme un moyen de défilement. Je veux qu'avec le mouvement de la souris ma forme défile mais sans décalage et doucement et quand j'atteins la fin elle arrête de défiler. Donc, si quelqu'un pouvait m'aider, ce serait une aide énorme. Merci d'avance.delphi - Faire défiler horizontalement sur le mouvement de la souris en douceur

+0

La barre de défilement est-elle explicitement utilisée ou fait partie d'un autre contrôle? Pouvez-vous donner un petit exemple montrant ce que vous faites actuellement? – Dsm

+0

la barre de défilement sont les parties du formulaire lui-même, ma forme a des éléments supplémentaires qui ne peuvent être vus sans défilement – bluedragon

+0

Il est assez facile à faire * sauf * pour cacher les barres de défilement. Es-tu mort sur ça? – Dsm

Répondre

0

Cela fait bien l'écran se déplaçant bien sur 10.1 Berlin tant que vous ne cachez pas les barres de défilement. La documentation suggère que cela devrait fonctionner si vous masquez les barres de défilement, donc peut-être sur une version antérieure de Delphi.

OnMouseDown, OnMouseMove et OnMouseUp sont utilisés, ainsi que 3 variables locales.

unit Unit10; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.StrUtils, Vcl.Mask; 

type 
    TForm10 = class(TForm) 
    Edit1: TEdit; 
    Edit2: TEdit; 
    Button1: TButton; 
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton; 
     Shift: TShiftState; X, Y: Integer); 
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton; 
     Shift: TShiftState; X, Y: Integer); 
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
    private 
    { Private declarations } 
    fIsDown : boolean; 
    fX, fY : integer; 
    public 
    { Public declarations } 
    end; 

var 
    Form10: TForm10; 

implementation 

{$R *.dfm} 

procedure TForm10.FormMouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    if Shift = [ssLeft] then // if ONLY left down 
    begin 
    // Save co-ordinates 
    fIsDown := TRUE; 
    fX := X; 
    fY := Y; 
    end; 
end; 

procedure TForm10.FormMouseMove(Sender: TObject; Shift: TShiftState; X, 
    Y: Integer); 
begin 
    if Shift = [ssLeft] then // if ONLY left down 
    begin 
    if fIsDown then 
    begin 
     HorzScrollBar.Position := HorzScrollBar.Position + fX - X; 
     VertScrollBar.Position := VertScrollBar.Position + fY - Y; 
    end 
    else 
    begin 
     fIsDown := TRUE; 
    end; 
    fX := X; 
    fY := Y; 
    end 
    else 
    begin 
    fIsDown := FALSE; 
    end; 
end; 

procedure TForm10.FormMouseUp(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    fIsDown := FALSE; // regardless of shift state! 
end; 

end. 

S'il vous plaît laissez-nous savoir si cacher les barres de défilement fonctionne sur XE8, car cela serait utile pour les futurs lecteurs.

+0

Les barres de défilement peuvent déplacer le contenu tout en déplaçant le curseur de défilement si vous définissez la propriété Tracking' sur True sans code supplémentaire. Ce code permet de faire défiler le contenu du formulaire lorsque vous faites glisser une zone cliente non focalisable. Si c'est ce que l'OP veut, peut-être qu'il est temps de clarifier un peu la question. – Victoria

+0

Pour quelque chose que vous pouvez appeler vraiment _ "défilement visuel lisse" _ Je suivrais [ce post] (https://stackoverflow.com/a/9503002/8041231). – Victoria

+0

@Victoria. Cela donne vraiment * un "bon défilement visuel" * et n'est pas différent de la première des 3 solutions de votre lien (TForm et TScrollingWindow "ont le même ancêtre responsable du défilement.) Les 2ème et 3ème formes sont de bonnes alternatives mais nécessitent du code supplémentaire. assurez-vous que vous ne voyagez pas trop loin .. L'utilisation d'une minuterie ne vous apporte aucune amélioration de la réactivité – Dsm