Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Ошибка


Автор: Spawn 18.1.2003, 08:35
Я где-то неделю не открывал один свой проект и сейчас, откомпилив его, мне стало выдавать Access Violetion при его закрытии((((
При обработке сообщения WM_MOVING второе окно вообще стало исчезать:

procedure TForm1.Moving(var Msg:TMessage);
begin
Form2.Left:=Form1.Left-Form2.Width-10;
Form2.Top:=Form1.Top+WndCaptionHeight;
end;

Вроде все предельно просто, но второго окна нет( При начале перетаскивания окна оно исчезает.
Я попробовал создать заново exe-шник, но при удалении старого пишет, что он не найден. Можно ли как нить его полностью создать заново?
Я подменил текущий exe-файл другим(та же самая прога, но он у меня был сохранен в отдельной папке) и у меня исчезла Access Violetion и второе окно стало перемещаться вместе с основной формой, но при закрытии приложения Дельфи открывает CPU с ошибкой:
Project ... raised too many consecutive exceptions:'access violetion at 0x00403192: read of addres 0x00a12620'

И показывает сюда:
00403192  8B08  mov,ecx,[eax]

Подскажите, пожалста, в чем может быть дело и что мне желательно сделать? Для меня это очень важно! Заранее спасибо.

Автор: Vit 18.1.2003, 14:54
Стереть все файлы DCU, DSK. Затем открыть проект и выполнить "Build All"

Автор: Spawn 18.1.2003, 16:37
Цитата(Vit @ 18.1.2003, 06:54)
Стереть все файлы DCU, DSK. Затем открыть проект и выполнить "Build All"

Непомоголо( Все равно выдает Access Violetion.

Автор: stab 18.1.2003, 19:30
попробуй
if Form2 <> nil
и еще попробуй SetWindowPos

Автор: Spawn 18.1.2003, 22:11
Ошибка Access Violetion возникает при закрытии формы и Дельфи открывает CPU. Причем это видимо связано с освобождением ресурсов, поскольку блок в CPU начинатся так

TObject.Free
......
......
......
......
00403192  8B08  mov,ecx,[eax] //сдесь останавливается курсор
......
......

Автор: Vit 19.1.2003, 00:44
Такие ошибки очень трудны в отладке, лучше принести код или прислать кому-то знающему, у меня так было когда в одном из виртуальных деструкторов не было указание на родительский деструктор, а экземпляры класса несколько раз создавались и разрушались. Простой трассировкой ошибки ты ничего не найдёшь. Обычная причина - неправильное распределение памяти где-то в коде, неправильное освобождение памяти, неправильное разрушение объектов, выход за пределы массива, неправильные вызовы DLL и т.п. Совет будет такой - скопируй проект, и начинай удалять из него формы, компоненты, процедуры - по маленьку, и проверяй, как исчезнет ошибка - значит глюк в соответственном куске кода.

Автор: Spawn 19.1.2003, 02:01
Все это правильно, но вся странность в том, что у меня все прекрасно работало и я ни чего не изменял, как вдруг начало глючить((((( Буду пробовать искать.

Автор: Vit 19.1.2003, 02:23
Это как раз не странно - смотри, неправильно вызывается деструктор, далее есть вероятность того что в памяти которая числится как освобождённая, но на самом деле содержит нужную инфу, создаётся другой объект. Теперь при обращении к памяти возможен вариант что там содержится вовсе не то что ожидалось. Процесс размещения объектов в памяти динамический, так что всегда есть вероятность, что всё проскочит нормально - просто "неправильная" память не будет повторно использована, и внешне всё будет нормально, но вот ты добавил одну совершенно не значащую строку в программу, абсолютно безопастную типа "a:=3", и размещение объектов немного "сдвинулось" и теперь неправильные манипуляции с памятью "затирают" что-то нужное.

Автор: Spawn 22.1.2003, 07:32
Спасибо большое! Я нашел ошибку, только вот не совсем ее понял:
Раньше я делал так - загружал данные о настройке приложения из файла(через некоторое время начала появляться ошибка). Сейчас я достаю их из реестра:

LoadParam:array[1..5] of string[15];

try
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
if not Reg.OpenKey('SOFTWARE\MySoft\MyProgram',False) then
  begin
   Reg.CreateKey('SOFTWARE\MySoft\MyProgram');
   SetRegDefaultValues(Reg);
  end;
  try
   Val:=TStringList.Create;
   Reg.GetValueNames(Val);
   for i:=0 to Val.Count-1 do
    LoadParam[i+1]:=Reg.ReadString(Val.Strings[i]);
  finally
   Val.Free;
  end;
finally
Reg.Free;
end;

При загрузке данных первый элемент массива получает IP-адрес(в string-овом типе) и он, вроде, загружается нормально(я проверил, подставив ShowMessage(LoadParam[1]) на этапе загрузки значений), но после появления формы(визуально) значение меняется на какие-то иероглифы и если обратиться к ShowMessage то на экране появляется сообщение длинной, превышающей размер длины экрана, и заполненное пустыми символами. Из за чего ето может быть?

Автор: =Vit= 23.1.2003, 01:04
Где стоит объявление "LoadParam:array[1..5] of string[15];"?

Автор: Spawn 23.1.2003, 02:11
Это глобальная переменая в отдельном юните.

Автор: SkyDaemon 23.1.2003, 02:50
Попробуй объявить её как поле какой-нибудь формы

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)