我想动态地在TScrollBox中创建一些按钮(其中有VertScrollBar.Vissible= False)。
我想以编程的方式将其中一些按钮放在视图中,因此我想使用如下所示:
ScrollBox.VertScrollBar.Position:= i; //Does not work但是,除非VertScrollBar.Vissible=真,否则框不会滚动到指定的位置。注意: ScrollBy()可以工作,但我不想使用它。
如何规避这种行为?
(“解决方案”是让滚动条可见,并将其隐藏在屏幕外(将滚动框放置在面板中)。
代码:
unit UnitVert;
interface
uses
System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm3 = class(TForm)
ScrollBox1: TScrollBox;
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
end;
var
Form3: TForm3;
implementation {$R *.dfm}
procedure TForm3.Button2Click(Sender: TObject);
begin
ScrollBox1.VertScrollBar.Position:= -20;
//ScrollBox1.ScrollBy(0, -20); //Works
end;
end.
object Form3: TForm3
Left = 0
Top = 0
Caption = 'Form3'
ClientHeight = 336
ClientWidth = 635
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object ScrollBox1: TScrollBox
Left = 176
Top = 75
Width = 283
Height = 203
HorzScrollBar.Visible = False
VertScrollBar.Visible = False
TabOrder = 0
object Button1: TButton
Left = 188
Top = 132
Width = 123
Height = 99
Caption = 'Dummy'
TabOrder = 0
end
end
object Button2: TButton
Left = 26
Top = 50
Width = 111
Height = 51
Caption = 'Test'
TabOrder = 1
OnClick = Button2Click
end
end发布于 2022-03-22 20:08:04
按预期工作
无法在D7上在Win7上重现您的问题:
Scrollbox1.HorzScrollBar.Visible:= FALSE;
Scrollbox1.VertScrollBar.Visible:= FALSE;
Scrollbox1.ScrollBy( -30, -45 );...moves视口30 px在左边,45 px在顶部。还要注意的是,第一个参数是X(水平的),第二个参数是Y(垂直的)--实际上,我在生活中看到的任何东西都是X,Y顺序。
为什么看不见的滚动条不能工作
方法TWinControl.ScrollBy()包括以下代码:
IsVisible := (FHandle <> 0) and IsWindowVisible(FHandle);
if IsVisible then ScrollWindow(FHandle, DeltaX, DeltaY, nil, nil);...which的意思是:它实际上是使用WinAPI的ScrollWindow()函数。更改其中一个滚动条的位置将执行TControlScrollBar.SetPosition(),而TControlScrollBar.SetPosition()只为一个维度再次调用.ScrollBy():
OldPos := FPosition;
if Kind = sbHorizontal then
FControl.ScrollBy(OldPos - Value, 0) else
FControl.ScrollBy(0, OldPos - Value);...and,因为父控件是滚动条(而不是滚动框),它的不可见性阻止了调用WinAPI函数。就内容而言,使用滚动条没有任何好处--它们只是方便地记住您已经滚动过的内容。
https://stackoverflow.com/questions/71575191
复制相似问题