Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.01;
Скачать: CL | DM;

Вниз

Глюк при вызове функции   Найти похожие ветки 

 
Жорик   (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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.062 c
14-1089859275
КаПиБаРа
2004-07-15 06:41
2004.08.01
Это -=Авто=- эпидемия?


4-1087899963
init13
2004-06-22 14:26
2004.08.01
температура процессора, и др. термодатчиков


14-1089964754
}|{yk
2004-07-16 11:59
2004.08.01
До окончания кучмизма осталось меньше 120 дней


3-1089182014
Rusty
2004-07-07 10:33
2004.08.01
Как определить: существует ли таблица в базе Access?


8-1084885435
Iraizor
2004-05-18 17:03
2004.08.01
ошибка после завершения приложения работающего с канвой