首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有滚动条的TScrollBox

没有滚动条的TScrollBox
EN

Stack Overflow用户
提问于 2022-03-22 15:59:34
回答 1查看 227关注 0票数 0

我想动态地在TScrollBox中创建一些按钮(其中有VertScrollBar.Vissible= False)。

我想以编程的方式将其中一些按钮放在视图中,因此我想使用如下所示:

代码语言:javascript
复制
  ScrollBox.VertScrollBar.Position:= i; //Does not work

但是,除非VertScrollBar.Vissible=真,否则框不会滚动到指定的位置。注意: ScrollBy()可以工作,但我不想使用它。

如何规避这种行为?

(“解决方案”是让滚动条可见,并将其隐藏在屏幕外(将滚动框放置在面板中)。

代码:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2022-03-22 20:08:04

按预期工作

无法在D7上在Win7上重现您的问题:

代码语言:javascript
复制
Scrollbox1.HorzScrollBar.Visible:= FALSE;
Scrollbox1.VertScrollBar.Visible:= FALSE;
Scrollbox1.ScrollBy( -30, -45 );

...moves视口30 px在左边,45 px在顶部。还要注意的是,第一个参数是X(水平的),第二个参数是Y(垂直的)--实际上,我在生活中看到的任何东西都是X,Y顺序。

为什么看不见的滚动条不能工作

方法TWinControl.ScrollBy()包括以下代码:

代码语言:javascript
复制
IsVisible := (FHandle <> 0) and IsWindowVisible(FHandle);
if IsVisible then ScrollWindow(FHandle, DeltaX, DeltaY, nil, nil);

...which的意思是:它实际上是使用WinAPI的ScrollWindow()函数。更改其中一个滚动的位置将执行TControlScrollBar.SetPosition(),而TControlScrollBar.SetPosition()只为一个维度再次调用.ScrollBy()

代码语言:javascript
复制
OldPos := FPosition;
if Kind = sbHorizontal then
  FControl.ScrollBy(OldPos - Value, 0) else
  FControl.ScrollBy(0, OldPos - Value);

...and,因为父控件是滚动(而不是滚动),它的不可见性阻止了调用WinAPI函数。就内容而言,使用滚动条没有任何好处--它们只是方便地记住您已经滚动过的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71575191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档