Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ускарение создание компонентов в RUN-TIME


Страницы:   1 2

markers ©   (2006-09-09 02:18:00) 

У меня в компоненке ScrollBox автоматически создаются компоненты (~8 на каждую строку, а строк до 1000), как можно ускорить создание этих компонентов так-как создание даже 200 строк уже требует ожидания (Особенно их снос) Правда я ускорил этот процесс перекрытие другим компонентом (На котором написано типо работаем), что существенно ускорило работу. Может ещё как-то можно? Заранее спасибо!


Virgo_Style   (2006-09-12 23:22:00) [1]

ListBox или аналог с ручной отрисовкой нужных контролов + отслеживание кликов ?


GrayFace   (2006-09-12 20:54:00) [2]

Думаю, так будет проще всего:
Кинь под панели PaintBox, развертывай по вертикали на суммарный размер всех панелей. В OnPaint у него смотри по ClipRect'у, какие строки надо отобразить (от Top div (высота строки) до (Bottom-1) div (высота строки) включительно). Для тех из этих строк, у которых панели не созданы, создавай.
А раз снос тормозит... Ну не сноси. При переключении все пряч, когда надо отобразить смотри: если не создана, создавай; если невидима, перезаполняй.


Loginov Dmitry   (2006-09-09 09:31:00) [3]

> 1) Что бы Вы сделали на моём месте?


Хранил бы каталог товаров в базе данных


> 2) На основе какого компонента лучше всего сделать?


TDBGrid


> 3) Если я сделаю компонент в котором будет делатся почти
> тоже самое, эффекта наверняка не будет?


Зависит от того, как ты его сделаешь. Если накидаешь опять кучу контролов, то эффекта наверняка не будет.


markers   (2006-09-09 04:21:00) [4]

Ответьте пожалуйста на вопросы:
1) Что бы Вы сделали на моём месте?
2) На основе какого компонента лучше всего сделать?
3) Если я сделаю компонент в котором будет делатся почти тоже самое, эффекта наверняка не будет?
Спасибо!


Джо   (2006-09-09 03:50:00) [5]

> [32] markers ©   (09.09.06 03:39)
> Джо ©   (09.09.06 3:23) [31]
> Да просто чтоб видно было нафиг нужны были панели etc.

Извини, но из него не видно "нафиг нужны были панели". Видны только "муки мысли" :)


markers   (2006-09-09 03:39:00) [6]

Джо ©   (09.09.06 3:23) [31]
Да просто чтоб видно было нафиг нужны были панели etc.


Джо   (2006-09-09 03:23:00) [7]

> [30] markers ©   (09.09.06 03:20)
> Вот вообщем старый кусок кода!

И что с ним делать-то? :)


markers   (2006-09-09 03:20:00) [8]

Вот вообщем старый кусок кода!
for i := NameL.Count-1 downto 0 do
begin
if AbortLoadProgressOperation Then Break;
// Application.ProcessMessages;
MainForm.LoadProgress.Position:=CurP+(MainForm.LoadProgress.Max-i);
with TPanel.Create(MainForm.ScrollBox1) do
 begin
  Parent := MainForm.ScrollBox1;
//   Name := 'Panel'+IntToStr(i+1);
  Caption := '';//+IntToStr(random(Random(random(Random(9999)))));
  if First Then Begin Top:=0; First:=False; End
  else top := TPanel(MainForm.ScrollBox1.Controls[MainForm.ScrollBox1.ControlCount-2]).Top+TPanel(MainForm.ScrollBox1.Controls[MainForm.ScrollBox1.ControlCount-2]).Height;
  Height := PanelHeight;
  Tag := i;
  if odd(i-1) then Color:=$FFFFFF
  else Color:=$F5F5F5;
  Align := alTop;
  BorderStyle := bsNone;
  BevelInner := bvNone;
  BevelOuter := bvNone;
  OnMouseMove := MainForm.RMouseMove;
//   OnClick := .RedirectToScroll;
 end;
with TImage.Create(TPanel(MainForm.ScrollBox1.Controls[MainForm.ScrollBox1.ControlCou nt-1])) do
 begin
  Parent := TPanel(MainForm.ScrollBox1.Controls[MainForm.ScrollBox1.ControlCount-1]);
  Top := imgtop;
  Left := imgleft;
  Height := 50;
  Width := 50;
  AutoSize := False;
  Transparent := True;
  Proportional := True;
  Stretch := True;
  IncrementalDisplay := True;
  Center := True;
  Tag := StrToInt(TovarCategoryL.Strings[i]);
  try
  if ExtractFileExt(smallPictureL.Strings[i]) = '.pjpeg' then
   begin
    smallPictureL.Strings[i]:=copy(smallPictureL.Strings[i],1,BMSearch(1,smallPictur eL.Strings[i],ExtractFileExt(smallPictureL.Strings[i]))-1)+'.jpg';
    if FileExists(PP+SmallPictureL.Strings[i]) then
     Picture.LoadFromFile(PP+SmallPictureL.Strings[i]);
   end
  else
   if FileExists(PP+SmallPictureL.Strings[i]) then
    begin
     Picture.LoadFromFile(PP+SmallPictureL.Strings[i])
    end
  else if FileExists(ExtractFileDir(Application.ExeName)+'\img\nopics.gif') then
         Picture.LoadFromFile(PP+'nopics.gif')
       else
        begin
         loadgraphic('nopics',nopicsImage);
         Picture.Bitmap.Assign(TGIFImage(nopicsImage));
         nopicsImage.Free;
        end
  except
   on E:EInvalidGraphicOperation do
    begin
       if FileExists(ExtractFileDir(Application.ExeName)+'\img\nopics.gif') then
         Picture.LoadFromFile(PP+'nopics.gif')
       else
        begin
         loadgraphic('nopics',nopicsImage);
         Picture.Bitmap.Assign(TGIFImage(nopicsImage));
         nopicsImage.Free;
        end
//      ShowMessage(E.Message);
    end;
  end;
  OnMouseMove := MainForm.RMouseMove;
  OnClick := MainForm.SmallPicClick;
  Cursor := crHandPoint;
  Tag:=StrToInt(TovarIdL.Strings[i]);
//   ShowMessage(TovarCategoryL.Strings[i]);
 end;
with TLabel.Create(TPanel(MainForm.ScrollBox1.Controls[MainForm.ScrollBox1.ControlCou nt-1])) do
 begin
  Parent := TPanel(MainForm.ScrollBox1.Controls[MainForm.ScrollBox1.ControlCount-1]);
  Height := ArtikulTextHeight;
  Top := TextTop;
  Left := ArtikulTextLeft;
  Transparent := True;
  Width := ArtikulTextWidth;
  AutoSize:=False;
  Caption := ArtikulL.Strings[i];
  WordWrap:=False;
  OnMouseMove := MainForm.RMouseMove;
//   OnClick := MainForm.RedirectToScroll;
 end;
with TLabel.Create(TPanel(MainForm.ScrollBox1.Controls[MainForm.ScrollBox1.ControlCou nt-1])) do
 begin
  Parent := TPanel(MainForm.ScrollBox1.Controls[MainForm.ScrollBox1.ControlCount-1]);
  Height := NameTextHeight;
  Top := NameTextTop;
  Left := Namelblleft;
  Transparent := True;
  Width := NameTextWidth;
  AutoSize:=False;
  Caption := NameL.Strings[i];
  WordWrap:=True;
  OnMouseMove := MainForm.RMouseMove;
 end;
with TLabel.Create(TPanel(MainForm.ScrollBox1.Controls[MainForm.ScrollBox1.ControlCou nt-1])) do
 begin
  WordWrap:=True;
  Parent := TPanel(MainForm.ScrollBox1.Controls[MainForm.ScrollBox1.ControlCount-1]);
  Alignment := taCenter;
  Height := VTareTextHeight;
  Top := VTareTextTop;
  Left := VTareTextLeft;
  Transparent := True;
  Width := VTareTextWidth;
  AutoSize:=False;
  Caption := CountL.Strings[i];
  OnMouseMove := MainForm.RMouseMove;
 end;
with TLabel.Create(TPanel(MainForm.ScrollBox1.Controls[MainForm.ScrollBox1.ControlCou nt-1])) do
 begin
  WordWrap:=True;
  Parent := TPanel(MainForm.ScrollBox1.Controls[MainForm.ScrollBox1.ControlCount-1]);
  Alignment := taCenter;
  Height := SkladTextHeight;
  Top := SkladTextTop;
  Left := SkladTextLeft;
  Transparent := True;
  Width := SkladTextWidth;
  AutoSize:=False;
  Caption := SkladL.Strings[i];
  OnMouseMove := MainForm.RMouseMove;
 end;
with TEdit.Create(TPanel(MainForm.ScrollBox1.Controls[MainForm.ScrollBox1.ControlCoun t-1])) do
 begin
  Parent := TPanel(MainForm.ScrollBox1.Controls[MainForm.ScrollBox1.ControlCount-1]);
  Top := RecEditTop;
  Left := RecEditLeft;
  Width := RecEditWidth;
  Height := RecEditHeight;
  MaxLength := 3;
  ReadOnly := False;
  OnMouseMove := MainForm.RMouseMove;
 end;
...
end;


Джо   (2006-09-09 03:17:00) [9]

> [28] markers ©   (09.09.06 03:15)
> У меня сделано так, юзер выберает категорию происходит выборка
> данных, а потом цикл в котором создаётся панель, на ней
> лейблы edit и spin, следующая строка повтор. Узер выбирает
> другую категорию (Раньше было в ListBox, счас будет в TreeView)
> происходит удаление всех старых компонент и создание новых...
> и т.д.

Это всё чудно, но не для таких объемов данных.


markers   (2006-09-09 03:15:00) [10]

Германн ©   (09.09.06 2:52) [27]
У меня сделано так, юзер выберает категорию происходит выборка данных, а потом цикл в котором создаётся панель, на ней лейблы edit и spin, следующая строка повтор. Узер выбирает другую категорию (Раньше было в ListBox, счас будет в TreeView) происходит удаление всех старых компонент и создание новых... и т.д.


Германн   (2006-09-09 02:52:00) [11]


> markers ©   (09.09.06 02:39) [20]
>
> Германн ©   (09.09.06 2:32) [14]
> Для более качественного отображения и меньших расчётов.
>

Имхо, для этого не нужно, чтобы все товары всегда имели свою собственную панель! Особенно насчёт "всегда". Расчитывай тогда, когда нужно. Но и показывай тогда, когда нужно!


Zeqfreed   (2006-09-09 02:48:00) [12]

> [25] markers ©   (09.09.06 02:46)

Смотря что требуется от интерфейса.


markers   (2006-09-09 02:46:00) [13]

Мож тада проще постранично бить? Это как-то гораздо проще чем то что вы предлагаете.


markers   (2006-09-09 02:44:00) [14]

Проблема ещё в том, что у ScrollBox`а даже событий сролинга нету :(


markers   (2006-09-09 02:43:00) [15]

Мдя.... я примерно понял как и что.... Но поипатся придётся :(


markers   (2006-09-09 02:41:00) [16]

Но тут ещё проблема, будет возможность изменения размеров скроллбокса, как это учитывать?


markers   (2006-09-09 02:40:00) [17]

Джо ©   (09.09.06 2:39) [19]
Тобишь дорисовывать когда проскроленно вниз? А верхние типо сносить или оставлять?


Джо   (2006-09-09 02:39:00) [18]

> [15] markers ©   (09.09.06 02:34)
> Джо ©   (09.09.06 2:32) [13]
> Ну я как в листвью например Edit со Spin`ом засуну?

Правильно говорит Zeqfreed: "надо отображать только то, что сейчас видно". Раз уж пошел по такому пути, прислушайся к его совету. Хоть это и сложно, но что поделаешь — профессия такая.


markers   (2006-09-09 02:39:00) [19]

Германн ©   (09.09.06 2:32) [14]
Для более качественного отображения и меньших расчётов.


markers   (2006-09-09 02:37:00) [20]

Zeqfreed ©   (09.09.06 2:29) [10]
Я их при смене категории и т.д. освобождаю все.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо