Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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.04 c
4-1137105249
Alexx2000
2006-01-13 01:34
2006.04.02
Как на Winapi программно нарисовать иконку и получить ее в виде hicon


2-1142407623
KyRo
2006-03-15 10:27
2006.04.02
TStringList


4-1137257101
Volf_555
2006-01-14 19:45
2006.04.02
Как создать прогу, которая помещала бы tray-иконки в себя?


2-1142337389
Emik
2006-03-14 14:56
2006.04.02
Interbase


15-1141668930
kaZaNoVa
2006-03-06 21:15
2006.04.02
InqSoft Neo Sign 0f Misery





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский