gpt4 book ai didi

listview - 如何防止 ListView 在 item.count 更改时跳转到选定/焦点行?

转载 作者:行者123 更新时间:2023-12-03 18:30:01 24 4
gpt4 key购买 nike

我有一个虚拟 ListView ,我打算用它来显示一个相当大的日志文件中的内容。

每当添加或删除一行并且我在列表框中选择或聚焦(或两者)行时,它都会自动滚动回它,这非常烦人。

当项目计数被修改时,感觉就像有东西在调用 MakeVisible(或做同样事情的东西)。

重现它的非常简化的示例:

procedure TForm1.FormCreate(Sender: TObject);
var
Col: TListColumn;
begin
ListView1.OwnerData := True;
ListView1.ViewStyle := vsReport;
ListView1.RowSelect := True;

Col := ListView1.Columns.Add;
Col.Caption := 'LineNum';
Col.Alignment := taLeftJustify;
Col.Width := 70;
end;
// listview onData event
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
Item.Caption := IntToStr(Item.Index+1);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
ListView1.Items.Count := ListView1.Items.Count + 10;
end;

编辑:测试不同的 ViewStyles,这只发生在 vsReport 和 vsList

最佳答案

问题是 TListItems.Count属性 setter 调用 ListView_SetItemCountEx() 没有 LVSICF_NOSCROLL旗帜:

The list-view control will not change the scroll position when the item count changes.


procedure TListItems.SetCount(Value: Integer);
begin
if Value <> 0 then
ListView_SetItemCountEx(Handle, Value, LVSICF_NOINVALIDATEALL)
else
ListView_SetItemCountEx(Handle, Value, 0);
end;

这就是 ListView 在 Count 时滚动的原因。变化。您必须调用 ListView_SetItemCountEx()直接自己,以便您可以指定 LVSICF_NOSCROLL旗帜。
uses
..., CommCtrl;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
//ListView1.Items.Count := ListView1.Items.Count + 10;
ListView_SetItemCountEx(ListView1.Handle, ListView1.Items.Count + 10, LVSICF_NOINVALIDATEALL or LVSICF_NOSCROLL);
end;

关于listview - 如何防止 ListView 在 item.count 更改时跳转到选定/焦点行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52533746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com