Вставка набора элементов управления во время выполнения чрезвычайно медленная - PullRequest
4 голосов
/ 01 июня 2011

У нас есть приложение для торговых точек, и в этом приложении у нас есть контейнер прокрутки. Если продавец выбирает продукт, то новая строка продукта создается и вставляется в поле прокрутки. Компонентом строки продукта является рамка - текстовые поля, кнопки и метки в ней.

Но вот небольшая проблема, если вставить элемент управления строкой продукта в поле прокрутки во время выполнения. Это медленно. Я вижу, как при выборе продукта компоненты edittext медленно рисуют в поле прокрутки.

Я пытался установить для компонентов visibility значение false до ScrollBox.InsertControl и включить его после, но это не очень помогает ускорить процесс. Также я читал о DisableAlign / EnableAlign, но я не знаю точно, где я должен поместить эту строку кода.

Как я могу ускорить вставку этого пользовательского компонента в контейнер прокрутки формы?

Ответы [ 3 ]

9 голосов
/ 01 июня 2011

TScrollBox не имеет BeginUpdate / EndUpdate, но вы можете получить тот же эффект , используя сообщения WM_SETREDRAW. Я бы, вероятно, избегал более тяжелых методов, таких как LockWindowUpdate .

  SendMessage(ScrollBox1.Handle, WM_SETREDRAW, 0, 0);
  try
    // add controls to scrollbox
    // set scrollbox height
  finally
    SendMessage(ScrollBox1.Handle, WM_SETREDRAW, 1, 0);
    RedrawWindow(ScrollBox1.Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_FRAME or RDW_ALLCHILDREN);
  end;
1 голос
/ 01 июня 2011

Обычно добавление элемента управления в контейнер занимает очень мало времени. С большой вероятностью это связано с созданием элемента управления, а не с вставкой.

0 голосов
/ 01 июня 2011

Попробуйте отключить обновления экрана при добавлении элементов управления и включите обновление экрана, когда выполните процедуру try-finally.Тогда экран не должен обновляться для каждого отдельного элемента управления, а только один раз, когда все элементы управления размещены.

...