Форум: "Основная";
Текущий архив: 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