Delphi-在TScrollBox中发布渲染TPanel子体(32K像素限制)
我是新来的,希望我遵循正确的协议,正确地提问。我在这里单独发布这个问题,因为我没有适当的特权对下面列出/链接的原始问题发表评论 我遇到()并尝试实现@ngln建议的第一个解决方案(滚动滚动滚动框) 我一定是做错了什么,因为我的解决方案似乎不起作用。我真的很想得到一些指导 我有一个自定义面板(TEntryPanel),它是从TPanel派生的,并且在其中包含其他元素,这些元素是使用TEntry的数据设置的(它只是从包含数据的TObject派生的自定义类)。EntryList是一个包含第十个对象列表的对象 我是如何实现它的:Delphi-在TScrollBox中发布渲染TPanel子体(32K像素限制),delphi,delphi-10.1-berlin,tpanel,tscrollbox,Delphi,Delphi 10.1 Berlin,Tpanel,Tscrollbox,我是新来的,希望我遵循正确的协议,正确地提问。我在这里单独发布这个问题,因为我没有适当的特权对下面列出/链接的原始问题发表评论 我遇到()并尝试实现@ngln建议的第一个解决方案(滚动滚动滚动框) 我一定是做错了什么,因为我的解决方案似乎不起作用。我真的很想得到一些指导 我有一个自定义面板(TEntryPanel),它是从TPanel派生的,并且在其中包含其他元素,这些元素是使用TEntry的数据设置的(它只是从包含数据的TObject派生的自定义类)。EntryList是一个包含第十个对象列表
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;
count:=EntryList.count;
SendMessage(滚动左手柄,WM_SETREDRAW,0,0);
向左滚动。垂直滚动条。范围:=(计数-1)*83;
向左滚动。取消对齐;
尝试
//显示所有面板
prevtop:=0;
计数器:=0;
位置:=0;
对于i:=计数-1到0 do
开始
//新代码——基于https://stackoverflow.com/questions/14655516/delphi-tscrollbox-issue-after-x-number-of-components
//对于列表中的每个条目
条目:=条目列表。条目列表[i];
//我们创建一个面板
pnl:=TEntryPanel.Create(self);
//设置它的顶部位置
pnl.立根(0,上止点,350,83);
pnl.Align:=alCustom;
//设置面板的条目
pnl.SetEntryData(条目);
//设置事件
pnl.OnClick:=pnlOnClick;
pnl.SetChildrenClickEvent;
向左滚动。插入组件(pnl);
pnl.parent:=向左滚动;
//增加顶部位置
prevtop:=prevtop+pnl.高度;
//以及成分指数
pnl.componentindex:=Count-1-i;
计数器:=计数器+1;
如果(计数器div 350)增加,则
开始
incscrollpos:=incscrollpos+1;
scroll_left.VertScrollBar.Position:=incscrollpos*350*83;
结束;
//新代码---
最后
向左滚动。垂直滚动条。位置:=0;
向左滚动。启用对齐;
SendMessage(滚动左手柄,WM_SETREDRAW,1,0);
重画窗口(滚动左手柄、零、0、RDW_擦除或RDW_无效或RDW_帧或RDW_所有子项);
结束;
运行此代码后,我仍然存在一个问题,即所有面板都没有显示。有人能告诉我我做错了什么吗?我使用的是Delphi10.1 Berlin。非常感谢