| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
Непомоголо( Все равно выдает 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 |
| Попробуй объявить её как поле какой-нибудь формы |