フォント情報を文字列と相互変換する
|
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はバグがあったので修正しています。
|