Сохранение пользовательских настроек

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

Автор: Mike Scott

Сын системного администратора перед сном просит папу:

— Па-па… Расскажи сказку про умного, толкового, доброго, смелого юзера…

…и я хотел бы новые пользовательские цвета записывать на место старых, записываемых Delphi в файл ресурса, чтобы при следующем открытии формы, она автоматически сама отображала бы новую цветовую схему.

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

const

FileName = ‘Form1.stm’;

constructor TForm1.Create(AOwner: TComponent);

begin

if FileExists(FileName) then

begin

CreateNew(AOwner);

ReadComponentResFile(FileName, Self);

end

else

inherited Create(AOwner);

{ поместите здесь код в стиле ‘OnCreate’ }

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

WriteComponentResFile(FileName, Self);

end;

Имейте в виду, что это не вызывает OnCreate. В действительности, вам OnCreate и не нужен, поскольку сюда вы можете поместить код, необходимый в обработчике OnCreate; данный код следует поместить после конструктора Create, как и указано в комментарии.

{/codecitation}

Создание двоичных ресурсных файлов

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

Оформил: DeeCo

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

Syntax:

ID keyWord [load-option] [mem-option] filename

constants:

keyword:

BITMAP *.bmp

CURSOR *.cur

ICON *.ico

SOUND *.wav

VIDEO *.avi

load-option:

PRELOAD

LOADONCALL

mem-option:

FIXED

MOVEABLE

DISCARDABLE

Create a new textfile.

content:

10 BITMAP PRELOAD test.bmp

20 WAVE test.wav

Save the file as binres.rc

compile the file: brc32.exe -r binres.rc

You have now the compiled resource file binres.res

———————————————————-

Syntax

ID keyWord [load-option] [mem-option] dateiname

konstanten:

keyword:

BITMAP *.bmp

CURSOR *.cur

ICON *.ico

SOUND *.wav

VIDEO *.avi

load-option:

PRELOAD

LOADONCALL

mem-option:

FIXED

MOVEABLE

DISCARDABLE

Erstellen Sie eine neue Textdatei.

Inhalt:

10 BITMAP PRELOAD test.bmp

20 WAVE test.wav

Speichern Sie die Datei als binres.rc ab.

Compilieren Sie die Datei: brc32.exe -r binres.rc

Es wurde nun die Resource Datei binres.res erstellt.

{/codecitation}

Создание RES-файла с помощью BRCC.EXE

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

Автор: Bob Villiers

Данный метод обходит проблемы, связанные с Image Editor.

В каталоге \DELPHI\BIN имеется утилита коммандной строки, названная BRCC.EXE, позволяющая создавать из файлов, содержащих изображения/иконки, RES-файлы, в обход Image Editor. (Тем не менее, Image Editor хорошо работает при создании или редактировании файлов с изображениями или курсорами. Проблемой был импорт.)

Resource File Compiler описан в справке Windows API help в главе Windows Tools (где вы также можете прочесть о RC.EXE как о BRCC.EXE!). Это сэкономит вам какое-то время!

Сначала, используя Блокнот, создайте файл определения ресурса (Resource Definition) (текстовый) с именем, скажем, MYRES.RC (с обязательным расширением RC). Разместите, каждую на отдельной строке, ссылки на изображения, иконки, и т.п., которые вы хотели бы включить в RES-файл, например:

BITMAP1 BITMAP

BITMAP2 BITMAP

CURSOR1 CURSOR

ICON1 ICON

Затем (это не обязательно, но сохранит массу времени, особенно если вы экспериментируете), в том же каталоге создайте BAT-Файл, вызывающий программу для компиляции каждого ресурса:

«C:\DELPHI\BIN\BRCC/R %1»

Назовите его, скажем, MAKERES.BAT.

Перейдите в DOS и в каталоге проекта введите «MAKERES MYRES.RC». Заданные ресурсы будут скомпилированы в новый файл MYRES.RES, который может быть прилинкован к вашему проекту как и прежде. Используйте Image Editor для проверки и редактирования.

{/codecitation}

Работа с ресурсами – загрузка иконки и курсора

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

Автор: Xavier Pacheco

{

Copyright © 1998 by Delphi 4 Developer’s Guide — Xavier Pacheco and Steve Teixeira

}

program resource;

uses

Forms,

MainFrm in ‘MainFrm.pas’ {MainForm};

{$R *.RES}

{$R RESFILE2.RES} // Add the additional resource file

begin

Application.Initialize;

Application.CreateForm(TMainForm, MainForm);

Application.Run;

end.

{

Copyright © 1999 by Delphi 5 Developer’s Guide — Xavier Pacheco and Steve Teixeira

}

unit MainFrm;

interface

uses

Windows, Forms, Controls, Classes, StdCtrls, ExtCtrls;

const

crXHair = 1; // Declare a constant for the new cursor. This value

type // must be a positive number. or less than -20.

TMainForm = class(TForm)

imgBitmap: TImage;

btnChemicals: TButton;

btnClear: TButton;

btnChangeIcon: TButton;

btnNewCursor: TButton;

btnOldCursor: TButton;

btnOldIcon: TButton;

btnAthena: TButton;

procedure btnChemicalsClick(Sender: TObject);

procedure btnClearClick(Sender: TObject);

procedure btnChangeIconClick(Sender: TObject);

procedure btnNewCursorClick(Sender: TObject);

procedure btnOldCursorClick(Sender: TObject);

procedure btnOldIconClick(Sender: TObject);

procedure btnAthenaClick(Sender: TObject);

end;

var

MainForm: TMainForm;

implementation

{$R *.DFM}

procedure TMainForm.btnChemicalsClick(Sender: TObject);

begin

{ Load the bitmap from the resource file. The bitmap must be

specified in all CAPS! }

imgBitmap.Picture.Bitmap.LoadFromResourceName(hInstance, ‘CHEMICAL’);

end;

procedure TMainForm.btnClearClick(Sender: TObject);

begin

imgBitmap.Picture.Assign(nil); // Clear the image

end;

procedure TMainForm.btnChangeIconClick(Sender: TObject);

begin

{ Load the icon from the resource file. The icon must be

specified in all CAPS! }

Application.Icon.Handle := LoadIcon(hInstance, ‘SKYLINE’);

end;

procedure TMainForm.btnNewCursorClick(Sender: TObject);

begin

{ Assign the new cursor to the Screen’s Cursor array }

Screen.Cursors[crXHair] := LoadCursor(hInstance, ‘XHAIR’);

Screen.Cursor := crXHair; // Now change the cursor

end;

procedure TMainForm.btnOldCursorClick(Sender: TObject);

begin

// Change back to default cursor

Screen.Cursor := crDefault;

end;

procedure TMainForm.btnOldIconClick(Sender: TObject);

begin

{ Load the icon from the resource file. The icon must be

specified in all CAPS! }

Application.Icon.Handle := LoadIcon(hInstance, ‘DELPHI’);

end;

procedure TMainForm.btnAthenaClick(Sender: TObject);

begin

{ Load the bitmap from the resource file. The bitmap must be

specified in all CAPS! }

imgBitmap.Picture.Bitmap.LoadFromResourceName(hInstance, ‘ATHENA’);

end;

end.

Загрузить весь проект

{/codecitation}

Пример ресурсной таблицы строк

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

Автор: Ralph Friedman

Как мне создать ресурсную таблицу строк (Resource String Table), про которую упоминается в функции FmtLoadStr, но не сказано как создать эту таблицу, про это вообще нигде не сказано!

Создайте файл в приведенном ниже формате и обзовите его, скажем (подойдите к этому творчески), strings.rc:

STRINGTABLE LOADONCALL MOVEABLE DISCARDABLE

{

1, «UNPACK.INI»

2, «AcrobatClass»

3, «ACROEXCH.EXE»

4, «^.PDF»

5, «Extensions»

6, «ACROEXCH.EXE»

7, «PDF»

8, «AABSETUP.EXE»

9, «DelFiles-«

10, «INI-«

11, «UNPACK.INI»

12, «ACROSRCH.DLL»

13, «Regedit»

14, «ACROREAD.EXE»

15, «ACRO_LE.EXE»

}

Затем, с помощью компилятора ресурсов Borland (BRCC.EXE в вашем каталоге Delphi\Bin), скомпилируйте это в файл ресурсов:

BRCC strings.rc

Вы получите файл с именем strings.res. В вашем .DPR-файле после строки {$R *.RES} добавьте строку {$R STRINGS.RES}, после этого строковые ресурсы будут компилироваться с вашим exe-файлом.

{/codecitation}

Получить все имена ресурсов, что были загружены данным приложением

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

Оформил: DeeCo

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

type

TForm1 = class(TForm)

Button1: TButton;

Memo1: TMemo;

procedure Button1Click(Sender: TObject);

private

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

function enumResNamesProc(module: HMODULE; restype, resname: PChar;

list: TStrings): Integer; stdcall;

begin

if HiWord(Cardinal(resname)) 0 then

list.Add(‘ ‘ resname)

else

list.Add(Format(‘ #%d’, [loword(Cardinal(resname))]));

Result := 1;

end;

Function StockResourceType(restype: PChar): string;

const

restypenames: Array [1..22] of String =

( ‘RT_CURSOR’, // = MakeIntResource(1);

‘RT_BITMAP’, // = MakeIntResource(2);

‘RT_ICON’, // = MakeIntResource(3);

‘RT_MENU’, // = MakeIntResource(4);

‘RT_DIALOG’, // = MakeIntResource(5);

‘RT_STRING’, // = MakeIntResource(6);

‘RT_FONTDIR’,// = MakeIntResource(7);

‘RT_FONT’, // = MakeIntResource(8);

‘RT_ACCELERATOR’,// = MakeIntResource(9);

‘RT_RCDATA’, // = MakeIntResource(10);

‘RT_MESSAGETABLE’,// = MakeIntResource(11);

// DIFFERENCE = 11;

‘RT_GROUP_CURSOR’,// = MakeIntResource(DWORD(RT_CURSOR 7DIFFERENCE));

‘UNKNOWN’, // 13 not used

‘RT_GROUP_ICON’, // = MakeIntResource(DWORD(RT_ICON DIFFERENCE));

‘UNKNOWN’, // 15 not used

‘RT_VERSION’, // = MakeIntResource(16);

‘RT_DLGINCLUDE’, // = MakeIntResource(17);

‘UNKNOWN’,

‘RT_PLUGPLAY’, // = MakeIntResource(19);

‘RT_VXD’, // = MakeIntResource(20);

‘RT_ANICURSOR’, // = MakeIntResource(21);

‘RT_ANIICON’ // = MakeIntResource(22);

);

var

resid: Cardinal absolute restype;

begin

if resid in [1..22] then

Result := restypenames[resid]

else

Result := ‘UNKNOWN’;

end;

function enumResTypesProc(module: HMODULE; restype: PChar; list: TStrings): Integer; stdcall;

begin

if HiWord(Cardinal(restype)) 0 then

list.Add(restype)

else

list.Add(Format(‘Stock type %d: %s’, [LoWord(Cardinal(restype)),

StockResourcetype(restype)]));

EnumResourceNames(module, restype, @enumResNamesProc, Integer(list));

Result := 1;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

memo1.Clear;

if not EnumResourceTypes(hinstance, @enumResTypesProc, Integer(memo1.Lines)) then

memo1.Lines.Add(Format(‘GetLastError= %8.8x’, [GetLastError]))

else

memo1.Lines.Add(‘Successful’);

end;

end.

{/codecitation}

Ошибка дублирования идентификатора ресурса

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

Повесился как-то программист, и в кармане у него нашли записку: Critical error. System halted.

У вас есть исходный код VCL? Если да, то в этом случае ее можно всю перекомпилировать, добавив каталог к вашему библиотечному пути (Library path) в опциях среды (Environment Options | Library). Я думаю это нужно сделать, чтобы отделаться от этой ошибки. При другом способе необходимо вычислить вызывающую проблему директиву $R, временно удалить ее, и осуществить перекомпиляцию. Временно выключить директиву $R можно добавлением ‘.’ перед $ (но это не единственный путь выключить ее).

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

{/codecitation}

Несколько иконок в Delphi exe

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

Кто-нибудь знает как с помощью Delphi присвоить выполнимому файлу сразу несколько иконок? Т.е. так, что если вы ассоциируете тип файла и просматриваете ваше скомпилированное приложение, вы видите несколько возможных иконок, но, к сожалению, опция Project|Options|Application|Icon позволяет установить только одну иконку.

Просто создайте файл ресурса (.res), для примера, в Image Editor, и сохраните в нем ваши иконки. Затем подлинкуйте ресурс директивой компилятора $R и ваше приложение будет иметь столько иконок, сколько вы их создадите.

{/codecitation}

Мультиязыковое приложение

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

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

Вместо использования директив времени выполнения для проверки текущего языка, для установки индекса сообщений в таблице строк и загрузки оттуда сообщений в зависимости от языка я использовал переменные времени выполнения. Для каждого языка вы можете создавать другие таблицы строк, затем компилируя их с соответствующими директивами компиляции.

Вот некоторый код, дающий представление об этом методе:

unit French1;

interface

uses

SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,

Forms, Dialogs, StdCtrls, IniFiles;

type

TForm1 = class(TForm)

Button1: TButton;

procedure FormActivate(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

StringIndex: Integer;

implementation

{$R *.DFM}

{$R MULTLANG.RES}

{ Вот содержимое ресурсного файла для этого проекта:

1, «Attention»

2, «No Condition definition selected!»

3, «Always»

4, «Cannot delete the ‘always’ condition.»

5, «Confirmation»

6, «Delete the condition?»

7, «Yes»

8, «No»

9, «Attention»

10, «Pas de condition Selectionnйe»

11, «Toulours»

12, «Ne peux effacer la condition ‘Toujours'»

13, «Confirmation»

14, «Effacer cette condition?»

15, «

Компиляция ресурсов

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

Автор: Ralph Friedman

Сын программера приходит из школы. Отец:

— Как диктант?

— Да так. Всего две ошибки. Hо, в общем, скомпилировался.

У меня имеется приблизительно 36 маленьких растровых изображений, которые я хочу сохранить в файле и затем прилинковать его к exe. Как мне поместить их в res-файл?

Самый простой путь — создать файл с именем «BITMAPS.RC» и поместить в него список ваших .BMP-файлов:

BMAP1 BITMAP BMAP1.BMP

BMAP2 BITMAP BMAP2.BMP

CLOCK BITMAP CLOCK.BMP

DBLCK BITMAP DBLCK.BMP

DELOK BITMAP DELOK.BMP

LUPE BITMAP LUPE.BMP

OK BITMAP OK.BMP

TIMEEDIT BITMAP TIMEEDIT.BMP

Затем загрузите Resource Workshop (RW) и выберите пункт меню File|Project Open. В выпадающем списке «File Type» (тип файла) выберите RC-Resource Script и откройте файл, который вы только что создали. После того, как RW загрузит ваш файл, выберите пункт меню File|Project save as. Выберите объект RES-Resource из выпадающего списка «File Type» (тип файла). В поле редактирования «New File name» задайте имя нового файла, скажем, BITMAPS.RES. Нажмите OK. Теперь у вас есть файл ресурса. В вашем модуле Delphi добавьте после строки {$R *.RES} строку {$R BITMAPS.RES}. После компиляции вы получите exe-файл с скомпилированными ресурсами. Для получения доступа к ресурсам во время выполнения программы нужно сделать следующее:

myImage.Picture.Bitmap.Handle := LoadBitmap(HInstance, ‘TIMEEDIT’);

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

{/codecitation}