Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Тормоза при создании компонентов динамически


Автор: gesper 25.1.2013, 16:37
Программа в одной процедуре создает, к примеру, 10 компонентов. 10 Label и 10 штук Edit напротив. обрабатывает их процедуры и все такое.
Есть какая то особенность их отрисовки при динамическом создании? У меня программа подтормаживает на этом действии, пока они создаются, напрягает.

Автор: Akella 25.1.2013, 17:21
Ошибка в 17ой строке  smile 

Автор: gesper 25.1.2013, 17:32
Я об этом думал. и стер ее на всякий случай.

Может команду NewEdit.Show; вызывать у всех отдельно отдельным циклом... :(
Код

function TPropertyList.AddEdit(Index:Integer; NeedButton:boolean):String;
var
  NewEdit   :TEdit;
  NewButton :TButton;
begin
try
  CountObj:=CountObj+1;

  NewEdit             :=TEdit.Create(GroupControlParent); // CreateAOwner
  NewEdit.Parent      :=GroupControlParent;//ControlParent;
  NewEdit.Height      :=ControlHeight;
  if (Not NeedButton) then
  begin
    NewEdit.Width       :=ControlS2Width-ValuePaddingRight-2;
    NewEdit.Top         :=FPositionTop;
    NewEdit.Left        :=ControlS1Width-ValuePaddingLeft;
// 17 строка - Ошибок нет
  end else begin
    NewEdit.Width       :=ControlS2Width-ValuePaddingRight-2-ControlHeight;
    NewEdit.Top         :=FPositionTop;
    NewEdit.Left        :=ControlS1Width-ValuePaddingLeft;
  end;
  NewEdit.BorderStyle :=bsNone;
  //NewEdit.Anchors:=[akRight,akTop];
  NewEdit.Name        :=ObjPrefName+'objEdit'+inttostr(CountObj);

  Items[Index].ControlValue   :=NewEdit;

  if Items[Index].ValueType='String' then
  begin
      NewEdit.Text        :=Items[Index].Value;
      NewEdit.Hint        :=Items[Index].Hint;
      NewEdit.ReadOnly    :=Items[Index].ControlReadOnly;
  end
  else if Items[Index].ValueType='Double' then
  begin
      NewEdit.Text        :=Items[Index].Value;
      NewEdit.Hint        :=Items[Index].Hint;
      NewEdit.ReadOnly    :=Items[Index].ControlReadOnly;
  end
  else if Items[Index].ValueType='Integer' then
  begin
      NewEdit.Text        :=Items[Index].Value;
      NewEdit.Hint        :=Items[Index].Hint;
      NewEdit.ReadOnly    :=Items[Index].ControlReadOnly;
  end;

  if NeedButton then
  begin
      NewButton           :=TButton.Create(GroupControlParent);
      NewButton.Parent    :=GroupControlParent;//ControlParent;
      NewButton.Height    :=ControlHeight;
      NewButton.Width     :=ControlHeight;
      NewButton.Top       :=FPositionTop;
      NewButton.Left      :=NewEdit.Left+NewEdit.Width;
      NewButton.Caption   :='...';
      NewButton.OnClick   :=EditButtonClick;

      NewButton.Name               :=ObjPrefName+'objButton'+inttostr(CountObj);
      Items[Index].ControlButton   :=NewButton;
  end
  else
      Items[Index].ControlButton   :=nil;

  if Items[Index].ControlReadOnly then
    NewEdit.Color:=RowColorReadOnlyTrue
  else
    NewEdit.Color:=RowColorReadOnlyFalse;

  NewEdit.PopupMenu:=FPopupMenu;
  NewEdit.OnClick:=EditOnClick;
  NewEdit.OnChange:=EditOnChange;
  NewEdit.OnKeyPress:=EditOnKeyPress;
  NewEdit.OnEnter:=EditOnEnter;
  NewEdit.OnExit:=EditOnExit;

  NewEdit.Show;
  if NeedButton then NewButton.Show;
  result:=NewEdit.Name;
except
   application.MessageBox('TPropertyList.AddEdit','Class Error',0);
   result:=null;
end;
end;

Автор: Чучмек 25.1.2013, 17:35
Цитата(gesper @  25.1.2013,  16:37 Найти цитируемый пост)
Есть какая то особенность их отрисовки при динамическом создании? 

Ты сам ответил. InsertControl включает в себя отрисовку компонента. От этого и торможение.


Автор: northener 26.1.2013, 00:16
Цитата(gesper @  25.1.2013,  16:37 Найти цитируемый пост)
Есть какая то особенность их отрисовки при динамическом создании? 

Никакой, кроме той, о которой упомянул Akella.

Цитата(Чучмек @  25.1.2013,  17:35 Найти цитируемый пост)
Ты сам ответил. InsertControl включает в себя отрисовку компонента. От этого и торможение.

Сама по себе отрисовка 10-30 компонент типа TLabel, TEdit или TButton ну никак не может приводить к тормозам заметным человеческому глазу!

Автор: Чучмек 26.1.2013, 00:42
Цитата(northener @  26.1.2013,  00:16 Найти цитируемый пост)
Сама по себе отрисовка 10-30 компонент типа TLabel, TEdit или TButton ну никак не может приводить к тормозам заметным человеческому глазу! 

Подозреваю, что там далеко не 30 компонент.

Автор: northener 26.1.2013, 00:48
Цитата(Чучмек @  26.1.2013,  00:42 Найти цитируемый пост)
Подозреваю, что там далеко не 30 компонент.

Я тоже много чего подозреваю, но мои подозрения полностью совпадают с ответом Akella.
А количество компонент тут не самый яркий показатель. Ибо кому нужно на форме иметь 30 тысяч компонент  типа TLabel, TEdit или TButton?

Автор: Чучмек 26.1.2013, 01:02
У меня 100 эдитов  создается за 0,015 с
1000 на видимой панели за 0,64 с, а на предварительно скрытой за 0,19 с

Автор: northener 26.1.2013, 01:50
Цитата(Чучмек @  26.1.2013,  01:02 Найти цитируемый пост)
У меня 100 эдитов  создается за 0,015 с
1000 на видимой панели за 0,64 с, а на предварительно скрытой за 0,19 с


Что и требовалось доказать! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)