Форум: "Компоненты";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];
ВнизМножество компонентов в одном контейнере. Как делать? Найти похожие ветки
← →
MegaVolt © (2005-10-05 11:11) [0]Есть задача на одном поле отображать и управлять множеством объектов. Каждый объект представляет собой некий прямоугольничек со своими данными, своей реакцией на клики и пр... Как реализовывают такие вещи?
Пока есть идея делать так: Tlist хранящий все объекты. Далее по нажатию на поле хранящее все обекты пробегать по списку и проверять на какой элемент нажали. Точно так же и при отрисовке проверяю по списку кто виден и отображать.
Правильно ли я мыслю. И где можно почитать про то как делать такие вещи?
← →
Igorek © (2005-10-05 11:52) [1]
> Правильно ли я мыслю. И где можно почитать про то как делать
> такие вещи?
Неправильно. :)
> Далее по нажатию на поле хранящее все обекты пробегать по
> списку и проверять на какой элемент нажали. Точно так же
> и при отрисовке проверяю по списку кто виден и отображать.
С контролами это все делает VCL.
← →
MegaVolt © (2005-10-05 12:17) [2]> С контролами это все делает VCL.
Я слышал что есть проблемы если наплодить множество контролов. Т.е. 100-200 штук и будут тормоза. :( Или я не прав?
Как тогда лучше делать и где про это можно почитать? Хотя бы краткий алгоритм действия.
← →
Юрий Зотов © (2005-10-05 14:09) [3]> MegaVolt
> TList хранящий все объекты.
Не нужен, потому что уже есть списки Components и Controls.
> по нажатию на поле хранящее все обекты пробегать по списку
> и проверять на какой элемент нажали.
Не надо, потому что уже есть событие OnClick, а у его обработчика есть Sender.
> Точно так же и при отрисовке проверяю по списку кто виден и
> отображать.
Проверять по списку ничего не надо (прчину см. выше). Вместо Visible удобнее оперировать с Color и ParentColor (тогда вся обработка делается в одном OnClick).
> Я слышал что есть проблемы если наплодить множество контролов.
> Т.е. 100-200 штук и будут тормоза.
К сожалению, среди начинающих программистов довольно много чайников, мнящих себя крутыми авторитетами. Меньше их слушайте, а больше читайте книжек и экспериментируйте на практике. При 100-200 контролов не будет никаких тормозов - если, конечно, Вы сами не напишете тормозной код (в примере кода ниже их тысяча и никаких проблем). Более того, не будет тормозов даже и при нескольких десятках тысяч контролов. Другое дело, что на несколько десятков тысяч контролов может не хватить ресурсов GDI (особенно, в линейке 9х) и тогда создать такое количество контролов просто не удастся - но до тех пор, пока их вообще удается создать, никаких тормозов не будет, сколько бы их ни было создано (опять же - если, конечно, Вы сами не напишете тормозной код).
const
Size = 25;
HorzCount = 40;
VertCount = 25;
type
TYzRect = class(TWinControl)
public
constructor Create(AOwner: TComponent); override;
property Color default clRed;
property Height default Size;
property Width default Size;
property OnClick;
end;
TYzRectContainer = class(TWinControl)
private
procedure ClickHandler(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
published
property Height default Size * VertCount;
property Width default Size * HorzCount;
end;
{ TYzRect }
constructor TYzRect.Create(AOwner: TComponent);
begin
inherited;
SetBounds(Left, Top, Size, Size);
Color := clRed
end;
{ TYzRectContainer }
procedure TYzRectContainer.ClickHandler(Sender: TObject);
begin
with Sender as TYzRect do
if Color = clRed then
ParentColor := True
else
Color := clRed
end;
constructor TYzRectContainer.Create(AOwner: TComponent);
var
i, j: integer;
begin
inherited;
SetBounds(Left, Top, Size * HorzCount, Size * VertCount);
for i := 0 to HorzCount - 1 do
for j := 0 to VertCount - 1 do
with TYzRect.Create(Self) do
begin
Parent := Self;
SetBounds(Size * i, Size * j, Width, Height);
OnClick := ClickHandler
end
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
TYzRectContainer.Create(Self).Parent := Self
end;
> где можно почитать про то как делать такие вещи?
В любой приличной книжке по Delphi, а для начала - здесь:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=342
← →
MegaVolt © (2005-10-05 14:58) [4]Юрий Зотов спасибо за пример.
>При 100-200 контролов не будет никаких тормозов - если, конечно, Вы сами не напишете тормозной код (в примере кода ниже их тысяча и никаких проблем)
На что обратить внимание при написании кода? Чтобы не было тормозов?
>Вместо Visible удобнее оперировать с Color и ParentColor
Мои объекты несколько сложнее просто закрашенного квадрата. Т.е. каждый содержит рамочку, несколько надписей несколько индикаторов... Т.е. просто цветом я похоже не отделаюсь.
>Другое дело, что на несколько десятков тысяч контролов может не хватить ресурсов GDI (особенно, в линейке 9х)
C этим я похоже и столкнулся :( При запуске вашей программы запустить что либо ещё невозможно ругается что нехватает памяти. А работать нужно и в 98 тоже :(
Есть ли ещё методы кроме как самому повторить механизмы про которые я писал выше рисуя на одной канве.
← →
Юрий Зотов © (2005-10-05 16:01) [5]> MegaVolt © (05.10.05 14:58) [4]
> На что обратить внимание при написании кода? Чтобы не было тормозов?
Все как обычно - минимум циклов, их оптимизация, кэширование свойств объектов, generic-переменные, передача параметров через регистры (если нужно - с описателем var или const), поменьше VCL и побольше прямого WinAPI - и пр., и пр.
> А работать нужно и в 98 тоже
Попробуйте поступить проще, не создавая кучи объектов: возьмите обычный TDrawGrid и в его ячейках (в OnDrawCell) рисуйте все, что угодно.
← →
MegaVolt © (2005-10-05 16:05) [6]>Попробуйте поступить проще, не создавая кучи объектов: возьмите обычный TDrawGrid и в его ячейках (в OnDrawCell) рисуйте все, что угодно.
Но тогда все элементы будут одинаковыми по размерам и дискретные по положению. А хотелось бы чтобы их можно было перетаскивать куда угодно и размер был разным.
← →
MegaVolt © (2005-10-05 16:10) [7]Удалено модератором
Примечание: Дубль
← →
MegaVolt © (2005-10-05 16:11) [8]Удалено модератором
Примечание: Дубль
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.038 c