我是新来的,希望我遵循正确的协议并正确地提出问题。我在这里单独发布这个问题,因为我没有适当的权限对下面列出/链接的原始问题发表评论。
我遇到了这个问题(X 个组件后的 Delphi - TScrollBox 问题)并尝试实现@ngln 建议的第一个解决方案(滚动滚动框)。
我一定做错了什么,因为我的解决方案实施似乎不起作用。非常感谢对此的一些指导。
我有一个自定义面板(TEntryPanel),它派生自 TPanel - 并包含其中的其他元素,这些元素使用来自 TEntry 的数据进行设置(它只是从包含数据的 TObject 派生的自定义类)。EntryList 是一个包含 TEntry 对象列表的对象。
这是我实现它的方式:
count:=EntryList.Count;
SendMessage(scroll_left.Handle, WM_SETREDRAW, 0, 0);
scroll_left.VertScrollBar.Range:=(count-1)*83;
scroll_left.DisableAlign;
try
//Display all the panels
prevtop:=0;
counter:=0;
incscrollpos:=0;
for i:=Count-1 downto 0 do
begin
//New Code--- based on https://stackoverflow.com/questions/14655516/delphi-tscrollbox-issue-after-x-number-of-components
//for every entry in the list
entry:=EntryList.ListofEntries[i];
//we create a panel
pnl:=TEntryPanel.Create(self);
//set it's top location
pnl.SetBounds(0, prevtop, 350, 83);
pnl.Align:=alCustom;
//set the entry of the panel
pnl.SetEntryData(entry);
//set the events
pnl.OnClick:=pnlOnClick;
pnl.SetChildrenClickEvent;
scroll_left.InsertComponent(pnl);
pnl.parent:=scroll_left;
//increment the top location
prevtop:=prevtop+pnl.height;
//and the component index
pnl.componentindex:=Count-1-i;
counter:=counter+1;
if (counter div 350) <> incscrollpos then
begin
incscrollpos:=incscrollpos+1;
scroll_left.VertScrollBar.Position := incscrollpos*350*83;
end;
//New Code ---
finally
scroll_left.VertScrollBar.Position:=0;
scroll_left.EnableAlign;
SendMessage(scroll_left.Handle, WM_SETREDRAW, 1, 0);
RedrawWindow(scroll_left.Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_FRAME or RDW_ALLCHILDREN);
end;
运行此代码后,我仍然遇到未显示所有面板的问题。有人可以让我知道我做错了什么吗?我正在使用 Delphi 10.1 Berlin。提前谢谢了。