Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обращение к объекту. [D7, WinXP]


Maxim____M ©   (2005-01-10 17:17:00) 

Есть массив объектов.
Объект содержит панель, а панель кнопки, и проч контролы.

при создании
constructor myobject.create();
.......
tpanel().tag:=integer(self);
.......

таким образом кнопки добираются до объекта
tbutton.onClick
begin
myobject(tcontrol(sender).parent.tag).DoSmth

end;

когда обращался так с локальной формы всё было хорошо,
теперь, заготовки объектов разбросаны
по разным формам, и это перестало работать.
В чём несовершенство конструкции?


begin...end   (2005-01-15 20:45:00) [1]


> Integer(TButton)

Integer( Button)


begin...end   (2005-01-15 20:44:00) [2]

> [17] Maxim____M   (15.01.05 20:39)

> если бы вы прочитали всю тему а не только четырнадцатое
> сообщение, то поняли бы чем плох.

Я прочитал всю тему, но так и не понял, что и зачем Вы хотите сделать.

> В tcontrol().tag можно засунуть пару дескрипторов.

В TControl.Tag можно засунуть целый объект, причём любой:

var
 Button: TButton;
begin
 MyControl.Tag := Integer(TButton)
end.


Maxim____M   (2005-01-15 20:39:00) [3]

begin...end ©   (14.01.05 16:27) [15]

чем плох? понятно чем плох. если бы вы прочитали всю тему а не только четырнадцатое сообщение, то поняли бы чем плох.

В tcontrol().tag можно засунуть пару дескрипторов. а как вы предлагаете, придётся писать тьму наследников и добавлять им поля
tbutton, tcontrol, etс.  кому это надо?

Anatoly Podgoretsky ©   (14.01.05 16:30) [16]

Спасибо за помощь, пожелание о том что чем дальше тем хуже мне конечно очень помогло.
Какой ущербности?


Anatoly Podgoretsky   (2005-01-14 16:30:00) [4]

Ты уже запутался, из-за ущербности подхода. Дельше будет только хуже.


begin...end   (2005-01-14 16:27:00) [5]

> [14] Maxim____M   (14.01.05 16:23)

> var ibtn:integer;
> pbtn:^tbutton;
> begin
>
> ibtn:=integer(button1);
> tbutton(ibtn).Caption:='abc';

var
 Btn: TButton;

begin
 Btn := button1;
 ...
 Btn.Caption := 'abc'
end.

Чем плох такой вариант?


Maxim____M   (2005-01-14 16:23:00) [6]

Александр Иванов ©   (12.01.05 13:12) [12]

KSergey ©   (12.01.05 13:08) [11]
Мой вопрос уже второй день без полного ответа висит :)

я не хочу выкидывать много кода, чтобы не запутать. мне кажется, что того что я рассказал достаточно для того чтобы посоветовать какое-нибудь средство автоматизации работы с морем объектов.
я, честно говоря, уже хочу для каждого объекта не только комменты писать, а своего рода интерактивный help и визуализацию их взаимосвязей.
Пытался провернуть реверс инжиниринг в ModelMaker,
но он, почему-то, берёт какую-то ничтожную часть.
Может быть есть среды, где больше встроенных возможностей работы с объектами? Там, MSVS, например?
--------------------------------------------------
>>Какой на.. дескриптор?! Оно (это поле) должно хранить УКАЗАТЕЛЬ на >>ассациированный с ним Node.

var ibtn:integer;
pbtn:^tbutton;
begin

ibtn:=integer(button1);
tbutton(ibtn).Caption:='abc';

pbtn:=@button1;
tbutton(pbtn^).Caption:='abc';

мне кажется что первый способ(с дескриптором) несколько изящнее,
и проще, не надо никаких лишних переменных типизированных указателей, хорошо когда пример такой простой, а когда переменную извлекаешь неизветсно откуда и неизвестно как, тут надо кучу лишних переменных типизированных пойнтеров заводить..


Eraser   (2005-01-12 13:42:00) [7]

>> Есть массив объектов.
Объект содержит панель, а панель кнопки, и проч контролы.

при создании
constructor myobject.create();
.......
tpanel().tag:=integer(self);


И всё винавата ущербность конструкции вцелом.

>> у объекта есть поле tn {ttreenode} и оно хранит дескриптор ассоциированого с ним нода
Какой на.. дескриптор?! Оно (это поле) должно хранить УКАЗАТЕЛЬ на ассациированный с ним Node.


Александр Иванов   (2005-01-12 13:12:00) [8]

KSergey ©   (12.01.05 13:08) [11]
Мой вопрос уже второй день без полного ответа висит :)


KSergey   (2005-01-12 13:08:00) [9]

> [10] Maxim____M   (12.01.05 13:03)
> Но тут то и возникают AV при
> обращении, и непонятно почему.

Потому что data не инициализировано должным образом.
А исходной задумки я тоже нифига не понял.
Можно, отвлекшись от конкретной реализации, пояснить что хочется получить?


Maxim____M   (2005-01-12 13:03:00) [10]

Немного отвлекусь на похожую проблему.

ситуация такая: есть море объектвов и много treeView на форме,
все эти объекты взаимодейтсвуют, изменяются, вообщем кишит жизнь.
Работа с объектами ведётся посредством
tobject(ttreeNode().data).doAction
т.е. у каждой treenode есть data типа pointer и всё прекрасно работает.
теперь есть необходимость и обратной связи
у объекта есть поле tn {ttreenode} и оно хранит дескриптор ассоциированого с ним нода. Но тут то и возникают AV при обращении, и непонятно почему.


PVOzerski   (2005-01-12 12:07:00) [11]

Может, обращения к элементам другой формы у тебя получаются до того, как эта форма создана?


Maxim____M   (2005-01-12 11:27:00) [12]

небезобасно. а вдруг у sender-а parent-ом окажется не та самая панель

:) Не понял, как это не та самая? Их несколько и они вполне конкретны все.

Именно AV и вылезает, т.е. не работает ничего.


ЮЮ   (2005-01-12 05:30:00) [13]

>когда обращался так с локальной формы всё было хорошо,
теперь, заготовки объектов разбросаны
по разным формам, и это перестало работать.

Что значит перестало? Должно или работать или ошибки вылезать. Просто перестать не может

>В чём несовершенство конструкции?
небезобасно. а вдруг у sender-а parent-ом окажется не та самая панель. Тогда tag = 0, а  myobjectsArray[tcontrol(sender).tag)] = nil, но это должно приводить к АV, а не просто не работать


Fay   (2005-01-11 12:09:00) [14]

Tag использовать можно. Только не понятно, какую именно цель ты преследуешь. Отвлекись от писанины, да сядь и порисуй на бумажке - должно помочь.


Maxim____M   (2005-01-11 11:57:00) [15]

скажите же кто-нибудь.
почему нельзя записывать дескриптор в integer, и почему это приводит к ошибкам.


Maxim____M   (2005-01-10 18:54:00) [16]

to Александр Иванов ©   (10.01.05 17:40) [3]

Спасибо за внимание.

я уже попытался раскрыть всё в первом посте. Объект имеет тип tpersistent и имеете множество сложных структур. У него так же есть поле panel. Отображаю множество объектов в виде панелей на которых images, buttons, etcСontrols. Манипулирование объектом производится посредством контролов. Раньше я записывал в св-во tag контрола номер объекта в массиве и обращался к нему так.

tcontrol.onClick
begin
myobjectsArray[tcontrol(sender).tag)].DoSmth
...
теперь из-за усложнения, так делать нельзя, надо хранить прямую ссылку, т.е. дескриптор.
Можно конечно расплодить наследников, и дать им поле типа tmyobject, но почему нельзя использовать для этого tag?
Физически дескриптор тот же integer.


Александр Иванов   (2005-01-10 17:40:00) [17]

Вы используете странное преобразование типов, зачем указатель на объект хранить в целочисленной переменной и вообще какова цель этих телодвижений? Если вы раскроете цель можно будет дать более качественный совет.


Maxim____M   (2005-01-10 17:27:00) [18]

это я вижу, если бы это было не так, я не писал бы сюда.

но ведь работает же

var
i:integer
begin
i:=integer(tobject);
tobject(i).DoWhateverYouWant


Александр Иванов   (2005-01-10 17:21:00) [19]

Тут не несовершенство конструкции а полный .... :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо