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

Вниз

Множество компонентов в одном контейнере. Как делать?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
15-1141965621
Steepe Wolf
2006-03-10 07:40
2006.04.02
QuickReport для BDS 2006


4-1137145180
Asail
2006-01-13 12:39
2006.04.02
Вопрос по TOpenDialog


1-1141244466
fuzzy
2006-03-01 23:21
2006.04.02
Метод релаксации или Гаусса для системы линейных уранений


1-1140877094
Alex_C
2006-02-25 17:18
2006.04.02
Глобальная концепция программы - все в одном или...?


1-1141291631
oleg_
2006-03-02 12:27
2006.04.02
почему может не работать наезд на объект немодального окна