Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проблемы с AV при вызове Procedure Of Object [D7, Win2k]


Страницы:   1 2

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)
> не поможет?

нет


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо