Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1095674525
}|{yk
2004-09-20 14:02
2004.10.10
Ничего себе ошибка!


1-1095961383
Роман
2004-09-23 21:43
2004.10.10
String -> Char


3-1094728587
Yurko
2004-09-09 15:16
2004.10.10
Объединение таблиц по нескольким полям


4-1094282632
Интель
2004-09-04 11:23
2004.10.10
Убить explorer.exe без восстановления


4-1093868502
Ascan
2004-08-30 16:21
2004.10.10
Как на экране "подвинуть" чужое Окно?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский