Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.04.2013, 05:17
DrGeorg DrGeorg вне форума
Прохожий
 
Регистрация: 26.04.2013
Сообщения: 38
Версия Delphi: RAD Studio XE3
Репутация: 10
По умолчанию Перевод данных из ресурса в поток

Нашел в интернете вот такую функцию:
Код:
Var 
PicStream: PStream;
...
Resource2Stream(PicStream, HInstance, 'LOGOTIP', RT_RCDATA);
Точнее её реализацию...
Хотелось бы взглянуть на код самой функции...
Я так понимаю, что 'LOGOTIP' это указатель на файл в ресурсе...
И как лучше реализовать чтение данных файла1 или файла2 ... из ресурса в поток?
Может я чего-то не понимаю, может можно как-то создать поток ресурса?
Главное чтобы я мог работать с данными файла (хранящегося в ресурсе) в потоке...
P.S. Лучше без всяких массивов и циклов! И лучше через TMemoryStream.
__________________
Все смелые до begin...

Последний раз редактировалось DrGeorg, 27.04.2013 в 06:18.
Ответить с цитированием
  #2  
Старый 27.04.2013, 06:55
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Походу, это функция из KOL:
http://delphiworld.narod.ru/base/kol_lesson11.html

Собственно, не так и сложно написать свою такую функцию. Или посмотреть что-то подобное в Jedi (уверен, что там такое есть).
Ответить с цитированием
  #3  
Старый 27.04.2013, 08:09
DrGeorg DrGeorg вне форума
Прохожий
 
Регистрация: 26.04.2013
Сообщения: 38
Версия Delphi: RAD Studio XE3
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Походу, это функция из KOL
Да я знаю, но решил попробовать вот так:
Код:
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  
Старый 27.04.2013, 08:43
DrGeorg DrGeorg вне форума
Прохожий
 
Регистрация: 26.04.2013
Сообщения: 38
Версия Delphi: RAD Studio XE3
Репутация: 10
По умолчанию

Может попробовать создать поток ресурса, затем извлекать по необходимости от туда данные в TMemoryStream?
Ну как-то так:
Код:
var
  ResStream: TResourceStream;
  ms: TMemoryStream;
...
__________________
Все смелые до begin...

Последний раз редактировалось DrGeorg, 27.04.2013 в 08:47.
Ответить с цитированием
  #5  
Старый 27.04.2013, 10:17
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вот так грузится: (загонял текстовые файлы)


Содержимое 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  
Старый 27.04.2013, 10:18
DrGeorg DrGeorg вне форума
Прохожий
 
Регистрация: 26.04.2013
Сообщения: 38
Версия Delphi: RAD Studio XE3
Репутация: 10
По умолчанию

OK щас попробую...
__________________
Все смелые до begin...
Ответить с цитированием
  #7  
Старый 27.04.2013, 10:30
DrGeorg DrGeorg вне форума
Прохожий
 
Регистрация: 26.04.2013
Сообщения: 38
Версия Delphi: RAD Studio XE3
Репутация: 10
По умолчанию

Спасибки! Все заработало!!! У меня были такие задумки по поводу вашего кода...
__________________
Все смелые до begin...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:04.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter