|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Перевод данных из ресурса в поток
Нашел в интернете вот такую функцию:
Код:
Var PicStream: PStream; ... Resource2Stream(PicStream, HInstance, 'LOGOTIP', RT_RCDATA); Хотелось бы взглянуть на код самой функции... Я так понимаю, что 'LOGOTIP' это указатель на файл в ресурсе... И как лучше реализовать чтение данных файла1 или файла2 ... из ресурса в поток? Может я чего-то не понимаю, может можно как-то создать поток ресурса? Главное чтобы я мог работать с данными файла (хранящегося в ресурсе) в потоке... P.S. Лучше без всяких массивов и циклов! И лучше через TMemoryStream. Все смелые до begin... Последний раз редактировалось 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... Что я делаю не так? Все смелые до begin... Последний раз редактировалось DrGeorg, 27.04.2013 в 08:21. |
#4
|
|||
|
|||
Может попробовать создать поток ресурса, затем извлекать по необходимости от туда данные в TMemoryStream?
Ну как-то так: Код:
var ResStream: TResourceStream; ms: TMemoryStream; ... Все смелые до begin... Последний раз редактировалось 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 щас попробую...
Все смелые до begin... |
#7
|
|||
|
|||
Спасибки! Все заработало!!! У меня были такие задумки по поводу вашего кода...
Все смелые до begin... |