Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.06;
Скачать: CL | DM;

Вниз

Создание файла ресурсов.   Найти похожие ветки 

 
Delphi 5.01   (2002-02-06 19:54) [0]

Как можно создать файл ресурсов в котором будет находится нужныймне фаил а не BitMap, Cursor или Icon. Пожалуйста помогите не нашол в книге по дельфи и вообше в ФАКЕ тоже что делать?


 
Anatoly Podgoretsky ©   (2002-02-06 22:29) [1]

Нужное_мне_имя тип нужный_мне_файл

Это в *.rc и подключить к проекту


 
Pete ©   (2002-02-07 15:20) [2]

Пишешь:
resource.rc
Имя_ресурса RCDATA LOADONCALL имя_файла

brcc32 resource.rc получаешь *.res

и грузишь через Stream....


 
Delphi 5.01   (2002-02-07 17:40) [3]

Ну например мне нужно подцепить ыаил Font.ttf а потом в проге скопировать его в фонт каталог как можно ето сделать пожауйста обясните я с ресурсом в первые работаю.
Спасибо


 
Pete ©   (2002-02-08 10:17) [4]

Ниже приведен код для Delphi 1, который динамически устанавливает шрифты, загружаемые только во время работы приложения. Вы можете расположить файл(ы) шрифтов в каталоге приложения. Они будут инсталлированы при загрузке формы и выгружены при ее разрушении. Вам возможно придется модифицировать код для работы с Delphi 2, поскольку он использует вызовы Windows API, которые могут как измениться, так и нет. Если в коде вы видите "...", то значит в этом месте может располагаться какой-либо код, не относящийся к существу вопроса.

Ну и, конечно, вы должны заменить "MYFONT" на реальное имя файла вашего шрифта.



----------------------------------------------------------------- type
TForm1=class( TForm )
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
...
private
{ Private declarations }
bLoadedFont: boolean;
public
{ Public declarations }
end;

procedure TForm1.FormCreate(Sender: TObject);

var sAppDir: string;
sFontRes: string;

begin
sAppDir := Application.ExeName;
sAppDir := copy( sAppDir, 1, rpos( "\", sAppDir ) );

sFontRes := sAppDir + "MYFONT.FOT";
if not FileExists( sFontRes ) then
begin
sFontRes := sFontRes + #0;
sFont := sAppDir + "MYFONT.TTF" + #0;
CreateScalableFontResource( 0, @sFontRes[ 1 ], @sFont[ 1 ], nil );
end;

sFontRes := sAppDir + "MYFONT.FOT";
if FileExists( sFontRes ) then
begin
sFontRes := sFontRes + #0;
if AddFontResource( @sFontRes[ 1 ] ) = 0 then
bLoadedFont := false
else
begin
bLoadedFont := true;
SendMessage( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 );
end;
end;

...
end;

procedure TForm1.FormDestroy(Sender: TObject);

var
sFontRes: string;

begin
if bLoadedFont then
begin
sFontRes := sAppDir + "MYFONT.FOT" + #0;
RemoveFontResource( @sFontRes[ 1 ] );
SendMessage( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 );
end;
end;



Я поработал с данным кодом и внес некоторые поправки для корректной работы на Delphi 2.0. На Delphi 3.0 не испытано.

Электронная справка по продукту InstallShield показывает, что в системах Win95 и WinNT FOT-файл не нужен. Вам нужен только TTF-файл.

В результате процедура FormCreate стала выглядеть так:



----------------------------------------------------------------- var
sAppDir, sFontRes: string;
begin
{...другой код...}
sAppDir := extractfilepath(Application.ExeName);

sFontRes := sAppDir + "MYFONT.TTF";
if FileExists( sFontRes ) then
begin
sFontRes := sFontRes + #0;
if AddFontResource( @sFontRes[ 1 ] ) = 0 then
bLoadedFont := false
else
begin
bLoadedFont := true;
SendMessage( HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
end;
end;
{...}
end; {FormCreate}


А FormDestroy так:


----------------------------------------------------------------- var
sFontRes, sAppDir: string;
begin
{...другой код...}

if bLoadedFont then
begin
sAppDir := extractfilepath(Application.ExeName);
sFontRes := sAppDir + "MYFONT.TTF" + #0;
RemoveFontResource( @sFontRes[ 1 ] );
SendMessage( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 );
end;

{...другой код...}
end; {FormDestroy}



Для упрощения этого я сделал простую функцию, совмещающую обе этих задачи. Она возвращает логическое значение, говорящая об успехе, или наоборот, о неудаче операции загрузки или выгрузки шрифта.



-----------------------------------------------------------------{Функция загрузки и выгрузки шрифта.}
function LoadFont(sFontFileName: string; bLoadIt: boolean): boolean;
var
sFont, sAppDir, sFontRes: string;
begin
result := TRUE;

if bLoadIt then
begin
{Загрузка шрифта.}
if FileExists( sFontFileName ) then
begin
sFontRes := sFontFileName + #0;
if AddFontResource( @sFontRes[ 1 ] ) = 0 then
result := FALSE
else
SendMessage( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 );
end;
end
else
begin
{Выгрузка шрифта.}
sFontRes := sFontFileName + #0;
result := RemoveFontResource( @sFontRes[1] );
SendMessage( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 );
end;
end; {LoadFont}



Вот чти... взял из старого FAQ"а... надеюсь разберешься... и переделаешь под 5 или 6 Delphi. Не сложно.


 
Evgeny ©   (2002-02-08 10:38) [5]

Ну и где же здесь работа с ресурсным файлом?
Да кстати Delphi немного отличается от C++. И команду LOADONCALL можно не указывать. Все равно BRCC32, поставляемый с Delphi, ее игнорирует.


 
Pete ©   (2002-02-08 11:20) [6]

Я же говорю: Грузишь файл через TStream, сохраняешь,
и дальше как здесь написано...


 
Pete ©   (2002-02-08 13:04) [7]

Кстати, возможно перепутал, вот еще вариант из другого FAQ"а:

Включение шрифта в ваш 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.


 
Delphi 5.01   (2002-02-08 20:21) [8]

Большое тебее спасибо питя все схватываю на лету когда есть примеры вот ето клёва. Я все время мучался куда мне прятать секретные фаилы от проги теперь буду вживлать в ехе шник.
Спасибо всем кто помог решить проблемму если возникнут проблеммы с Апи обрашяйтесь могу помочь.


 
Evgeny ©   (2002-02-09 07:50) [9]

Ну судя по вопросу, вряд ли можно ожидать какой либо реальной помощи. Тем более в таком вопросе как WinAPI.


 
Pete ©   (2002-02-09 09:05) [10]

Нужна хорошая справка FAQ"и или примеры про работу с ТStream и TStreamFile. можно ссылку.


 
Evgeny ©   (2002-02-09 09:47) [11]

Примеры найти очень легко. Смотришь исходники Delphi и берешь оттуда все что требуется.



Страницы: 1 вся ветка

Текущий архив: 2002.05.06;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.008 c
1-17523
avr555
2002-04-23 17:44
2002.05.06
OnScroll в TStringGrid


1-17633
Krok
2002-04-22 19:11
2002.05.06
XML


14-17690
Sergo
2002-03-23 10:05
2002.05.06
Сеть


3-17490
Vitek_m
2002-04-12 05:09
2002.05.06
ODAC/DAO , DBX или стандартные компоненты для доступа к БД


4-17752
ebeden
2002-01-30 02:47
2002.05.06
Прозрачная кнопка