Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Глюк при вызове функции [D6, Win95/98]


Страницы:   1 2

Жорик ©   (2004-07-20 11:39:00) 

По FormActivate вызывается функция типа String и переодически(!)
при ее вызове происходит ошибка EAccessViolation.
В самой функции ошибок нет и она выполняется от начала до конца.
К тому же если бы в функии была ошибка, то она проявлялась постоянна, а не от случая к случаю.
С чем может связана эта ошибка?
Заранее спасибо!


Суслик   (2004-07-20 14:26:00) [1]

согласен


Anatoly Podgoretsky   (2004-07-20 14:25:00) [2]

Отсутствия знания ведет к AV


Суслик   (2004-07-20 14:16:00) [3]


> при неопределенном состоянии этого ImgRes

это если при неопределенном.
мы то не знаем - определенное состояние или нет.


Жорик   (2004-07-20 13:52:00) [4]

Проблема по-видимому была именно с динамеческим массивом.
После того, как исправил DataFileBuf[1] на DataFileBuf[0], ошибка
больше не повторялась.
Всем спасибо!


Anatoly Podgoretsky   (2004-07-20 13:35:00) [5]

В случае возникновения ошибки при TResourceStream.Create будет в обязательном порядке вызвано ImgRes.Free; при неопределенном состоянии этого ImgRes


Суслик   (2004-07-20 13:16:00) [6]


> Забавно ты используешь try...finally

не красиво, но в данном случае, может быть и правильно, т.к. где описана ImgRes не видно - вполне может быть, что он и очищает ее в  nil :)))


stone   (2004-07-20 13:13:00) [7]


> try
> ImgRes :=TResourceStream.Create(hInstance,ImgResName[Random(4)],RT_RCDATA);//извлекаем
> случайный
>           //ресурс картинки
> ImgRes.SaveToFile(ImageFile);//сохраняем в файл      
> finally
> ImgRes.Free;
> end;


Забавно ты используешь try...finally


Digitman   (2004-07-20 13:09:00) [8]


> Насколько я помню если с 0 компилятор начинает ругаться


с какого перепугу он начнет "ругаться", если массив формируется в ран-тайм?


Суслик   (2004-07-20 12:55:00) [9]


> А это может быть как-то связано с ошибкой?

еще как


Жорик   (2004-07-20 12:53:00) [10]

c какого перепугу индексация эл-тов дин.массива у тебя начинается с единицы ?</>
Насколько я помню если с 0 компилятор начинает ругаться.
А это может быть как-то связано с ошибкой?


Digitman   (2004-07-20 12:50:00) [11]


> Жорик


c какого перепугу индексация эл-тов дин.массива у тебя начинается с единицы ?


Жорик   (2004-07-20 12:28:00) [12]

Функция выполняется полностью и "упаковывает" файл вполне успешно. А Randomize я просто забыл написать она вызывается перед строкой ImageFile :=CurDir+'\'+Img00'+IntToStr(Random(10))+'.jpg'


clickmaker   (2004-07-20 12:21:00) [13]

Randomize вызвал перед Random?
Проверь еще ImgRes <> nil


Суслик   (2004-07-20 12:18:00) [14]

я не буду это даже смотреть.
я что - сам должен выравнивание по левому краю делать?


Жорик   (2004-07-20 12:15:00) [15]

функия прячет в конец картинки указанный файл (параметр strFileName) и добавляет 2
байта информации о размере картинки в конец файла для того, чтобы в дальнейшем добавленный файл
можно было извлечь из картинки.
Картинки являются ресурсами "вшитыми" в программу и извлекаются случайным образом. Всего 4
картинки.
При вызове этой функции, как я говорил, возникает ошибка EAccessViolation

function WriteFileToImage(strFileName:String):String;
const
ImgResName:array[0..3] of String =('Img1','Img2','Img3','Img4');//имена ресурсов картинок
var
DataFileBuf:array of Byte;
ImageLen:Word;
DataFileLen:DWORD;
ImageFile:String;
FD,ImgF:File;
CurDir:String;
begin
GetDir(0,CurDir);
ImageFile :=CurDir+'\'+Img00'+IntToStr(Random(10))+'.jpg';//случайное имя для файла-картинки
try
ImgRes :=TResourceStream.Create(hInstance,ImgResName[Random(4)],RT_RCDATA);//извлекаем случайный
          //ресурс картинки
ImgRes.SaveToFile(ImageFile);//сохраняем в файл      
finally
ImgRes.Free;
end;
AssignFile(FD,strFileName);
AssignFile(ImgF,ImageFile);
try
Reset(FD,1);
Reset(ImgF,1);
DataFileLen :=FileSize(FD);
ImageLen :=FileSize(ImgF);
SetLength(DataFileBuf,DataFileLen);
Seek(ImgF,ImageLen);//перемещаемся на длину файла-картинки
BlockRead(FD,DataFileBuf[1],DataFileLen);//читаем файл
BlockWrite(ImgF,DataFileBuf[1],DataFileLen);//записываем в конец картинки весь файл
BlockWrite(ImgF,ImageLen,SizeOf(Word));//запоминем длину картинки, чтобы потом можно было
finally           //извлечь файл из нее файл
CloseFile(FD);
CloseFile(ImgF);
DeleteFile(strFileName);
end;
Result :=ImageFile;
end;


Digitman   (2004-07-20 12:12:00) [16]

на то и пальцы


Суслик   (2004-07-20 11:59:00) [17]

он уже на другой форум пошел - здесь все пальцы гнут


VMcL   (2004-07-20 11:56:00) [18]

>> Жорик  (20.07.04 11:39)

Больше нечего добавить?


Digitman   (2004-07-20 11:45:00) [19]


> вызывается функция типа String


поди из DLL эта ф-ция ..


Суслик   (2004-07-20 11:41:00) [20]

очередной массовик затейник игры "а ну ка отгодай"

код приводи


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо