![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблемы с AV при вызове Procedure Of Object [D7, Win2k]
NewDelpher © (2004-09-24 11:03:00)Есть у меня два объекта Obj1 и Obj2, их классы
TObj1 = class
procedure MyProc;
end;
TObj2 = class
Proc: Proceure of object;
end;
При некотором условии я делаю:
Obj2.Proc := Obj1.MyProc
как потом мне проверить, передалась ли MyProc в объект Obj2 или нет, чтобы потом её вызвать? А то AV иногда возникает.
NewDelpher (2004-09-24 15:19:00) [1]Хорошо, спасибо за советы
Sandman25 (2004-09-24 15:19:00) [2]NewDelpher
Вы хотите передать часть объекта куда-то для дальшейшего использования, потом удалить объект, никому об этом не сообщая о его смерти, а потом как-то проверить, жив ли объект. Нет, такое невозможно.
Суслик (2004-09-24 15:16:00) [3]
> Раньше надо было о красоте думать. Теперь лучше идти по
> пути наименьшего сопротивления.
Как сказал! Полность поддерживаю - пиши, чтобы работало - красиво в следующий раз сделаешь.
Главное помни, что ты должен реализовать нотификацию (информарование) всех объектов, которые имеют ссылки на объект, метод которого надо вызывать, о том, что объект уничтожается. Посмотри в исходниках класса TComponent как сделан метод Notification и родственные ему методы.
Sandman25 (2004-09-24 15:12:00) [4][23] NewDelpher © (24.09.04 15:08)
Необязательно. Достаточно, чтобы все классы имплементировали некий интерфейс ObjectListenable :)
А если серьезно, то если Вы хотите сделать "красиво", то лучше начать все заново. Раньше надо было о красоте думать. Теперь лучше идти по пути наименьшего сопротивления.
NewDelpher (2004-09-24 15:08:00) [5]
>
> В контексте OOP вообще нужно завести 2 метода: AddObjectListener
> и RemoveObjectListener :)
и вести список объектов?
Ну тогда все мои объекты должны наслодоваться от одного класса, содержащего эти методы? Чтобы в конструкторе добавлять себя в список объектов, а в деструкторе удалять.
Sandman25 (2004-09-24 14:08:00) [6][20] NewDelpher © (24.09.04 12:55)
В контексте OOP вообще нужно завести 2 метода: AddObjectListener и RemoveObjectListener :)
Суслик (2004-09-24 12:57:00) [7]
> Как-то некрасиво выглядит в контексте ООП.
Не думай об этом, тем более это не сооветсвует действительности.
Красота понятие относительное. Посмотри например на vcl - там компоненты знают друг о друге. И ничего, все довольны.
NewDelpher (2004-09-24 12:55:00) [8]
>
> Тогда нужно предусмотреть в справочнике метод, который будет
> обнулять Proc, и вызывать его при удалении объекта, на метод
> которого ссылаемся
В итоге obj2 должен "знать" обо всех объектах, которые его используют... Как-то некрасиво выглядит в контексте ООП.
Sandman25 (2004-09-24 12:50:00) [9][18] NewDelpher © (24.09.04 12:46)
Тогда нужно предусмотреть в справочнике метод, который будет обнулять Proc, и вызывать его при удалении объекта, на метод которого ссылаемся.
NewDelpher (2004-09-24 12:46:00) [10]Sandman25 ©
у меня есть объект-справочник, к которому обращяются другие объекты, при выборе элемента справочника, должны выполняться действия в этих объектах. Эти действия различны для каждого объекта и содержатся в процедуре MyProc, которая и передается.
Суслик (2004-09-24 12:42:00) [11]
> И почему try..except считаете ненадежным способом.
Потому как av не обязан возникать каждый раз.
> Но у меня нет такой возможности
Значит все - труба.
Sandman25 (2004-09-24 12:39:00) [12]NewDelpher
Вообще задача выглядит так, словно что-то неверно спроектировано. Почему возникает необходимость выполнения Obj2.Proc := Obj1.MyProc?
NewDelpher (2004-09-24 12:35:00) [13]То есть объект obj2 должен знать, когда уничтожится obj1?
Но у меня нет такой возможности... И почему try..except считаете ненадежным способом.
Суслик (2004-09-24 12:30:00) [14]@p := nil, компилятор хавает.
Я никогда не задавался воросом, что при этом делается.
Пиши p := nil и не одумляйся.
Суслик (2004-09-24 12:28:00) [15]
> [12] NewDelpher © (24.09.04 12:26)
> или @proc := nil?
я всегда proc := nil пишу.
NewDelpher (2004-09-24 12:26:00) [16]или @proc := nil?
NewDelpher (2004-09-24 12:25:00) [17]значит, в деструкторе obj2 прописать proc := nil
Суслик (2004-09-24 12:15:00) [18]
> [9] NewDelpher © (24.09.04 12:11)
> Суслик ©
> а проверить это как? try..except?
Нет. Это сомнительный способ.
Вариант один - писать программу так, чтобы у тебя не возникало потребности проверять сомнительными способами.
Надеждный способ такой - assigned(obj2.proc). Естественно, что при этом кто-то в случае уничтожения Obj1 должен присвоить obj2.proc nil.
NewDelpher (2004-09-24 12:11:00) [19]Суслик ©
а проверить это как? try..except?
Суслик (2004-09-24 12:07:00) [20]
> И что, в этом случае перед вызовом MyProc проверка Assigned(Obj2.Proc)
> не поможет?
нет