![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обращение к объекту. [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]Тут не несовершенство конструкции а полный .... :)