Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.036 c
1-1106050411
ShimON
2005-01-18 15:13
2005.01.30
MD5???


1-1105963397
Zloy
2005-01-17 15:03
2005.01.30
Как вызвать стандартный выбор каталога


1-1105699329
Варава
2005-01-14 13:42
2005.01.30
QuickReport и длинные поля.


4-1102257133
Леонид
2004-12-05 17:32
2005.01.30
Отлов открытия папки файла!!!


3-1103802934
ShotGuN
2004-12-23 14:55
2005.01.30
Как добавить несколько строк одновременно?





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