我如何计算出TListBox.ScrollWidth使用的值?

Dav*_*nan 8 delphi winapi

我正在尝试设置如何设置ScrollWidtha TListBox来控制水平滚动条.这是我的第一次尝试:

program ListBoxSizing;

uses
  Math, Forms, StdCtrls;

var
  Form: TForm;
  ListBox: TListBox;

procedure BuildForm;
begin
  //Form.Font.Size := 9;
  Form.ClientWidth := 200;
  Form.ClientHeight := 100;
  ListBox := TListBox.Create(Form);
  ListBox.Parent := Form;
  ListBox.SetBounds(0, 0, Form.ClientWidth, Form.ClientHeight);
  ListBox.Items.Add('ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ');
end;

procedure SetScrollWidth;
var
  i, MaxWidth: Integer;
begin
  MaxWidth := -1;
  for i := 0 to ListBox.Items.Count-1 do
    MaxWidth := Max(MaxWidth, ListBox.Canvas.TextWidth(ListBox.Items[i]));
  if MaxWidth<>-1 then
    ListBox.ScrollWidth := MaxWidth;
end;

begin
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm, Form);
  BuildForm;
  SetScrollWidth;
  Application.Run;
end.
Run Code Online (Sandbox Code Playgroud)

这是水平滚动条尽可能向右移动的结果:

在此输入图像描述

注意最后一个字符的最后部分是如何被删除的.

现在,如果我们取消注释更改表单字体大小的行,它看起来像这样:

在此输入图像描述

现在,似乎在后续调用中没有考虑到字体大小的更改TextWidth.

所以,我的问题是,ScrollWidth根据列表框的当前内容,我需要使用哪些代码才能准确设置.

Ond*_*lle 10

procedure SetScrollWidth;
var
  I, MaxWidth: Integer;
begin
  MaxWidth := -1;
  // assign control's font to canvas
  ListBox.Canvas.Font := ListBox.Font;
  for I := 0 to ListBox.Items.Count - 1 do
    MaxWidth := Max(MaxWidth, ListBox.Canvas.TextWidth(ListBox.Items[I]));
  // consider non-client area
  if MaxWidth <> -1 then
    ListBox.ScrollWidth := MaxWidth + ListBox.Width - ListBox.ClientWidth;
end;
Run Code Online (Sandbox Code Playgroud)

  • 啊,现在我完全理解`ListBox.Canvas.Font:= ListBox.Font`的意义.如果您不在油漆活动之外,那么您必须自己完成这项任务.非常感谢你. (5认同)
  • @DavidHeffernan请注意,我将listbox的字体分配给listbox的画布(这不是自动完成的). (3认同)