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

Вниз

Обращение к объекту.   Найти похожие ветки 

 
Maxim____M   (2005-01-10 17:17) [0]

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

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

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

end;

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


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

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


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

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

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

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


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

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


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

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.


 
Maxim____M   (2005-01-11 11:57) [5]

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


 
Fay ©   (2005-01-11 12:09) [6]

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


 
ЮЮ ©   (2005-01-12 05:30) [7]

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

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

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


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

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

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

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


 
PVOzerski ©   (2005-01-12 12:07) [9]

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


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

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

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


 
KSergey ©   (2005-01-12 13:08) [11]

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

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


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

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


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

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

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


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

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


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

Александр Иванов ©   (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";

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


 
begin...end ©   (2005-01-14 16:27) [15]

> [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.

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


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

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


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

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

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

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

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

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


 
begin...end ©   (2005-01-15 20:44) [18]

> [17] Maxim____M   (15.01.05 20:39)

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

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

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

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

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


 
begin...end ©   (2005-01-15 20:45) [19]


> Integer(TButton)

Integer(Button)



Страницы: 1 вся ветка

Текущий архив: 2005.01.30;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.027 c
3-1103906893
Russko
2004-12-24 19:48
2005.01.30
Paradox в InterBase


1-1105918922
VAmpiru$
2005-01-17 02:42
2005.01.30
Как на паскале создать безразмерный файл?


14-1105608489
DiamondShark
2005-01-13 12:28
2005.01.30
Проверь свою политическую грамотность!


3-1104062538
Alex_S
2004-12-26 15:02
2005.01.30
Странности DBGrid при работе с InterBase


1-1105965427
pasha_golub
2005-01-17 15:37
2005.01.30
Принцип работы TDataset.Locate