Форум: "Основная";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
Внизпроблемы с 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.039 c