Автор: newfork

Загрузить RTF файл из ресурса своего EXE

Load RTF file from resource:

You can store any kind of file as a RCDATA resource.

The following example shows this with an RTF file.

Create a text file called textres.rc and put the

following line in it:

TESTDOC RCDATA «textdoc.rtf»

Next, compile that using the Borland Resource Compiler,

which is provided with Delphi.

brcc32.exe textres.rc

Your next step is to include the compiled resource (.RES) file into

your executable, which can be done with the {$R} compiler directive.

*)

implementation

{$R *.dfm}

{$R textres.res} // <---- your resource file!

procedure TForm1.Button1Click(Sender: TObject);

var

rs: TResourceStream;

begin

rs := TResourceStream.Create(hinstance, 'TESTDOC', RT_RCDATA);

try

Richedit1.PlainText := False;

TempStream.Position := 0;

Richedit1.Lines.LoadFromStream(rs);

finally

rs.Free;

end;

end;

Загрузить RTF текст из файла ресурса в TRichEdit

Load RTF file from resource:

You can store any kind of file as a RCDATA resource.

The following example shows this with an RTF file.

Create a text file called textres.rc and put the

following line in it:

TESTDOC RCDATA «textdoc.rtf»

Next, compile that using the Borland Resource Compiler,

which is provided with Delphi.

brcc32.exe textres.rc

Your next step is to include the compiled resource (.RES) file into

your executable, which can be done with the {$R} compiler directive.

implementation

{$R *.dfm}

{$R textres.res} // <---- your resource file!

procedure TForm1.Button1Click(Sender: TObject);

var

rs: TResourceStream;

begin

rs := TResourceStream.Create(hinstance, 'TESTDOC', RT_RCDATA);

try

Richedit1.PlainText := False;

TempStream.Position := 0;

Richedit1.Lines.LoadFromStream(rs);

finally

rs.Free;

end;

end;

Вставить программу внутрь EXE файла

1. Пишем в блокноте RC-файл, куда прописываем все нужные нам программы, например:

ARJ EXEFILE C:\ARHIVERS\ARJ.EXE

2. Компилируем его в ресурс при помощи Brcc32.exe. Получаем RES- файл.

3. Далее в тексте нашей программы:

implementation

{$R *.DFM}

{$R test.res} //Это наш RES-файл

// Процедура для извлечения ресурса в указанный файл

procedure ExtractRes(ResType, ResName, ResNewName : String);

var

Res : TResourceStream;

begin

Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));

Res.SavetoFile(ResNewName);

Res.Free;

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

// Записывает в текущую папку arj.exe

ExtractRes('EXEFILE', 'ARJ', 'ARJ.EXE');

end;

Включение шрифта как ресурс в EXE

Включение шрифта в ваш EXE:

Используйте ваш любимый текстовый редактор, создайте *.rc файл, описывающий шрифт:

MY_FONT ANYOL1 «Bauhs93.ttf»

Первые два параметра могут быть любыми. Они будут использоваться в программе позже.

Затем для создания *.res файла используйте компилятор командной строки BRCC32.EXE, поставляемый с Delphi. Если ваш файл на этапе 1 был назван MyFont.rc, командная строка в сеансе DOS должна выглядеть так:

BRCC32 MyFont

Программа добавит в компилируемый файл созданный ресурс .rc и создаст файл с тем же именем, за исключением расширения, которое будет .res: MyFont.res

В вашей программе добавьте директиву компилятора, чтобы включить вновь созданный файл:

{$R MyFont.res}

Правильным будет разместить его в секции реализации после строчки {$R *.DFM}.

Добавьте процедуру создания файла из ресурса, делающим шрифт доступным для использования. Пример:

procedure TForm1.FormCreate(Sender: TObject);

var

Res : TResourceStream;

begin

Res := TResourceStream.Create(hInstance, 'MY_FONT', Pchar('ANYOL1'));

Res.SavetoFile('Bauhs93.ttf');

Res.Free;

AddFontResource(PChar('Bauhs93.ttf'));

SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);

end;

 

Теперь вы можете использовать данный шрифт в своем приложении:

procedure TForm1.Button1Click(Sender: TObject);

begin

Button1.Font.Name := 'Bauhaus 93';

end;

Предостережения:

Приведенный пример не предусматривает никакой проверки и защиты от возможных ошибок.

Обратите внимание — имя файла НЕ такое же, как имя шрифта. Это допускает, что вы знаете имя шрифта и имя его ttf-файла. Вы можете определить это, дважды щелкнув на файле в окне Проводника.

Я рекомендую устанавливать файл шрифта в папку C:\WINDOWS\FONTS. Его легче отыскать потом именно там.

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

procedure TForm1.FormDestroy(Sender: TObject);

begin

RemoveFontResource(PChar("Bauhs93.ttf"))

SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);

end;

 

Для получения дополнительной справки по функциям AddFontResource и RemoveFontResource загляните в электронную справку по Win32.

 

Включение wav-файла в exe и проигрывание этого wav-файла

Включение wav-файла в exe и проигрывание этого wav-файла

Зависимости: Uses MMSystem

// В файл MyWave.rc пишешь:

MyWave RCDATA LOADONCALL MyWave.wav

// Затем компилируешь

brcc32.exe MyWave.rc, получаешь MyWave.res.

// В своей программе пишешь:

{$R MyWave.res}

procedure RetrieveMyWave;

var

hResource: THandle;

pData: Pointer;

begin

hResource := LoadResource(hInstance, FindResource(hInstance, 'MyWave',

RT_RCDATA));

try

pData := LockResource(hResource);

if pData = nil then

raise Exception.Create('Cannot read MyWave');

// Здесь pData указывает на MyWave

// Теперь можно, например, проиграть его (Win32):

PlaySound(pData, 0, SND_MEMORY SND_ASYNC SND_NOSTOP);

//Для PlaySound используется модуль MMSystem}

//SND_ASYNC - при проигрывании не останавливать работу программы

//SND_NOSTOP - проиграть звук до конца

//SND_STOP - прекратить играть прежний звук и начать новый

finally

FreeResource(hResource);

end;

end;

Включение JPEG в EXE-файл 2

1) Создайте текстовый файл с расширением «.rc». Имя этого файла должно отличаться от имени файла-пректа или любого модуля проекта. Файл должен содержать строку вроде:

MYJPEG JPEG C:\DownLoad\MY.JPG

где: «MYJPEG» имя ресурса «JPEG» пользовательский тип ресурса «C:\DownLoad\MY.JPG» путь к JPEG файлу.

Пусть например rc-файл называется «foo.rc»

Запустите BRCC32.exe (Borland Resource CommandLine Compiler) — программа находится в каталоге Bin Delphi/C Builder’а — передав ей в качестве параметра полный путь к rc- файлу.

В нашем примере:

C:\DelphiPath\BIN\BRCC32.EXE C:\ProjectPath\FOO.RC

Вы получите откомпилированный ресурс — файл с расширением «.res». (в нашем случае foo.res).

Далее добавте ресурс к своему приложению.

{Грузим ресурс}

{$R FOO.RES}

uses Jpeg;

procedure LoadJPEGFromRes(TheJPEG : string; ThePicture : TPicture);

var

ResHandle : THandle;

MemHandle : THandle;

MemStream : TMemoryStream;

ResPtr : PByte;

ResSize : Longint;

JPEGImage : TJPEGImage;

begin

ResHandle := FindResource(hInstance, PChar(TheJPEG), 'JPEG');

MemHandle := LoadResource(hInstance, ResHandle);

ResPtr := LockResource(MemHandle);

MemStream := TMemoryStream.Create;

JPEGImage := TJPEGImage.Create;

ResSize := SizeOfResource(hInstance, ResHandle);

MemStream.SetSize(ResSize);

MemStream.Write(ResPtr^, ResSize);

FreeResource(MemHandle);

MemStream.Seek(0, 0);

JPEGImage.LoadFromStream(MemStream);

ThePicture.Assign(JPEGImage);

JPEGImage.Free;

MemStream.Free;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

LoadJPEGFromRes('MYJPEG', Image1.Picture);

end;

Включение JPEG в EXE-файл

Начиная с третьей версии, Delphi содержит модуль jpeg, позволяющий работать с этим форматом изображений, и у меня встала задача включить jpeg-графику в мой исполнимый файл для последующего использования в программе, но как это осуществить я пока не знаю.

Нет проблем! Выполните пять простых шагов, описанных ниже, и вы поймете все эту сложную, на первый взгляд, технологию.

Шаг первый:

Создайте файл сценария ресурса (*.RC) в обычном текстовом редакторе типа Notepad и добавьте следующую строку:

1 RCDATA «MyPic.jpg»

Первый элемент является просто индексом ресурса. Второй элемент указывает на определенный пользователем ресурс. Третий, он же последний элемент, является именем jpeg-файла.

Шаг второй:

Для компиляции ресурса в .RES-файл используйте Borland Resource Compiler, BRCC32.EXE. В командной строке MS-DOS введите:

BRCC32 MyPic.RC

Это создаст файл ресурса с именем MyPic.RES.

Шаг третий:

Добавьте директиву компилятора к исходному коду вашей программы. Она должна располагаться непосредственно за директивой формы, как показано ниже:

{$R *.DFM}

{$R MyPic.RES}

Шаг четвертый:

Добавьте следующий код к вашему проекту (для этого я создал процедуру):

procedure LoadJPEGfromEXE;

var

MyJPG: TJPEGImage; // Объект - JPEG

ResStream: TResourceStream; // Объект - поток ресурсов

begin

try

MyJPG := TJPEGImage.Create;

ResStream := TResourceStream.CreateFromID(HInstance, 1, RT_RCDATA);

MyJPG.LoadFromStream(ResStream); // Что!? Да, это просто!

Canvas.Draw(12, 12, MyJPG);

// сделайте это, чтобы увидеть что это действительно работает!

finally

MyJPG.Free;

ResStream.Free;

end;

end; // procedure

Обратили внимание на второй параметр процедуры CreateFromID объекта TResourceStream? Это просто индекс ресурса. Вы можете включить более одного jpeg-изображения в исполняемый модуль приложения, просто добавляя в .RC-файл строчку с другим индексом для каждого включаемого изображения.

Шаг пятый:

Вызовите процедуру, запустите программу и вуаля! Дело сделано.

WAV в EXE

В файл MyWave.rc пишешь:

MyWave RCDATA LOADONCALL MyWave.wav

brcc32.exe MyWave.rc, получаешь MyWave.res.

В своей программе пишешь:

{$R MyWave.res}

Все!

Предупреждая следующий твой вопрос «а как прочитать wave-файл из исполняемого файла?»

procedure RetrieveMyWave;

var

hResource: THandle;

pData: Pointer;

begin

hResource := LoadResource(hInstance, FindResource(hInstance, 'MyWave',

RT_RCDATA));

try

pData := LockResource(hResource);

if pData = nil then

raise Exception.Create('Cannot read MyWave');

// Здесь pData указывает на MyWave

// Теперь можно, например, проиграть его (Win32):

PlaySound('MyWave', 0, SND_MEMORY);

finally

FreeResource(hResource);

end;

end;

GIF для HTML в EXE

Есть программа на Delphi, котоpая отображает какой-то html. В html используется gif-файл. Как в Delphi-пpоекте указать, чтобы этот gif находился в exe как некий кусок кода. А когда надо будет, записать его обратно в gif-файл без изменений, выковырнув из exe?

Можно, используя RxLib. После его установки в меню View появится пунктик Project Resources. Hужно выбрать Project Resources->New->User Data и добавить нужный файл. В данном случае ресурс был назван «RCDATA_1».

Если RxLib нет, то нужно создать файл описания ресурсов:

=== Begin gifs.rc ===

mygif rcdata «имя_gif-файла.gif»

mygif1 rcdata «RCDATA_1»

=== End dots.rc ===

Потом скомпилировать его командой brcc32 gifs.rc и получить gifs.res В начало модуля добавь строчку {$R gifs.res}

В своей программе необходимо написать:

var

rs: TResourceStream;

a: Pointer;

begin

rs := TResourceStream.Create(hinstance, 'RCDATA_1', RT_RCDATA);

try

GetMem(a, rs.size);

rs.Read(a^, rs.size); {Теперь a - динамический указатель на код}

{ Здесь делается все, что необходимо с кодом, используя указатель a }

FreeMem(a);

finally

rs.Free;

end;

end;

 

А можно и так, если необходимо записать ресурс в файл:

var

rs: TResourceStream;

fs: TFileStream;

begin

rs := TResourceStream.Create(hInstance, 'mygif', RT_RCDATA);

fs := TFileStream.Create('имя_gif-файла.gif', fmCreate);

try

fs.CopyFrom(rs, rs.Size);

finally

fs.Free;

rs.Free;

end;

end;

256-цветное изображение из res-файла

Вот функция, правильно читающая 256-цветные изображения из файла ресурсов.

function LoadBitmap256(hInstance: HWND; lpBitmapName: PChar): HBITMAP;

var

hPal, hRes, hResInfo: THandle;

pBitmap: PBitmapInfo;

nColorData: Integer;

pPalette: PLogPalette;

X: Integer;

hPalette: THandle;

begin

hResInfo := FindResource(hInstance, lpBitmapName, RT_BITMAP);

hRes := LoadResource(hInstance, hResInfo);

pBitmap := Lockresource(hRes);

nColorData := pBitmap^.bmiHeader.biClrUsed;

hPal := GlobalAlloc(GMEM_MOVEABLE, (16 * nColorData));

{ hPal := GlobalAlloc( GMEM_MOVEABLE, ( SizeOf( LOGPALETTE )

(nColorData * SizeOf( PALETTEENTRY )));}


pPalette := GlobalLock(hPal);

pPalette^.palVersion := $300;

pPalette^.palNumEntries := nColorData;

for x := 0 to nColorData do

begin

pPalette^.palPalentry[X].peRed := pBitmap^.bmiColors[X].rgbRed;

pPalette^.palPalentry[X].peGreen := pBitmap^.bmiColors[X].rgbGreen;

pPalette^.palPalentry[X].peBlue := pBitmap^.bmiColors[X].rgbBlue;

end;

hPalette := CreatePalette(pPalette^);

GlobalUnlock(hRes);

GlobalUnlock(hPal);

GlobalFree(hPal);

end;

end.