Навигация
Поддержать материально
Steam Greenlight

Логотипы
Медальки
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Темы форума
187 - ?
30.10.2024
 Mefistofel
Galactic Showdown -…
21.10.2024
 KregHek
Новый IGDC
5.08.2024
 rimush
186 - Strategy!
15.07.2024
 VoroneTZ
WoL
3.07.2024
 Darthman
Привет выжившие
21.05.2024
 GeePee
185 - RPG
9.02.2024
 Vaskrol
В каком банке открыт…
24.01.2024
 Darthman
185 - ?
30.12.2023
 Mefistofel
TESTAMENT - Тактичес…
15.11.2023
 KregHek
Сейчас на сайте
Гостей: 58
На сайте нет зарегистрированных пользователей

Пользователей: 1,790
новичок: Durved
Обсуждение «TResourceStream»
beisik
Avatar пользователя

Опубликовано 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

Makar Borisowitch
Avatar пользователя

Опубликовано 10.11.2006 19:49 (18 лет назад)    #
Нужно графику присобачить к проге не в виде ресурсов, а в виде юнита с константным байтовым массивом. Думаю так...
Я вот прогу написал отдельную, которая мне из любого файла генерит такой юнит. Могу код дать, коли нужно, хотя там ведь просто всё...
beisik
Avatar пользователя

Опубликовано 10.11.2006 19:51 (18 лет назад)    #
Мне так и Дарт посоветовал... Но просто не знаю как)
Дай, please, код;)
Makar Borisowitch
Avatar пользователя

Опубликовано 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.
beisik
Avatar пользователя

Опубликовано 11.11.2006 18:48 (18 лет назад)    #
Нифига не работает!
Makar Borisowitch
Avatar пользователя

Опубликовано 11.11.2006 23:48 (18 лет назад)    #
Очень конструктивно... Мог бы это и вчате сказать. У меня траффик не казённый, грузи каждый раз весь форум, ради 3 слов, балин... ):
Прога у меня работает. Главное, чтобы в имени конвертируемого файла не было всяких непотребных символов, которые дельфи неправильно воспринимает. Типа "-" (минус), и т.д.
В общем поконструктивнее плиз... И желательно в чат. (:
Shirson
Avatar пользователя

Опубликовано 13.11.2006 06:37 (18 лет назад)    #
beisik, берёшь рогу dll2pas и натравливаешь её на файл с музыкой.
Получаешь готовый юнит с массивом констант, которые содержат музыку.
Выбрасываешь из юнита лишнии строки с dllloaderom и всё.
(Я это написал в коментариях к демосцене уже некоторое время назад :) )
Dronishe
Avatar пользователя

Опубликовано 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;


Учись, студент, пока я жив.;)
beisik
Avatar пользователя

Опубликовано 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

MeF Dei Corvi
Avatar пользователя

Опубликовано 15.11.2006 21:43 (18 лет назад)    #
Этот лучше:
В следующий раз копирайты буду ставить))
Write(', ');
WriteLn('');
я же тебе уже сказал, что это равносильно WriteLn(', ');

P.S. В оригинале оформление кода правильное))
beisik
Avatar пользователя

Опубликовано 16.11.2006 07:34 (18 лет назад)    #
Извиняй, MeF, забыл про копирайты;)
Но я не думаю, что смайлы Delphi поймет;)
Dronishe
Avatar пользователя

Опубликовано 19.11.2006 10:30 (18 лет назад)    #
Dronishe, слишком громоздкий код... Этот лучше:


Я ещё раз подчеркну, что мой код не использует SysUtils, а как результат - размер экзешника падает на 70-90 кб
Перейти на форум:
Конкурсы
Открытые конкурсы:
Активных нет
Недавние конкурсы:
 186 - Strategy
 185 - RPG XII
 184 - Arcade II
 183 - Novel
 182 - RPG XI
 Все конкурсы
Случайная игра
Мини-чат
Вам необходимо залогиниться.

Архив чата

26,158,834 уникальных посетителей

Создано на базе русской версии PHP-Fusion copyright © 2003-2006 by Nick Jones.
Released as free software under the terms of the GNU/GPL license.