Delphi - Ошибка рендеринга потомка TPanel в TScrollBox (ограничение 32K пикселей)

Я здесь новичок и надеюсь, что соблюдаю правильный протокол и правильно задаю вопрос. Я публикую этот вопрос здесь отдельно, поскольку у меня нет соответствующих прав для публикации комментария к исходной проблеме, указанной / связанной ниже.

Я столкнулся с этой проблемой ( Delphi - проблема TScrollBox после X числа компонентов) и попытался реализовать первое решение (прокрутка прокрутки), предложенное @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://stackru.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 ответов

Другие вопросы по тегам