Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Вниз

Ускарение создание компонентов в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.021 c
15-1158048270
Чапаев
2006-09-12 12:04
2006.10.01
Про BDS2006


2-1157898698
Juri
2006-09-10 18:31
2006.10.01
Обработка ошибок при отправлении E-Mail


2-1158250576
prodeximus
2006-09-14 20:16
2006.10.01
Чтение данных поля из БД


2-1158138732
Sirus
2006-09-13 13:12
2006.10.01
Очистка DBGRID-а


1-1156140355
5serg
2006-08-21 10:05
2006.10.01
Как зарегистрировать сервис в реестре Windows





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский