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

时间:2017-02-08 07:57:55

标签: delphi delphi-10.1-berlin tpanel tscrollbox

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

我遇到this issueDelphi - TScrollBox issue after X number of components)并试图实现@ngln建议的第一个解决方案(滚动滚动框)。

我必须做错事,因为我的解决方案的实现似乎不起作用。非常感谢对此的一些指导。

我有一个从TPanel派生的自定义面板(TEntryPanel) - 并且包含其中的其他元素,这些元素使用来自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。非常感谢提前。

0 个答案:

没有答案