Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2008, 19:06   #1
Лёка
Пользователь
 
Регистрация: 09.01.2008
Сообщений: 42
Восклицание Фаил ресурсов

Люди! такая тема. Можно к проекту подключать фаил ресурсов, в котором могут хранится звуки, иконки, картинки и тд.
Для того что бы создать фаил с ресурсами и откомпаилировать его через brcc32.exe (Borland\Delphi7\Bin\) нужно прописать содержание файла ресурсов, производится это в специальном файле source.rc. Формат записи такой:
<имя> <тип> <параметры> <имя файла>


Далее, к примеру звуковой фаил:
Это описывается в source.rc:

LOADSOUND RCDATA LOADONCALL zvyk.wav

Это функция что бы извлеч в память и воспроизвести:

Procedure RetrieveLoadSound;
Var
hResource: THandle;
pData: Pointer;
Begin // Загружаем фаил ресурсов и находим звук под именем 'LOADSOUND'
hResource: =LoadResource (hInstance, FindResource(hInstance, 'LOADSOUND', RT_RCDATA));
Try //Находим адрес загруженного ресурса
pData: = LockResource(hResource);
If pData = nil then raise Exception.Create (Ошибка чтения ресурса ‘LOADSOUND’);
SndPlaySound (pData, SND_MEMORY); // Воспроизводим
Finally // Освобождаем ресурс
FreeResource (hResource);
End;
End;


В фаиле source.rc можно прописать сразу много всего, строчку под строчкой. Вопрос! Кто знает какие типы и парматры нужно вписать в source.rc, что бы в source.res добавить картики, иконки? А так же какие функции, что бы вытащить их в image?
Лёка вне форума Ответить с цитированием
Старый 28.01.2008, 19:17   #2
BanDit
Пользователь
 
Аватар для BanDit
 
Регистрация: 26.05.2007
Сообщений: 58
По умолчанию

Для начала подготовь файлы в моём случае это:
BMAP1.bmp
BMAP2.bmp
BMAP3.bmp
Затем в блокноте напиши список ресурсов:
BMAP1 BITMAP C:\AAA\BMAP1.BMP
BMAP2 BITMAP C:\AAA\BMAP2.BMP
BMAP3 BITMAP C:\AAA\BMAP3.BMP
1 столбец – это имя ресурса будет писаться в библиотеке.
2 столбец – это пользовательский тип ресурса
3 столбец – это путь к файлу картинки.
Сохраним как BITMAPS.RC
В команде выполнить напиши:
C:\Program Files\Borland\Delphi7\Bin\BRCC32.EX E C:\AAA\ BITMAPS.RC
Прога создаст нам файл BITMAPS.RES
Теперь открываем Delphi создаём library (new->other->dll wizard)
За место {$R *.res} можно написать {$R BITMAPS.RES}
Сохраняем в нашей папке C:\AAA\, компилируем, все dll готова.
Как пользоваться ей.
…//где-то в программе
var
LibHandle: Cardinal;
begin
LibHandle := LoadLibrary(PAnsiChar(Extractfilepa th(Application.ExeName)+'Nasha.dll' ));
image1.Picture.Bitmap.LoadFromResou rceName(LibHandle, 'BMAP1');
end;

Как видишь этот процесс очень долгий, я предлагаю хранить ресурсы потоком информации.
Для создания файла пишем:
Procedure TForm1.AddToStream ( Source , Dest : TStream );
var
Size : Integer ;
begin
Source.position := 0 ;
// Сохраняем размер, помещая его в первый байт
Size := Source.Size ;
Dest.Write(Size,SizeOf(Integer));
Dest.CopyFrom(Source,Source.size);
end;
И на кнопке
procedure TForm1.Button1Click(Sender: TObject);
var
ABigFileStream, SomeSmallFiles : TMemoryStream ;
z: Byte;
begin
ABigFileStream := TMemoryStream.Create ;
try
SomeSmallFiles := TMemoryStream.Create ;
try
for z:=0 to 29 do //количество картинок
begin
SomeSmallFiles.LoadFromFile(Memo1.L ines[z]);// Memo1 – список адресов картинок
AddToStream(SomeSmallFiles,ABigFile Stream);
end;
finally
SomeSmallFiles.Free ;
end;
ABigFileStream.SaveToFile(edit1.Tex t) //Edit1 – адрес файла в котором сохраняем картинки
finally
ABigFileStream.free ;
end;
end;

Чтобы открыть пиши:
Procedure TForm1.GetFromStream ( Source , Dest : TStream ; Index : Integer );
Var
Size , I : Integer ;
begin
Source.Position := 0 ;
For i := 0 to index-1 do
begin
Source.Read(Size,SizeOf(Integer));
Source.Position := Source.Position + Size ;
end;
// Если маркер в файле равен размеру, то что-то пошло не так
if Source.position = Source.Size then
Raise EAccessViolation.Create('Index Out Of Bounds') ;
// Получаем желаемый размер файла
Source.Read(Size,SizeOf(Integer));
// Очищаем буфер у Dest
Dest.Position := 0 ;
Dest.Size := 0 ;
Dest.CopyFrom(Source,Size);
end;

На кнопке:
procedure TForm1.Button2Click(Sender: TObject);
var
ABigFileStream, SomeSmallFiles : TMemoryStream ;
z: Byte;
//JpegIm: TJpegImage;
begin
ABigFileStream := TMemoryStream.Create ;
try
ABigFileStream.LoadFromFile(edit1.T ext);
SomeSmallFiles := TMemoryStream.Create ;
try
GetFromStream(ABigFileStream,SomeSm allFiles,strtoint(edit2.Text));
SomeSmallFiles.Position:=0;
image1.Picture.Bitmap.LoadFromStrea m(SomeSmallFiles);//Только для BMP
{Для Jpeg файлов удали строку выше и убери скобки с
этого кода
JpegIm := TJpegImage.Create;
JpegIm.LoadFromStream(SomeSmallFile s);
image1.Picture.Bitmap.Assign(JpegIm );
JpegIm.Destroy; }
finally
SomeSmallFiles.Free ;
end;
finally
ABigFileStream.free ;
end;
end;
BanDit вне форума Ответить с цитированием
Старый 28.01.2008, 19:29   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Никогда не пользовался всей этой казуистикой - можно столько ошибок понаделать, что мама, не горюй...
В комплекте с Дельфи раньше шла замечательная вещь - ResourceWorkShop (почему-то с семеркой нет).
Пользуюсь только им. Процесс наглядный, почти полностью визуальный, любой тип ресурса и т.д. и т.п.
Никакого БРЦЦ использовать вручную не надо, только поменять у полученного файла расширение...
Найдите ее на дисках с более старыми (5, 6) версиями Дельфей и пользуйтесь. Советую!
mihali4 вне форума Ответить с цитированием
Старый 28.01.2008, 19:31   #4
Лёка
Пользователь
 
Регистрация: 09.01.2008
Сообщений: 42
По умолчанию

а без DLL? мне тупо *.res. Мне надо занть типы и парматер для *.jpg и *.ico и функцию для того что бы вытащить из ресурса их в image. Все гораздо проще
Лёка вне форума Ответить с цитированием
Старый 28.01.2008, 19:41   #5
BanDit
Пользователь
 
Аватар для BanDit
 
Регистрация: 26.05.2007
Сообщений: 58
По умолчанию

Код:
procedure TForm1.Button2Click(Sender: TObject); 
var 
ABigFileStream, SomeSmallFiles : TMemoryStream ; 
z: Byte; 
//JpegIm: TJpegImage; 
begin 
ABigFileStream := TMemoryStream.Create ; 
try 
ABigFileStream.LoadFromFile(edit1.Text); 
SomeSmallFiles := TMemoryStream.Create ; 
try 
GetFromStream(ABigFileStream,SomeSmallFiles,strtoi nt(edit2.Text)); 
SomeSmallFiles.Position:=0; 
image1.Picture.Bitmap.LoadFromStream(SomeSmallFile s);//Только для BMP 
{Для Jpeg файлов удали строку выше и убери скобки с 
этого кода 
JpegIm := TJpegImage.Create; 
JpegIm.LoadFromStream(SomeSmallFiles); 
image1.Picture.Bitmap.Assign(JpegIm); 
JpegIm.Destroy; } 
finally 
SomeSmallFiles.Free ; 
end; 
finally 
ABigFileStream.free ; 
end; 
end;
BanDit вне форума Ответить с цитированием
Старый 28.01.2008, 19:47   #6
Лёка
Пользователь
 
Регистрация: 09.01.2008
Сообщений: 42
По умолчанию

а в source.rc какие <тип> <параметры>?
Лёка вне форума Ответить с цитированием
Старый 28.01.2008, 20:50   #7
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
В комплекте с Дельфи раньше шла замечательная вещь - ResourceWorkShop (почему-то с семеркой нет).
С семеркой тоже есть - папка Workshop на диске с дистрибутивом. Версия 4.5 1994 года.
Может дистрибутив обрезанный попался...
Один раз ставил с чужого диска, при установке вылазила одна и таже ошибка, раз 100 жал кнопку пропустить, в дистрибутиве не оказалось ни одного help файла.

Последний раз редактировалось _Dmitry; 28.01.2008 в 20:59.
_Dmitry вне форума Ответить с цитированием
Старый 09.02.2008, 20:52   #8
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

В свободное время достраиваю, улучшаю свою прогу для компиляции ресурса. Собственно типа оболчки, для упрощения внедрения ресурсов.
Alter вне форума Ответить с цитированием
Старый 09.02.2008, 22:27   #9
Veiron
Форумчанин
 
Аватар для Veiron
 
Регистрация: 01.12.2007
Сообщений: 346
По умолчанию

А чем не ндравиться Restorator например?
Win 10 x64 | VS 2015 | MSSQL 2014
autovestitv.ru
Veiron вне форума Ответить с цитированием
Старый 10.02.2008, 00:24   #10
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Сообщение

Как говорится HandMake. Приятно иметь собственно ручную прогу, а также для саморазвития. Если что-то в своей программе ненравиться, можно в любое время исправить, улучшить. Ненужно ждать обновления версий. Плюс к этому мне так хочется. По моему Restorator платная.
Alter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Файлы ресурсов Черничный Общие вопросы Delphi 1 14.07.2008 05:49
Проблемы с добавлением ресурсов?? HunterMan Win Api 4 12.06.2008 02:33
Файл ресурсов Stanislav Общие вопросы Delphi 11 21.11.2007 08:27
Работа с файлом ресурсов (*.res) Dude_first Общие вопросы Delphi 3 09.09.2007 20:27