Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.034 c
14-1086314387
Kair
2004-06-04 05:59
2004.06.20


14-1086354506
Drakula
2004-06-04 17:08
2004.06.20
Подскажите программу...


14-1085639051
Романов Р.В.
2004-05-27 10:24
2004.06.20
Попробуем провести небольшую олимпиаду


1-1086174491
BestMaster
2004-06-02 15:08
2004.06.20
Ограничения на имена переменных ?


3-1085657800
Serg
2004-05-27 15:36
2004.06.20
Строка соединения для MS SQL Server 2000





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский