Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface delphi-鼠标移动平稳时水平滚动_User Interface_Delphi_Scroll_Scrollbar_Freepascal - Fatal编程技术网

User interface delphi-鼠标移动平稳时水平滚动

User interface delphi-鼠标移动平稳时水平滚动,user-interface,delphi,scroll,scrollbar,freepascal,User Interface,Delphi,Scroll,Scrollbar,Freepascal,我有一个带有水平滚动条的窗体,但我想通过在窗体上使用鼠标移动(水平)来删除滚动条,作为滚动的一种方式。 我希望随着鼠标的移动,我的表单将滚动,但没有延迟,平稳,当我到达终点时,它停止滚动。 所以如果有人能帮助我,那将是一个巨大的帮助。 提前感谢。在10.1版柏林版上,只要不隐藏滚动条,屏幕就会移动得很好。文档建议如果隐藏滚动条,它应该可以工作,所以在早期版本的Delphi上可能可以 使用OnMouseDown、OnMouseMove和OnMouseUp以及3个局部变量 unit Unit10;

我有一个带有水平滚动条的窗体,但我想通过在窗体上使用鼠标移动(水平)来删除滚动条,作为滚动的一种方式。 我希望随着鼠标的移动,我的表单将滚动,但没有延迟,平稳,当我到达终点时,它停止滚动。 所以如果有人能帮助我,那将是一个巨大的帮助。
提前感谢。

在10.1版柏林版上,只要不隐藏滚动条,屏幕就会移动得很好。文档建议如果隐藏滚动条,它应该可以工作,所以在早期版本的Delphi上可能可以

使用OnMouseDown、OnMouseMove和OnMouseUp以及3个局部变量

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.

请告诉我们隐藏滚动条在XE8上是否有效,因为这对将来的读者很有用。

滚动条是显式使用的,还是其他控件的一部分?你能举一个小例子来说明你现在做什么吗?滚动条是表单本身的一部分,我的表单有一些额外的元素,没有滚动就看不见。除了隐藏滚动条,这很容易做到。你死定了吗?我可以通过Tscrollbar隐藏起来。可悲的是,这不起作用。是的,您可以隐藏滚动条,但不管文档怎么说,这会完全停止滚动条的工作,从而使以编程方式移动滚动条的简单解决方案无法运行。文档中说这应该是可行的,但在10.1版本上肯定不行。它可能会出现在早期版本上。如果您想尝试,我将发布。如果您将
Tracking
属性设置为True而不使用任何额外代码,则滚动条可以在拖动滚动拇指的同时移动内容。当拖动不可聚焦的客户端区域时,此代码将滚动表单内容。如果这是OP想要的,也许是时候澄清一下这个问题了。对于一些你可以称之为“视觉平滑滚动”的东西,我会跟随。@Victoria。这提供了真正“视觉上良好的滚动”,与链接中的3个解决方案(TForm和TScrollingWindow)中的第一个没有什么不同"有相同的祖先负责滚动。第二和第三个表单是不错的选择,但需要额外的代码,以确保您不会走得太远。使用计时器并不能提高您的响应速度。如何?您在这里提供的内容只允许您通过客户端不可聚焦的矩形拖动内容。该链接中的代码provides一个很酷的动画:)