Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.10;
Скачать: CL | DM;

Вниз

проблемы с AV при вызове Procedure Of Object   Найти похожие ветки 

 
NewDelpher ©   (2004-09-24 11:03) [0]

Есть у меня два объекта Obj1 и Obj2, их классы  
TObj1 = class
procedure MyProc;
end;

TObj2 = class
Proc: Proceure of object;
end;

При некотором условии я делаю:
 Obj2.Proc := Obj1.MyProc

как потом мне проверить, передалась ли MyProc в объект Obj2 или нет, чтобы потом её вызвать? А то AV иногда возникает.


 
Sandman25 ©   (2004-09-24 11:04) [1]

Assigned(Obj2.Proc)


 
NewDelpher ©   (2004-09-24 11:19) [2]


> Sandman25 ©   (24.09.04 11:04) [1]
> Assigned(Obj2.Proc)

это же эквивалентно @Obj2.Proc <> nil? Эту проверку я делаю, а
вот в конструкторе Obj2 я пишу
Proc := nil
может надо @Proc := nil ?


 
Sandman25 ©   (2004-09-24 11:23) [3]

В конструкторе вообще не надо присваивать nil. Это происходит по умолчанию.


 
NewDelpher ©   (2004-09-24 11:37) [4]


> В конструкторе вообще не надо присваивать nil. Это происходит
> по умолчанию.

может, из-за этого и AV иногда появляется


 
Суслик ©   (2004-09-24 11:50) [5]


> может, из-за этого и AV иногда появляется

Может быть все, что угодно.
Но если учеть ту информацию, которую дал ты ответ такой - не может.


 
Суслик ©   (2004-09-24 11:51) [6]

Может у тебя obj1 уничтожается ДО вызова метода MyProc?
Тогда будет av


 
NewDelpher ©   (2004-09-24 12:05) [7]


> Может у тебя obj1 уничтожается ДО вызова метода MyProc?
> Тогда будет av

И что, в этом случае перед вызовом MyProc проверка Assigned(Obj2.Proc) не поможет?


 
Суслик ©   (2004-09-24 12:07) [8]


> И что, в этом случае перед вызовом MyProc проверка Assigned(Obj2.Proc)
> не поможет?

нет


 
NewDelpher ©   (2004-09-24 12:11) [9]

Суслик ©
а проверить это как? try..except?


 
Суслик ©   (2004-09-24 12:15) [10]


>  [9] NewDelpher ©   (24.09.04 12:11)
> Суслик ©
> а проверить это как? try..except?

Нет. Это сомнительный способ.

Вариант один - писать программу так, чтобы у тебя не возникало потребности проверять сомнительными способами.

Надеждный способ такой - assigned(obj2.proc). Естественно, что при этом кто-то в случае уничтожения Obj1 должен присвоить obj2.proc nil.


 
NewDelpher ©   (2004-09-24 12:25) [11]

значит, в деструкторе obj2 прописать proc := nil


 
NewDelpher ©   (2004-09-24 12:26) [12]

или @proc := nil?


 
Суслик ©   (2004-09-24 12:28) [13]


>  [12] NewDelpher ©   (24.09.04 12:26)
> или @proc := nil?

я всегда proc := nil пишу.


 
Суслик ©   (2004-09-24 12:30) [14]

@p := nil, компилятор хавает.
Я никогда не задавался воросом, что при этом делается.
Пиши p := nil и не одумляйся.


 
NewDelpher ©   (2004-09-24 12:35) [15]

То есть объект obj2 должен знать, когда уничтожится obj1?
Но у меня нет такой возможности... И почему try..except считаете ненадежным способом.


 
Sandman25 ©   (2004-09-24 12:39) [16]

NewDelpher

Вообще задача выглядит так, словно что-то неверно спроектировано. Почему возникает необходимость выполнения  Obj2.Proc := Obj1.MyProc?


 
Суслик ©   (2004-09-24 12:42) [17]


> И почему try..except считаете ненадежным способом.

Потому как av не обязан возникать каждый раз.


> Но у меня нет такой возможности

Значит все - труба.


 
NewDelpher ©   (2004-09-24 12:46) [18]

Sandman25 ©
у меня  есть объект-справочник, к которому обращяются другие объекты, при выборе элемента справочника, должны выполняться действия в этих объектах. Эти действия различны для каждого объекта и содержатся в процедуре MyProc, которая и передается.


 
Sandman25 ©   (2004-09-24 12:50) [19]

[18] NewDelpher ©   (24.09.04 12:46)

Тогда нужно предусмотреть в справочнике метод, который будет обнулять Proc, и вызывать его при удалении объекта, на метод которого ссылаемся.


 
NewDelpher ©   (2004-09-24 12:55) [20]


>
> Тогда нужно предусмотреть в справочнике метод, который будет
> обнулять Proc, и вызывать его при удалении объекта, на метод
> которого ссылаемся

В итоге obj2 должен "знать" обо всех объектах, которые его используют... Как-то некрасиво выглядит в контексте ООП.


 
Суслик ©   (2004-09-24 12:57) [21]


> Как-то некрасиво выглядит в контексте ООП.

Не думай об этом, тем более это не сооветсвует действительности.

Красота понятие относительное. Посмотри например на vcl - там компоненты знают друг о друге. И ничего, все довольны.


 
Sandman25 ©   (2004-09-24 14:08) [22]

[20] NewDelpher ©   (24.09.04 12:55)

В контексте OOP вообще нужно завести 2 метода: AddObjectListener и RemoveObjectListener :)


 
NewDelpher ©   (2004-09-24 15:08) [23]


>
> В контексте OOP вообще нужно завести 2 метода: AddObjectListener
> и RemoveObjectListener :)


и вести список объектов?
Ну тогда все мои объекты должны наслодоваться от одного класса, содержащего эти методы? Чтобы в конструкторе добавлять себя в список объектов, а в деструкторе удалять.


 
Sandman25 ©   (2004-09-24 15:12) [24]

[23] NewDelpher ©   (24.09.04 15:08)

Необязательно. Достаточно, чтобы все классы имплементировали некий интерфейс ObjectListenable :)

А если серьезно, то если Вы хотите сделать "красиво", то лучше начать все заново. Раньше надо было о красоте думать. Теперь лучше идти по пути наименьшего сопротивления.


 
Суслик ©   (2004-09-24 15:16) [25]


> Раньше надо было о красоте думать. Теперь лучше идти по
> пути наименьшего сопротивления.

Как сказал! Полность поддерживаю - пиши, чтобы работало - красиво в следующий раз сделаешь.

Главное помни, что ты должен реализовать нотификацию (информарование) всех объектов, которые имеют ссылки на объект, метод которого надо вызывать, о том, что объект уничтожается. Посмотри в исходниках класса TComponent как сделан метод Notification и родственные ему методы.


 
Sandman25 ©   (2004-09-24 15:19) [26]

NewDelpher

Вы хотите передать часть объекта куда-то для дальшейшего использования, потом удалить объект, никому об этом не сообщая о его смерти, а потом как-то проверить, жив ли объект. Нет, такое невозможно.


 
NewDelpher ©   (2004-09-24 15:19) [27]

Хорошо, спасибо за советы



Страницы: 1 вся ветка

Текущий архив: 2004.10.10;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.025 c
3-1095140839
snake1977
2004-09-14 09:47
2004.10.10
Добавление большого количества записей


4-1094644439
Apolo
2004-09-08 15:53
2004.10.10
Пару вопросов по потокам


3-1094721688
Loaders
2004-09-09 13:21
2004.10.10
DBGrid+DataSet


1-1095939520
Kniaz
2004-09-23 15:38
2004.10.10
Блокирование файла


3-1095167605
lehich
2004-09-14 17:13
2004.10.10
ADODataSet киньте примерчик