Форум: "Основная";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
ВнизОшибка при проверке типа Найти похожие ветки
← →
Maxud © (2004-06-05 13:10) [0]Всем привет! Подскажите, пожалуйста, чем это МОЖЕТ быть вызвано:
var sobj: TObject;
...
if (sobj <> nil) and (sobj is TStrings) then
На этой строке вываливается "AV at address ... in module ... Read of address FFFFFEA0" (адрес все время разный).
При трассировке с "use debug dcu"s" видно, что _IsClass отрабатывает нормально (возвращает true), после нее вызываетсяprocedure _LStrClr(var S);
, которая ничего не делает в моем случае, но при выходе из нее я оказываюсь на последней строкеfunction GetExceptionObject(P: PExceptionRecord): Exception;
, причем Result этой функции уже содержит сообщение об AV.
Хоть какие-нибудь предположения есть? Если мало информации, скажите - опишу подробнее.
← →
user_1 (2004-06-05 13:19) [1]if (sobj <> nil) then if (sobj is TStrings) then
← →
Gero © (2004-06-05 13:22) [2]{$B-}
← →
Алхимик © (2004-06-05 13:23) [3]
var sobj: TObject;
...
if (sobj <> nil) and (sobj is TStrings) then
Проверил при созданном и не созданном sobj. Не ругается.
М.б. Reset поможет?
Бывает что при жестокой отладке глючного кода такое возникает, снятие программы по Сtrl+F2 и все такое.
← →
Maxud © (2004-06-05 13:32) [4]
> user_1 (05.06.04 13:19) [1]
> if (sobj <> nil) then if (sobj is TStrings) then
При отключенном Complete boolean eval, по идее, происходит то же самое. Не помогло.
> Gero © (05.06.04 13:22) [2]
> {$B-}
:((
Остается
> Алхимик © (05.06.04 13:23) [3]
> М.б. Reset поможет?
← →
Anatoly Podgoretsky © (2004-06-05 13:35) [5]Вероятнее ошибка происходит не здесь
← →
Девушка (2004-06-05 13:46) [6]if (sobj <> nil) and (sobj.classname=TStrings) then
← →
Maxud © (2004-06-05 13:48) [7]Reset не помог :)
Вобщем, этот код вызывался в OnDestroy формы и sobj - один из ее компонентов (Memo). Перенес вызов в OnClose - ошибка пропала.
← →
Gero © (2004-06-05 13:48) [8]
> Maxud © (05.06.04 13:32)
Покажите строку, расположенную выше приведенной.
← →
Алхимик © (2004-06-05 13:49) [9]
> [6] Девушка (05.06.04 13:46)
Провокация.
← →
Maxud © (2004-06-05 13:53) [10]
> Девушка (05.06.04 13:46) [6]
Странно, в этом месте отладчик показывает, что sobj.ClassName - inaccessible value. А sobj = (). Ну и error, конечно.
← →
Девушка (2004-06-05 13:57) [11]Maxud © (05.06.04 13:53) [10]
А showmessage(sobj.ClassName)?
← →
Maxud © (2004-06-05 13:59) [12]
var
obj: TComponent;
f, c, p, s: string;
pi: PPropInfo;
sobj: TObject;
...
obj := TComponent(FSavedProps.Objects[i]);
if obj <> nil then
begin
pi := GetPropInfo(obj, p);// p = "Value";
if pi <> nil then
begin
sobj := TObject(GetOrdProp(obj, pi));
if (sobj <> nil) and (sobj is TStrings) then...
В данном случае проверяется компонент RxSpinEdit.
← →
Девушка (2004-06-05 14:04) [13]
> begin
> sobj := TObject(GetOrdProp(obj, pi));
showmessage(sobj.ClassName);// что пишет?
> if (sobj <> nil) and (sobj is TStrings) then...
← →
Maxud © (2004-06-05 14:04) [14]
> Девушка (05.06.04 13:57) [11]
> Maxud © (05.06.04 13:53) [10]
> А showmessage(sobj.ClassName)?
AV в этой строке.
То есть как-будто объекта нет, а указатель <> nil.
← →
Anatoly Podgoretsky © (2004-06-05 14:06) [15]Maxud © (05.06.04 13:48) [7]
Это подтверждает, что ошибка в другом месте.
← →
Maxud © (2004-06-05 14:09) [16]
> Anatoly Podgoretsky © (05.06.04 14:06) [15]
Что ж, буду искать.
← →
Maxud © (2004-06-05 14:34) [17]Упс, рано обрадовался.
> Maxud © (05.06.04 13:48) [7]
> Reset не помог :)
>
> Вобщем, этот код вызывался в OnDestroy формы и sobj - один
> из ее компонентов (Memo). Перенес вызов в OnClose - ошибка
> пропала.
У меня оказывается OnClose вообще не вызывается, поэтому и ошибки нет.
Наверное нужно еще прояснить ситуацию. Делаю компонент сохранения настроек формы fmSettings. Форма вторичная, вызывается из программы, "сидящей" в трее, при закрытии она просто прячется, а разрушается при вызове Application.Terminate.
Мой компонент лежит на этой форме, при OnCreate настройки загружаются, при OnDestroy (как было) сохраняются. Вот тут-то все и происходит...
← →
Maxud © (2004-06-05 14:42) [18]Такое может быть:
var
obj: TComponent;
...
//FSavedProps - TStringList
obj := TComponent(FSavedProps.Objects[i]);
showmessage(obj.ClassName);
В отладчике: obj = (FComponentStyle:[csInheritable]),
а obj.ClassName = inaccessible value
??
← →
KSergey © (2004-06-05 14:56) [19]> Maxud © (05.06.04 14:04) [14]
> То есть как-будто объекта нет, а указатель <> nil.
Так в этом-то и дело, особенно глядя на "address FFFFFEA0" - именно это и приходит на ум.
А с чего вы решили, что указатель (ссылка) на несозданный объект будет равна nil?? Этого никто не обещал в общем случае. Об этом скорее всего надо позаботиться самостоятельно. (В частности свойство FSavedProps.Objects[i] для новых элементов никто за вас обнулять ("обниливать") по умолчанию не будет.)
← →
Maxud © (2004-06-05 15:19) [20]Перед вызовом приведенной функции (см. выше) у меня выполняется следующий код:
procedure TFormSaver.UpdateObjList;
var i: integer;
f, c, p: string;
cmp: TComponent;
begin
if FSavedProps <> nil then
for i := FSavedProps.Count-1 downto 0 do
if ParseItem(FSavedProps[i], f, c, p) then
begin
cmp := Owner.FindComponent(c);
if cmp <> nil then
FSavedProps.Objects[i] := cmp else
FSavedProps.Delete(i);
end;
end;
То есть объекты, которые не находятся с пом. FindComponent просто удаляются из списка.
← →
Maxud © (2004-06-07 08:32) [21]Вобщем нашел я ошибку, причина крылась во мне, как ни печально.
var
obj: TComponent;
f, c, p, s: string;
pi: PPropInfo;
sobj: TObject;
...
obj := TComponent(FSavedProps.Objects[i]);
if obj <> nil then
begin
pi := GetPropInfo(obj, p);// p = "Value";
if pi <> nil then
begin
sobj := TObject(GetOrdProp(obj, pi));
if (sobj <> nil) and (sobj is TStrings) then...
Код выполняется в цикле, который перебирает компоненты в списке, в строкеsobj := TObject(GetOrdProp(obj, pi))
получаем значение очередного свойства и выполняем приведение к типу TObject. Когда Kind свойства равен tkClass, то проблем не возникает, проблема в том, что большинство свойств имеют простые типы (Integer, Boolean...) и в sobj попадает мусор (значения этих свойств). Отсюда и AV.
Спасибо всем, кто пытался помочь.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.035 c