Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi-在TScrollBox中发布渲染TPanel子体(32K像素限制)_Delphi_Delphi 10.1 Berlin_Tpanel_Tscrollbox - Fatal编程技术网

Delphi-在TScrollBox中发布渲染TPanel子体(32K像素限制)

Delphi-在TScrollBox中发布渲染TPanel子体(32K像素限制),delphi,delphi-10.1-berlin,tpanel,tscrollbox,Delphi,Delphi 10.1 Berlin,Tpanel,Tscrollbox,我是新来的,希望我遵循正确的协议,正确地提问。我在这里单独发布这个问题,因为我没有适当的特权对下面列出/链接的原始问题发表评论 我遇到()并尝试实现@ngln建议的第一个解决方案(滚动滚动滚动框) 我一定是做错了什么,因为我的解决方案似乎不起作用。我真的很想得到一些指导 我有一个自定义面板(TEntryPanel),它是从TPanel派生的,并且在其中包含其他元素,这些元素是使用TEntry的数据设置的(它只是从包含数据的TObject派生的自定义类)。EntryList是一个包含第十个对象列表

我是新来的,希望我遵循正确的协议,正确地提问。我在这里单独发布这个问题,因为我没有适当的特权对下面列出/链接的原始问题发表评论

我遇到()并尝试实现@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。非常感谢