![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Нашел в интернете вот такую функцию:
Код:
Var PicStream: PStream; ... Resource2Stream(PicStream, HInstance, 'LOGOTIP', RT_RCDATA); Хотелось бы взглянуть на код самой функции... Я так понимаю, что 'LOGOTIP' это указатель на файл в ресурсе... И как лучше реализовать чтение данных файла1 или файла2 ... из ресурса в поток? Может я чего-то не понимаю, может можно как-то создать поток ресурса? Главное чтобы я мог работать с данными файла (хранящегося в ресурсе) в потоке... P.S. Лучше без всяких массивов и циклов! И лучше через TMemoryStream. Последний раз редактировалось DrGeorg, 27.04.2013 в 06:18. |
|
#2
|
|||
|
|||
|
Походу, это функция из KOL:
http://delphiworld.narod.ru/base/kol_lesson11.html Собственно, не так и сложно написать свою такую функцию. Или посмотреть что-то подобное в Jedi (уверен, что там такое есть). |
|
#3
|
|||
|
|||
|
Цитата:
Код:
implementation
{$R *.dfm}
{$R DAT.RES}//Ресурс прилинковал
{ Список файлов в Dat.rc
Dat01 RXDATA LOADONCALL 01pi.dat
Dat02 RXDATA LOADONCALL 02pi.dat
Dat03 RXDATA LOADONCALL 03pi.dat
Dat04 RXDATA LOADONCALL 04pi.dat
Dat05 RXDATA LOADONCALL 05pi.dat
Dat06 RXDATA LOADONCALL 06pi.dat
Dat07 RXDATA LOADONCALL 07pi.dat}
...
procedure TForm1.Button1Click(Sender: TObject);
var
pData:Pointer;
hResoource:THandle;
ResSize:Longint;
nam:String;
ms:TMemoryStream;
begin
nam :=('Dat01');//Имя файла в ресурсе
hResoource:=LoadResource(hInstance, FindResource(hInstance, PWideChar(nam), RT_RCDATA));
pData:=LockResource(hResoource);
ResSize:= SizeOfResource(hInstance, hResoource);
ms:=TMemoryStream.Create;
try
ms.SetSize(ResSize);
ms.Write(pData^, ResSize);
ms.Seek(0,0);
FreeResource(hResoource);
//Дальше делаю что-то с данными в памяти
//При загрузке файла, скажем 01pi.dat с диска в память (ms.LoadFromFile...) код работает нормально!
finally
ms.Free;
end;Выскакивает ошибка access violation at address... Что я делаю не так? Последний раз редактировалось DrGeorg, 27.04.2013 в 08:21. |
|
#4
|
|||
|
|||
|
Может попробовать создать поток ресурса, затем извлекать по необходимости от туда данные в TMemoryStream?
Ну как-то так: Код:
var ResStream: TResourceStream; ms: TMemoryStream; ... Последний раз редактировалось DrGeorg, 27.04.2013 в 08:47. |
|
#5
|
||||
|
||||
|
Вот так грузится: (загонял текстовые файлы)
Содержимое RCфайла (Dat.rc) Код:
Dat01 RXDATA 01pi.dat Dat02 RXDATA 02pi.dat Dat03 RXDATA 03pi.dat Dat04 RXDATA 04pi.dat Dat05 RXDATA 05pi.dat Dat06 RXDATA 06pi.dat Dat07 RXDATA 07pi.dat Код:
...
{$R DAT.RES}
...
procedure TForm1.Button1Click(Sender: TObject);
var
ResHandle, MemHandle: THandle;
MemStream: TMemoryStream;
ResPtr: PByte;
ResSize: Longint;
begin
ResHandle:= FindResource(hInstance, PChar(Edit1.Text {'Dat01'}),'RXDATA');
MemHandle:= LoadResource(hInstance, ResHandle);
ResPtr := LockResource(MemHandle);
MemStream := TMemoryStream.Create;
ResSize := SizeOfResource(hInstance, ResHandle);
MemStream.SetSize(ResSize);
MemStream.Write(ResPtr^, ResSize);
FreeResource(MemHandle);
MemStream.Seek(0, 0);
// Для примера
memo1.Lines.LoadFromStream(memstream);
MemStream.Free;
end;
|
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
DrGeorg (27.04.2013)
| ||
|
#6
|
|||
|
|||
|
OK щас попробую...
|
|
#7
|
|||
|
|||
|
Спасибки! Все заработало!!! У меня были такие задумки по поводу вашего кода...
|