【问题标题】:Synchronize scrollbars of two listboxes同步两个列表框的滚动条
【发布时间】:2014-06-13 00:14:50
【问题描述】:

我在 Delphi 7 中制作了一个小项目,并且呈现的表单上有 2 个列表框。现在我需要同步这些列表框的滚动条。列表框保证具有相同数量的项目。当用户移动滚动条之一时应进行同步。我想它应该是“执行”方法的东西,但我是新手。

【问题讨论】:

  • +1 没有理由拒绝或关闭恕我直言
  • 已经回答了类似的问题(TreeView/ScrollBox/...的滚动条同步),从​​这个角度来看,了解TopIndex就足够了。但是很高兴有直接的答案(对于 ListBox),所以我投了赞成票。
  • 听起来你可能想要一个多列列表或列表视图

标签: delphi listbox scrollbar


【解决方案1】:

要设置列表框的顶行,请使用TopIndex

您可以创建一个处理WM_VSCROLLTListbox 后代(如果需要,还可以创建WM_HSCROLL)。然后,您可以挂钩并更新第二个列表框。这是一个例子。我只是以一种方式做钩子,所以滚动 listbox2 不会滚动 listbox1。

您需要在表单声明之前将此 TListBox 覆盖添加到您的单元中:

TListBox = class(Vcl.StdCtrls.TListBox)
private
  FOnScroll: TNotifyEvent;
protected
  procedure ListBoxScroll(var Message: TMessage); message WM_VSCROLL;
public
  property OnScroll: TNotifyEvent read FOnScroll write FOnScroll;
end;

这会向列表框添加一个 OnScroll 事件。该类的实现:

procedure TListBox.ListBoxScroll(var Message: TMessage);
begin
  inherited;
  if Assigned(FOnScroll) then
    FOnScroll(Self);
end;

然后您可以在代码中连接事件:

procedure TMyForm.FormCreate(Sender: TObject);
begin
  listbox1.OnScroll := DoScrollListBox1;
end;

DoScrollListBox1 的代码很简单:

procedure TMyForm.DoScrollListBox1(Sender: TObject);
begin
  listbox2.TopIndex := listbox1.TopIndex;
end;

这通过使用滚动条来处理滚动。您还需要将以下行添加到列表框的 OnClick 中,这样键盘操作也会触发滚动。

procedure TMyForm.ListBox1Click(Sender: TObject);
begin
  ...
  listbox2.TopIndex := listbox1.TopIndex;
  ...
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多