Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
ВнизГлюк при вызове функции Найти похожие ветки
← →
Жорик (2004-07-20 11:39) [0]По FormActivate вызывается функция типа String и переодически(!)
при ее вызове происходит ошибка EAccessViolation.
В самой функции ошибок нет и она выполняется от начала до конца.
К тому же если бы в функии была ошибка, то она проявлялась постоянна, а не от случая к случаю.
С чем может связана эта ошибка?
Заранее спасибо!
← →
Суслик © (2004-07-20 11:41) [1]очередной массовик затейник игры "а ну ка отгодай"
код приводи
← →
Reindeer Moss Eater © (2004-07-20 11:41) [2]С погодой на спутнике Юпитера
← →
MetalFan © (2004-07-20 11:41) [3]ну-ну...
← →
Digitman © (2004-07-20 11:45) [4]
> вызывается функция типа String
поди из DLL эта ф-ция ..
← →
VMcL © (2004-07-20 11:56) [5]>>Жорик (20.07.04 11:39)
Больше нечего добавить?
← →
Суслик © (2004-07-20 11:59) [6]он уже на другой форум пошел - здесь все пальцы гнут
← →
Digitman © (2004-07-20 12:12) [7]на то и пальцы
← →
Жорик (2004-07-20 12:15) [8]функия прячет в конец картинки указанный файл (параметр 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;
← →
Суслик © (2004-07-20 12:18) [9]я не буду это даже смотреть.
я что - сам должен выравнивание по левому краю делать?
← →
clickmaker © (2004-07-20 12:21) [10]Randomize вызвал перед Random?
Проверь еще ImgRes <> nil
← →
Жорик (2004-07-20 12:28) [11]Функция выполняется полностью и "упаковывает" файл вполне успешно. А Randomize я просто забыл написать она вызывается перед строкой ImageFile :=CurDir+"\"+Img00"+IntToStr(Random(10))+".jpg"
← →
Digitman © (2004-07-20 12:50) [12]
> Жорик
c какого перепугу индексация эл-тов дин.массива у тебя начинается с единицы ?
← →
Жорик (2004-07-20 12:53) [13]c какого перепугу индексация эл-тов дин.массива у тебя начинается с единицы ?</>
Насколько я помню если с 0 компилятор начинает ругаться.
А это может быть как-то связано с ошибкой?
← →
Суслик © (2004-07-20 12:55) [14]
> А это может быть как-то связано с ошибкой?
еще как
← →
Digitman © (2004-07-20 13:09) [15]
> Насколько я помню если с 0 компилятор начинает ругаться
с какого перепугу он начнет "ругаться", если массив формируется в ран-тайм ?
← →
stone © (2004-07-20 13:13) [16]
> try
> ImgRes :=TResourceStream.Create(hInstance,ImgResName[Random(4)],RT_RCDATA);//извлекаем
> случайный
> //ресурс картинки
> ImgRes.SaveToFile(ImageFile);//сохраняем в файл
> finally
> ImgRes.Free;
> end;
Забавно ты используешь try...finally
← →
Суслик © (2004-07-20 13:16) [17]
> Забавно ты используешь try...finally
не красиво, но в данном случае, может быть и правильно, т.к. где описана ImgRes не видно - вполне может быть, что он и очищает ее в nil :)))
← →
Anatoly Podgoretsky © (2004-07-20 13:35) [18]В случае возникновения ошибки при TResourceStream.Create будет в обязательном порядке вызвано ImgRes.Free; при неопределенном состоянии этого ImgRes
← →
Жорик (2004-07-20 13:52) [19]Проблема по-видимому была именно с динамеческим массивом.
После того, как исправил DataFileBuf[1] на DataFileBuf[0], ошибка
больше не повторялась.
Всем спасибо!
← →
Суслик © (2004-07-20 14:16) [20]
> при неопределенном состоянии этого ImgRes
это если при неопределенном.
мы то не знаем - определенное состояние или нет.
← →
Anatoly Podgoretsky © (2004-07-20 14:25) [21]Отсутствия знания ведет к AV
← →
Суслик © (2004-07-20 14:26) [22]согласен
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.031 c