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

Вниз

Ошибка при проверке типа   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.155 c
1-1086346210
killer
2004-06-04 14:50
2004.06.20
Кнопочка в StringGrid


3-1085629459
Victor_A
2004-05-27 07:44
2004.06.20
Вопрос По Fastreport V.2.52


14-1086252507
Igorek
2004-06-03 12:48
2004.06.20
Физический серийный номер винта


3-1085494091
Tom
2004-05-25 18:08
2004.06.20
TADOQuery.LoadFromFile


1-1086096414
Kiloper
2004-06-01 17:26
2004.06.20
DranDrop для TLabel