Форум: "Начинающим";
Текущий архив: 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.013 c