Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.01;
Скачать: CL | DM;

Вниз

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

 
markers ©   (2006-09-09 02:18) [0]

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


 
Джо ©   (2006-09-09 02:20) [1]

А ЗАЧЕМ так много компонентов? Это же нонсенс.


 
markers ©   (2006-09-09 02:23) [2]

Просто у меня каталог товаров сделан и идёт типо
ФОТО (50х50), Наименование, Артикул, В коробке, В корзине.
И так а каждый товар (Строчки)


 
markers ©   (2006-09-09 02:24) [3]

Каждая строка товара лежит на созданной для каждой строки, панели


 
markers ©   (2006-09-09 02:26) [4]

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


 
Zeqfreed ©   (2006-09-09 02:26) [5]

И что, все 8 тысяч компонентов одновременно видны на экране?


 
Джо ©   (2006-09-09 02:27) [6]

Сделай ОДИН компонент, в котором уже будут эти "строки". А иначе будет ужас.


 
markers ©   (2006-09-09 02:27) [7]

Нет, они же в скролбоксе, скролят и смотрят...


 
Джо ©   (2006-09-09 02:28) [8]

А лучше возьми нечто готовое, в роде TListView.


 
markers ©   (2006-09-09 02:29) [9]

Джо ©   (09.09.06 2:27) [6]
Да я читай не юмею создавать компоненты, по этому как касается этой темы, я капитулирую :(


 
Zeqfreed ©   (2006-09-09 02:29) [10]

> [7] markers ©   (09.09.06 02:27)

Вот и надо отображать только то, что сейчас видно. И желательно это все вручную отрисовывать на одном объекте, а не плодить тысячи GDI-хэндлов в системе.


 
Джо ©   (2006-09-09 02:30) [11]

И еще, подобные темы лучше создавать в конференции "Начинающим", а то, не приведи господь, утром явится модератор и позакрывает их, вместо того, чтобы перенести. Уровень вопроса должен соответствовать конференции, иначе будут больно пинать :)


 
markers ©   (2006-09-09 02:31) [12]

Джо ©   (09.09.06 2:28) [8]
Я когда в начале писал это всё, я чё тока не перепробовал (Изначально хотел вообще HTML генерить и показывать, но проблема в том что мне нужно манипулировать этими данными), и пришёл в выводу что среди того что есть, лучше скроллбокса нет :( Счас я пишу новую версию.


 
Джо ©   (2006-09-09 02:32) [13]

> и пришёл в выводу что среди того что есть, лучше скроллбокса
> нет

Бери TListView. :)


 
Германн ©   (2006-09-09 02:32) [14]


> markers ©   (09.09.06 02:24) [3]
>
> Каждая строка товара лежит на созданной для каждой строки,
>  панели
>

Имхо, "Не той дорогой идёте, товарисчь"!


 
markers ©   (2006-09-09 02:34) [15]

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


 
markers ©   (2006-09-09 02:35) [16]

У меня не только просмотр там (В том-то и дело), а ещё добавление в корзину и т.д.


 
markers ©   (2006-09-09 02:36) [17]

Кстати, наверное есть уже компонеты реализующие моё желание....?
Да, нужно чтоб ещё и картинка (50х50 пикселей) тама была


 
markers ©   (2006-09-09 02:37) [18]

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


 
Джо ©   (2006-09-09 02:39) [19]

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

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


 
markers ©   (2006-09-09 02:39) [20]

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


 
markers ©   (2006-09-09 02:40) [21]

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


 
markers ©   (2006-09-09 02:41) [22]

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


 
markers ©   (2006-09-09 02:43) [23]

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


 
markers ©   (2006-09-09 02:44) [24]

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


 
markers ©   (2006-09-09 02:46) [25]

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


 
Zeqfreed ©   (2006-09-09 02:48) [26]

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

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


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


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

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


 
markers ©   (2006-09-09 03:15) [28]

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


 
Джо ©   (2006-09-09 03:17) [29]

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

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


 
markers ©   (2006-09-09 03:20) [30]

Вот вообщем старый кусок кода!
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:23) [31]

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

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


 
markers ©   (2006-09-09 03:39) [32]

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


 
Джо ©   (2006-09-09 03:50) [33]

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

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


 
markers ©   (2006-09-09 04:21) [34]

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


 
Loginov Dmitry ©   (2006-09-09 09:31) [35]

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


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


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


TDBGrid


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


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


 
GrayFace ©   (2006-09-12 20:54) [36]

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


 
Virgo_Style ©   (2006-09-12 23:22) [37]

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



Страницы: 1 вся ветка

Текущий архив: 2006.10.01;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.036 c
9-1136425899
-=Nuke=-
2006-01-05 04:51
2006.10.01
Как Free Form сама грузит текстуры из GLMAterialLibrary ?


15-1158126179
Dima L
2006-09-13 09:42
2006.10.01
delphi 10 lite


2-1158054701
zdm
2006-09-12 13:51
2006.10.01
C++


2-1158069501
A1ex
2006-09-12 17:58
2006.10.01
Как подключиться к базе...


15-1157874177
Сергуня
2006-09-10 11:42
2006.10.01
Так к слову