フォント情報を文字列と相互変換する
5 FontToStr-StrToFont 動作確認 Delphi2007 更新日 2007/11/13(火)

Registry や IniファイルでFontの状態を保存・復帰する場合
Font属性を文字列に相互変換できると便利なので関数を作ってみました。

ただし、Fontに関する全プロパティの属性を変換するのは面倒だったので
Name,Color,Size,Pitch,style を抜粋しています。

    S := FontToStr(Self.Font);
    StrToFont(Self.Font, S);
    
このように使用してください。

────────────────────
{-------------------------------
//  FontToStr
    StrToFont
機能:       フォントのプロパティと文字列を相互変換する
            対象プロパティはName,Color,Size,Pitch,style
備考:       StrToFontではFontをクラス渡しにしているので気をつけること。
            実際の文字列は例えばこのようになります
            "MS P明朝",$80000008,12,0,0
履歴:       2001/04/02
//------------------------------}
function FontToStr(Font: TFont): string;
var
  i: TFontStyle;
begin
  with Font do
  begin
    {下:(ColorをHEXにしたのはRegistryの見易さだけです)}
    Result := '"'+Name+ '",$'+IntToHex(Color,8)+','+IntToStr(Size)
          +','+IntToStr(Ord(Pitch))+',';
          {上:Pitchは列挙型なのでOrdで整数にする}
    for i:=low(TFontStyle) to high(TFontStyle) do
    {下:Font.StyleはTFontStyle列挙型の集合なので
     TFontStyleの最小値から最大値までを含んでいるか
     チェックして数値化}
      if i in style then
        Result := Result + IntToStr(Ord(i));
  end;
end;

procedure StrToFont(Font: TFont; val: string);
var
  w: TStringList;
  f: TFont;
  i: integer;
begin
  w := TStringList.Create;{←カンマ区切りにしたのでTStringListで分解}
  f := TFont.Create;
  try
  try
    w.CommaText := val;

    {下:StringListの数が4/5でなければ例外発生}
    if (w.Count=4) or (w.Count=5) then
    begin
      f.Name := w[0];
      f.Color := StrToInt(w[1]);
      f.Size := StrToInt(w[2]);
      f.Pitch := TFontPitch(StrToInt(w[3]));
      {上:Pitchは列挙型なのでTFontPitchでキャスト}
    end else
      raise Exception.Create('');

    if (w.Count=5) then
    begin
      for i:=1 to length(w[4]) do //TFontStyleは要素が10以下なので1桁ずつが1要素
        f.Style := f.Style + [TFontStyle(StrToInt(w[4][i]))];
        {上:集合の足し算}
    end else
      f.Style := [];

    Font.Assign(f);
    {上:問題がなければFontのパラメータを更新}
  except
    raise EConvertError.Create('フォントに変換できない文字列です');
  end;

  finally
    w.free;
    f.Free;
  end;
end;
//------------------------------
────────────────────

この関数ではFontStyleをForでループさせて数字の羅列に変換していますが

Version5以降では、もっと簡単でよい方法があります。
uses Typinfo;を追加
────────────────────
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := GetSetProp( Label1.Font, 'Style', true);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  SetSetProp( Label1.Font, 'Style', Edit1.Text);
end;
────────────────────
このようにGetSetPropやSetSetPropというのを行うと
文字列として
『[fsBold,fsItalic,fsUnderline,fsStrikeOut]』や『[]』
というような集合型のプロパティが取得、設定する事が出来ます。
不正な値をセットしたら例外が発生するようです。

なので、D5以降ならフォント情報と文字列を相互変換するのに
下記の FontToStr2/StrToFont2 を使うとよいでしょう。
────────────────────
{-------------------------------
//  FontToStr2
    StrToFont2
機能:       フォントのプロパティと文字列を相互変換する
            対象プロパティはName,Color,Size,Pitch,style
備考:       実際の文字列は例えばこのようになります
            "MS Pゴシック",$80000008,9,0,"[fsBold,fsItalic]"

            Delphi5で対応です。
            uses Typinfoが追加で必要

履歴:       2001/04/02
//------------------------------}
function FontToStr2(Font: TFont): string;
begin
  with Font do
  begin
    {下:(ColorをHEXにしたのは見やすいから)}
    Result := '"'+Name+ '",$'+IntToHex(Color,8)+','+IntToStr(Size)
          +','+IntToStr(Ord(Pitch))+',';
          {上:Pitchは列挙型なのでOrdで整数にする}

    Result := Result + '"'+
      GetSetProp(Font, 'Style', True) + '"';
  end;
end;

procedure StrToFont2(Font: TFont; val: string);
var
  w: TStringList;
  f: TFont;
begin
  w := TStringList.Create; //カンマ区切りにしたのでTStringListで分解
  f := TFont.Create;
  try
  try
    w.CommaText := val;

    {下:StringListの数が5でなければ例外発生}
    if (w.Count=5) then
    begin
      f.Name := w[0];
      f.Color := StrToInt(w[1]);
      f.Size := StrToInt(w[2]);
      f.Pitch := TFontPitch(StrToInt(w[3]));
      {上:Pitchは列挙型なのでTFontPitchでキャスト}
      SetSetProp(f, 'Style', w[4]);
    end else
      raise Exception.Create('');

    Font.Assign(f);
    {上:問題がなければFontのパラメータを更新}
  except
    raise EConvertError.Create('フォントに変換できない文字列です');
  end;

  finally
    w.free;
    f.Free;
  end;
end;
//------------------------------
────────────────────


参考────────────────────
Delphi広場 Delphi談話室
<10869> [DD] Re:フォントの情報をレジストリに保存
<10881> [DD] Re^3:フォントの情報をレジストリに保存(訂正版)
掲載されていたStrToFontはバグがあったので修正しています。