Как проиграть Wave-ресурс

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Serg Vostrikov

Сначала делаешь файл SOUND.RC, в нем строка вида: MY_WAV RCDATA TEST.WAV Компилишь чем-нибyдь в *.RES

Далее в тексте:

{$R полное_имя_файла_с_ресурсом}

var

WaveHandle: THandle;

WavePointer: pointer;

WaveHandle := FindResource(hInstance, ‘MY_WAV’, RT_RCDATA);

if WaveHandle 0 then

begin

WaveHandle := LoadResource(hInstance, WaveHandle);

if WaveHandle 0 then

begin

;

WavePointer := LockResource(WaveHandle);

PlayResourceWave := sndPlaySound(WavePointer, snd_Memory or

SND_ASYNC);

UnlockResource(WaveHandle);

FreeResource(WaveHandle);

end;

end;

{/codecitation}

Как локализовать (русифицировать) ресурсы какого-либо пакета (runtime package)

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Alexander Simonenko

Вот, случайно набpели в хэлпе. Если нужно изменить pесуpсы какого-либо модуля,то это можно делать с помощью нехитpой опеpации:

Вынимаете pесуpсы из этого модуля.

Пеpеводите их на дpугой язык. (напpимеp pусский)

Создаете в Delphi свой пpоект Dll-ки (с именем того модуля, из котоpого вы вынули pесуpсы, напpимеp vcl30), в котоpый включаете _пеpеведенные_ pесуpсы: {$R vcl30rus.res}

Собиpаете все это.

Пеpеименовываете полученную vcl30.Dll в vcl30.rus и кидаете ее в System.

Если вы хотите, пpиложение «говоpило» по pусски только тогда, когда в pегиональных установках стоит Russia — то тогда это все.Если же вы хотите, чтобы ваше пpиложение _всегда_ поднимало pусские pесуpсы,то необходимо сделать следующее добавление в Registry:HKEY_CURRENT_USER\SOFTWARE\Borland\Delphi\Locales «X:\MyProject\MyApp.exe» = «rus»

Тепеpь, когда ваше пpиложение будет поднимать pakages, то всегда будут бpаться pусские pесуpсы. Дpугие пpиложения, напpимеp Delphi — это не затpонет.Таким обpазом можно заменять даже DFM-ки из пpоекта.

Более подpобно об этом — см Help — Index — Localizing…

{/codecitation}

Как из своего пpиложения опpеделить загpузку pесуpсов GDI и USER

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Nomadic

Подходит фидошник к ларьку с надписью «ПИРОЖКИ».

— Мне два сабжа пожалуйста.

{$APPTYPE CONSOLE}

// индикатоp pесуpсов

program res;

function MyGetFreeSystemResources32(Id: integer): integer;

stdcall; external ‘rsrc32’ name ‘_MyGetFreeSystemResources32@4’;

const

rSystem = 0;

rGDI = 1;

rUSER = 2;

begin

writeln(‘free resources’);

writeln(‘System:’, MyGetFreeSystemResources32(rSystem), ‘%’);

writeln(‘GDI:’, MyGetFreeSystemResources32(rGDI), ‘%’);

writeln(‘USER:’, MyGetFreeSystemResources32(rUSER), ‘%’);

end.

{/codecitation}

Как добавить в исполняемый файл WAV-файл и затем проиграть этот звук

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Как-то летели Холмс с Ватсоном на воздушном шаре. И заснули. Просыпаются над какой-то незнакомой местностью, видят — внизу какой-то мужик коров пасет. Снизились они и спрашивают мужика:

— Скажите, сэр, где мы находимся?

(долго думал)- На воздушном шаре.

— Спасибо, сэр! — и поднялись вверх. Холмс задумчиво говорит:

— Интересная местность, Ватсон! Программист пасет коров!

— Но, Холмс, с чего вы взяли, что он программист?

— Это элементарно! Во-первых, он долго думал над ответом. Во-вторых, его ответ был абсолютно точен. И самое главное — абсолютно бесполезен!

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

// MyWave RCDATA LOADONCALL MyWave.wav

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

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

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

// {$R MyWave.res}

// или используешь программу для работы с ресурсами

// ( н-р Borland Resource WorkShop) для получения 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(‘MyWave’, 0, SND_MEMORY);

finally

FreeResource(hResource);

end;

end;

{/codecitation}

Использование Bitmap из ресурса

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.swissdelphicenter.ch

{

Create and edit a new text file in your project directory,

eg: newres.txt

In the file, write:

MY_BMP_RES BITMAP «bmpname.bmp»

and save the file.

Open a dos shell and go to your directory, type this command:

brcc32.exe newres.txt

this will create a resource file called newres.res with your bitmap.

}

unit Unit1;

implementation

{$R *.DFM}

{$R newres.res} // add this line!

procedure TForm1.FormCreate(Sender: TObject);

var

MyBmp: TBitmap;

begin

MyBmp := TBitmap.Create;

try

MyBmp.LoadFromResourceName(HInstance, ‘MY_BMP_RES’);

// Do something….

finally

MyBmp.Free;

end;

end;

{/codecitation}

Изменить ресурсные строки во время выполнения

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.swissdelphicenter.ch

uses

Consts;

procedure TForm1.Button1Click(Sender: TObject);

begin

InputBox(‘Test’, ‘Enter something’, ‘Test’);

end;

procedure HookResourceString(rs: PResStringRec; newStr: PChar);

var

oldprotect: DWORD;

begin

VirtualProtect(rs, SizeOf(rs^), PAGE_EXECUTE_READWRITE, @oldProtect);

rs^.Identifier := Integer(newStr);

VirtualProtect(rs, SizeOf(rs^), oldProtect, @oldProtect);

end;

const

NewOK: PChar = ‘New Ok’;

NewCancel: PChar = ‘New Cancel’;

initialization

HookResourceString(@SMsgDlgOK, NewOK);

HookResourceString(@SMsgDlgCancel, NewCancel);

end.

{/codecitation}

Загрузка изображения или курсора из RES-файла

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Загрузка изображений и курсоров из RES-файлов

Изображения и курсоры могут храниться в файлах ресурсов (RES) и прилинковываться (связаваться) к EXE-файлу вашего приложения. RES-файлы могут создаваться с помощью Delphi утилит Image Editor и Borland Resource Workshop, входящие в поставку Delphi RAD Pack. Изображения и курсоры, хранимые в RES-файлах (после упаковки их в EXE или DLL) могут быть извлечены с помощью API функций LoadBitmap и LoadCursor соответственно.

Загрузка изображений

Функция API LoadBitmap определена следующим образом:

function LoadBitmap(Instance: THandle; BitmapName: PChar): HBitmap;

Первый параметр должен содержать дескриптор модуля (EXE или DLL), содержащего файл RES, из которого вы хотите получить ресурс. Delphi хранит дескриптор запущенного EXE-файла в глобальной переменной с именем Hinstance. В приведенном ниже примере мы предполагаем, что модуль, из которого мы пытаемся загрузить изображение, — ваше приложение. Тем не менее, модуль мог бы быть другим EXE- или DLL-файлом. Следующий пример загружает изображение с именем BITMAP_1 из RES-файла, прилинкованного к EXE-файлу приложения:

procedure TForm1.Button1Click(Sender: TObject);

var

Bmp: TBitmap;

begin

Bmp := TBitmap.Create;

Bmp.Handle := LoadBitmap(HInstance,’BITMAP_1′);

Canvas.Draw(0, 0, Bmp);

Bmp.Free;

end;

Имеется один недостаток использования API вызова LoadBitmap: LoadBitmap все же является API вызовом Windows 3.0, и грузит изображение только как DDB (Device Dependent Bitmaps). Это может вызвать проблемы с цветовой палитрой при загрузке DIB (Device Independent Bitmaps) из RES-файла. Приведенный ниже код может использоваться для извлечения DIB-ов из RES-файлов. Данный код загружает изображение как общий ресурс, передает его в поток, после чего делает Delphi вызов LoadFromStream, реализующий палитру автоматически.

procedure TForm1.Button1Click(Sender: TObject);

const

BM = $4D42; {Идентификатор типа изображения}

var

Bmp: TBitmap;

BMF: TBitmapFileHeader;

HResInfo: THandle;

MemHandle: THandle;

Stream: TMemoryStream;

ResPtr: PByte;

ResSize: Longint;

begin

BMF.bfType := BM;

{Ищем, загружаем и блокируем ресурс, содержащий BITMAP_1}

HResInfo := FindResource(HInstance, ‘BITMAP_1’, RT_Bitmap);

MemHandle := LoadResource(HInstance, HResInfo);

ResPtr := LockResource(MemHandle);

{Создаем Memory-поток, устанавливаем его размер, записываем

туда заголовок изображения и, наконец, само изображение }

Stream := TMemoryStream.Create;

ResSize := SizeofResource(HInstance, HResInfo);

Stream.SetSize(ResSize SizeOf(BMF));

Stream.Write(BMF, SizeOf(BMF));

Stream.Write(ResPtr^, ResSize);

{Освобождаем поток и сбрасываем его позицию в 0}

FreeResource(MemHandle);

Stream.Seek(0, 0);

{Создаем TBitmap и загружаем изображение из MemoryStream}

Bmp := TBitmap.Create;

Bmp.LoadFromStream(Stream);

Canvas.Draw(0, 0, Bmp);

Bmp.Free;

Stream.Free;

end;

Загрузка курсоров

Функция API LoadCursor определена следующим образом:

function LoadCursor(Instance: THandle; CursorName: PChar): HCursor;

Первый параметр Instance должен содержать дескриптор модуля, содержащего файл RES. Как и пример, приведенный выше, данный пример предполагает, что модуль, из которого мы пытаемся загрузить курсор, — ваше приложение. Второй параметр — имя курсора. В секции interface сделайте следующее объявление:

const

crMyCursor = 5; {Другие модули могут также использовать эту константу}

Затем добавьте следующие две строчки к обработчику события формы OnCreate:

procedure TForm1.FormCreate(Sender: TObject);

begin

Screen.Cursors[crMyCursor] := LoadCursor(HInstance, ‘CURSOR_1’);

Cursor := crMyCursor;

end;

или же вы можете изменить один из стандартных курсоров Delphi как показано ниже (константы Cursor описаны в электронной справке в статье Cursors Property):

procedure TForm1.FormCreate(Sender: TObject);

begin

{Данный пример изменяет курсор SQL Hourglass}

Screen.Cursors[crSQLWait] := LoadCursor(HInstance, ‘CURSOR_1’);

end;

Примечание: в нормальной ситуации необходимо удалить любые ресурсы курсоров с помощью DeleteCursor, тем не менее, в Delphi в этом нет необходимости, поскольку Delphi сама удаляет все курсоры из массива Cursors.

{/codecitation}

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

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

(*

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.

*)

(*

Man kann eine beliebige Datei als RCDATA Ressource in eine

Exe-Datei einbinden.

Das folgende Beispiel zeigt, wie man einen RTF-Text aus

einer Ressource ladt und in einem TRichEdit anzeigt.

Erstelle zuerst eine Datei «textres.rc» mit folgendem Inhalt:

TESTDOC RCDATA «textdoc.rtf»

Kompiliere diese mit brcc32.exe:

brcc32.exe textres.rc

Es wurde nun eine textres.res Datei erzeugt.

*)

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;

{/codecitation}

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

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.swissdelphicenter.ch

(*

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.

*)

(*

Man kann eine beliebige Datei als RCDATA Ressource in eine

Exe-Datei einbinden.

Das folgende Beispiel zeigt, wie man einen RTF-Text aus

einer Ressource ladt und in einem TRichEdit anzeigt.

Erstelle zuerst eine Datei «textres.rc» mit folgendem Inhalt:

TESTDOC RCDATA «textdoc.rtf»

Kompiliere diese mit brcc32.exe:

brcc32.exe textres.rc

Es wurde nun eine textres.res Datei erzeugt.

*)

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;

{/codecitation}

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

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

ДОРОГОЙ МОЙ МУЖ, Отправляю тебе это письмо по электронной почте, чтобы быть уверенной, что ты его прочтешь. Думаю, ты простишь мне эту небольшую хитрость, но просто я хотела держать тебя в курсе событий за два года, прошедших с того момента, как компьютер вошел в наш дом. С детьми все хорошо. Пете в прошлом месяце исполнилось 8 лет. Учится он хорошо, все считают его красивым и общительным мальчиком. У него, несомненно, есть художественные способности. На прошлой неделе он в школе на уроке рисования изобразил всю семью. У него очень хорошо получились все лица, а особенно реалистично — твой затылок. Ты должен гордиться своим сыном. Леночке в сентябре исполнилось три годика. Она очень похожа на тебя, каким ты был в ее возрасте. Леночка — очень умная девочка. Она даже помнит, что ты провел с нами весь вечер ее дня рождения. Она его с радостью вспоминает, хотя в тот день шел дождь, а ближе к вечеру отключили свет. Со мной тоже все в порядке. В прошлом году я перекрасилась в блондинку и сейчас я думаю, что этот цве

т волос мне очень даже идет. Коля (я имею в виду Николая Ивановича — менеджера по персоналу) стал очень интересоваться моей карьерой. А потом он стал моим очень близким другом. Я поняла, что заниматься домашними делами не так уж и сложно. Сначала, когда я подметала пол веником, ты чихал от пыли, но сейчас я делаю это пылесосом, который тебе совершенно не мешает. В доме теперь чистота и уют. Прошлой весной мы переклеили обои, за исключением той части комнаты, где ты поставил свой компьютер, там мы не стали обои переклеивать (не хотели тебе мешать). На этом я заканчиваю письмо, так как мне пора идти: Коля, то есть Николай Иванович, пригласил всех нас на горнолыжный курорт, и мне нужно собирать чемоданы. На время нашего отъезда я наняла домработницу. Она будет готовить тебе кофе и приносить тебе еду прямо за компьютер. Думаю, что вы хорошо проведете время с компьютером, пока мы будем отсутствовать. Петенька, Леночка и я будем думать о тебе. Постарайся и ты подумать о нас, хотя бы во время перезагрузки компьютера

.

Обнимаю. Твоя Маша.

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;

{/codecitation}