Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 76. - Využití souborů "ini" k ukládání typu fontů použitých v aplikaci

Jan Šindelář - 5.2.2003
Využití souborů "ini" k ukládání typu fontů použitých v aplikaci

Základní práci s INI soubory jsme si již kdysi ukazovali, takže by pro vás neměl být problém cokoliv si do podobného souboru uložit. Jelikož se jedná o konfigurační soubor, který obsahuje zejména informace o uživatelském nastavení aplikace, můžeme do něj klidně uložit typy písma všech objektů uživatelského rozhraní. Takový jednoduchý příklad si dnes vytvoříme.

V našem malém příkladu si do INI souboru uložíme informaci o typu písma pro Label, který na formulář umístíme. Tato informace se bude skládat jednak z typu fontu, dále z velikosti, řezu, barvy a stylu. Pokud by snad bylo potřeba uložit ještě nějaký další parametr, jistě pro vás nebude problém příslušný řádek do kódu doplnit podle vzoru.

Kromě samotného Labelu na formulář ještě umístíme FontDialog, který bude aktivován po kliknutí na Label a který nám poslouží pro výběr písma pro Label. Posledními prvky formuláře budou dvě tlačítka. První bude sloužit k uložení informací o písmu do INI souboru, druhé tlačítko naopak zajistí načtení těchto informací a jejich aplikaci na Label.

Nyní tedy již k samotnému zdrojovému kódu. Snad ani není třeba připomínat použití jednotky Inifiles a zbytek kódu je myslím dostatečně jednoduchý a jasný.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Inifiles;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    FontDialog1: TFontDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Label1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure SaveFont(const FName, Section: string; smFont: TFont);
var
  FStream: TIniFile;
begin
  FStream := TIniFile.Create(FName);
  try
    FStream.WriteString(Section, `Name`, smFont.Name);
    FStream.WriteInteger(Section, `CharSet`, smFont.CharSet);
    FStream.WriteInteger(Section, `Color`, smFont.Color);
    FStream.WriteInteger(Section, `Size`, smFont.Size);
    FStream.WriteInteger(Section, `Style`, Byte(smFont.Style));
  finally
    FStream.Free;
  end;
end;

procedure LoadFont(const FName, Section: string; smFont: TFont);
var
  FStream: TIniFile;
begin
  FStream := TIniFile.Create(Fname);
  try
    smFont.Name := FStream.ReadString(Section, `Name`, smFont.Name);
    smFont.CharSet := TFontCharSet(FStream.ReadInteger(Section, `CharSet`, smFont.CharSet));
    smFont.Color := TColor(FStream.ReadInteger(Section, `Color`, smFont.Color));
    smFont.Size := FStream.ReadInteger(Section, `Size`, smFont.Size);
    smFont.Style := TFontStyles(Byte(FStream.ReadInteger(Section, `Style`, Byte(smFont.Style))));
  finally
    FStream.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  LoadFont(ExtractFilePath(Application.ExeName) + `font.ini`, `label`, Label1.Font);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  SaveFont(ExtractFilePath(Application.ExeName) + `font.ini`, `label`, Label1.Font);
end;

procedure TForm1.Label1Click(Sender: TObject);
begin
  if FontDialog1.Execute then Label1.Font := FontDialog1.Font;
end;

end.

Jak vidíte, INI soubor je uložen přímo do adresáře s běžící aplikací, což si samozřejmě můžete změnit dle libosti. Osobně dávám přednost tomu, aby všechny konfigurační a další soubory byly uloženy přímo společně s aplikací v jedné složce a nemám rád, když si aplikace něco ukládá například do adresáře Windows. To už ale nechám na vašem uvážení.

Jelikož jsou obě procedury na uložení i načtení INI souboru dostatečně parametrizovány, můžete je pochopitelně použít i na jiné objekty než je Label a ukládat tak můžete informace prakticky o libovolném objektu, který má vlastnost Font.