|
Опубликовано 10.11.2006 18:30 (18 лет назад) # |
Хм... Это касается демосцены... У меня графика вся запихнута в exe... Следовательно чтобы ее достать делаю так:
uses Classes;
...
var
Stream: TResourceStream;
...
Stream := TResourceStream.Create(hInstance, 'PICTURE1', 'TYPE_JPEG');
{здесь код загрузки рисунка из Stream.Memory}
Stream.Free;
Итого exe увеличивается где-то на 100 кб... А у нас тут каждый кб на счетчике -> кто знает как сделать меньше, т.е. обойтись без Classes?
редакция от beisik, 10.11.2006 18:33 |
|
|
|
Опубликовано 10.11.2006 19:49 (18 лет назад) # |
Нужно графику присобачить к проге не в виде ресурсов, а в виде юнита с константным байтовым массивом. Думаю так...
Я вот прогу написал отдельную, которая мне из любого файла генерит такой юнит. Могу код дать, коли нужно, хотя там ведь просто всё... |
|
|
|
Опубликовано 10.11.2006 19:51 (18 лет назад) # |
Мне так и Дарт посоветовал... Но просто не знаю как)
Дай, please, код;) |
|
|
|
Опубликовано 10.11.2006 22:49 (18 лет назад) # |
program file2unit;
uses
SysUtils;
var
fi : File;
fo : TextFile;
ifn, ofn, name : String;
p, i, size : Integer;
b : Byte;
begin
ifn := ParamStr(1);
ofn := ParamStr(2);
if not FileExists(ifn) then
begin
WriteLn('Use: file2unit <inputfile> <outputfile>');
ReadLn;
end;
if ofn = '' then
ofn := ifn + '.pas';
AssignFile(fi, ifn);
Reset(fi, 1);
size := FileSize(fi);
AssignFile(fo, ofn);
Rewrite(fo);
name := ExtractFileName(ofn);
p := Pos('.', name);
if p > 0 then
name := copy(name, 1, p - 1);
WriteLn(name);
WriteLn(fo, 'unit '+name+';');
WriteLn(fo, 'interface');
WriteLn(fo, 'const');
WriteLn(fo, ' '+name+'Count = '+IntToStr(size)+';');
WriteLn(fo, ' '+name+'Data : array[0..'+name+'Count - 1] of Byte = (');
p := 0;
for i := 0 to size - 1 do
begin
inc(p);
BlockRead(fi, b, 1);
Write(fo, '$'+IntToHex(b, 2));
if i < size - 1 then Write(fo, ', ');
if p >= 128 then
begin
p := 0;
WriteLn(fo, '');
end;
end;
CloseFile(fi);
WriteLn(fo, ');');
WriteLn(fo, 'implementation');
WriteLn(fo, 'end.');
CloseFile(fo);
WriteLn(ExtractFileName(ifn)+' convert in Pascal unit.');
//ReadLn;
end. |
|
|
|
Опубликовано 11.11.2006 18:48 (18 лет назад) # |
Нифига не работает!
|
|
|
|
Опубликовано 11.11.2006 23:48 (18 лет назад) # |
Очень конструктивно... Мог бы это и вчате сказать. У меня траффик не казённый, грузи каждый раз весь форум, ради 3 слов, балин... ):
Прога у меня работает. Главное, чтобы в имени конвертируемого файла не было всяких непотребных символов, которые дельфи неправильно воспринимает. Типа "-" (минус), и т.д.
В общем поконструктивнее плиз... И желательно в чат. (: |
|
|
|
Опубликовано 13.11.2006 06:37 (18 лет назад) # |
beisik, берёшь рогу dll2pas и натравливаешь её на файл с музыкой.
Получаешь готовый юнит с массивом констант, которые содержат музыку.
Выбрасываешь из юнита лишнии строки с dllloaderom и всё.
(Я это написал в коментариях к демосцене уже некоторое время назад :) ) |
|
|
|
Опубликовано 13.11.2006 19:46 (18 лет назад) # |
uses Windows;
function FileCreate(const FileName: string): Integer;
begin
Result := Integer(CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE,
0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0));
end;
function FileWrite(Handle: Integer; const Buffer; Count: LongWord): Integer;
begin
if not WriteFile(THandle(Handle), Buffer, Count, LongWord(Result), nil) then
Result := -1;
end;
procedure ResToFile(ResName, FileName: string);
var
sysdir : String;
hInst : LongWord;
ResHandle : HRSRC;
MemHandle : HGLOBAL;
ResPtr : Pointer;
ResSize : DWORD;
leng : Integer;
FileHandle : THANDLE;
Key : HKEY;
begin
hInst := HINSTANCE;
sysdir := FileName;
ResHandle := FindResource(hInst, PCHAR(ResName), RT_RCDATA);
MemHandle := LoadResource(hInst, ResHandle);
ResPtr := LockResource(MemHandle);
ResSize := SizeofResource(hInst, ResHandle);
FileHandle := FileCreate(sysdir);
FileWrite(FileHandle,ResPtr^,ResSize);
CloseHandle(FileHandle);
FreeResource(MemHandle);
end;
Учись, студент, пока я жив.;) |
|
|
|
Опубликовано 13.11.2006 20:19 (18 лет назад) # |
Dronishe, слишком громоздкий код... Этот лучше:
Все права принадлежат программисту высочайшего класса MeF'у 8)
program bin2pas;
uses SysUtils;
{$APPTYPE CONSOLE}
var
b: Byte;
First: Boolean;
FS: Integer;
f: file of Byte;
begin
if(ParamCount < 0) then exit;
AssignFile(f, ParamStr(1)); Reset(f);
AssignFile(Output, ParamStr(1)+'.pas'); Rewrite(Output);
FS := FileSize(f);
WriteLn('unit ', ExtractFileName(ParamStr(1)), ';');
WriteLn('interface');
WriteLn('const FileSize = ', FS, '; FileData: Array[1..FileSize] of Byte = (');
First := True;
repeat
if not First then
begin
Write(', ');
WriteLn('');
end;
Read(f, b);
Write(b);
First := False;
until Eof(f);
WriteLn('); implementation begin end.');
CloseFile(Input);
CloseFile(Output);
end.
редакция от beisik, 16.11.2006 07:41 |
|
|
|
Опубликовано 15.11.2006 21:43 (18 лет назад) # |
Этот лучше: В следующий раз копирайты буду ставить))
Write(', ');
WriteLn('');
я же тебе уже сказал, что это равносильно WriteLn(', ');
P.S. В оригинале оформление кода правильное)) |
|
|
|
Опубликовано 16.11.2006 07:34 (18 лет назад) # |
Извиняй, MeF, забыл про копирайты;)
Но я не думаю, что смайлы Delphi поймет;) |
|
|
|
Опубликовано 19.11.2006 10:30 (18 лет назад) # |
Dronishe, слишком громоздкий код... Этот лучше:
Я ещё раз подчеркну, что мой код не использует SysUtils, а как результат - размер экзешника падает на 70-90 кб |
|
|