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
Répondre
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.
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
Pour quelque chose que vous pouvez appeler vraiment _ "défilement visuel lisse" _ Je suivrais [ce post] (https://stackoverflow.com/a/9503002/8041231). – Victoria
@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
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
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
Il est assez facile à faire * sauf * pour cacher les barres de défilement. Es-tu mort sur ça? – Dsm