![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ускарение создание компонентов в RUN-TIME
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]
Я их при смене категории и т.д. освобождаю все.