フォント情報をファイルに保存するには?

解決


Uga  2004-08-27 14:17:55  No: 10619

毎度毎度お世話になっています。またわからない問題が起こりましたので質問させていただきます。

今、フォーム上にあるラベルのプロパティ情報をファイルに保存したいと思っています。(一部ですが)
Left,Top,Visible等は保存できましたが、どうしてもFontが保存できません。
どうすれば保存できるのでしょうか?
ラベルは複数個ありそれらの情報は1つのファイルにまとめて保存するつもりです。
因みに、私はこれを作るとき、次のサイトを参考に作りました。

http://www.miyabi-vs.co.jp/~c-works/tips/Lafie/adv08.html

ご教授お願いします。


TtPIPICH  2004-08-27 17:35:01  No: 10620

IniFileの方が良いと思います。


ふじっこ  2004-08-27 20:32:53  No: 10621

アドベンチャーゲームサイトがリンクされてましたので
別の視点から・・
フォントの情報保存は、
TFontに画面プロパティのフォント部分をコピーし
保存する仕組みを盛り込めばよろしいかと・・
(例)
procedure TForm1.FormCreate(Sender: TObject);
var
 test: TFont;
begin
  test := TFont.Create;
  test := Form1.Font;
  //ここにフォントオブジェクトの内容をファイルへ落とす部分を作成
  ShowMessage('test');
  test.Destroy;
end;
Createした後なら、他のコントロールFontプロパティを
上記のように参照できます。
上記サンプルは、Delphi Ver5 Pro版にてコンパイルしました


LupinⅢ  URL  2004-08-27 20:45:58  No: 10622

単純にフォントのそれぞれのプロパティをそれぞれ設定として保存してはどうでしょう?

[FONT]
NAME = 'MS ゴシック'
SIZE = 9
とこんな感じで


Uga  2004-08-27 22:23:09  No: 10623

返答ありがとう御座います。

IniFileの使い方ついて自分なりに調べてみましたが、なんとなくわかった程度でフォントを保存する方法がまだわかりません。
具体的にはどうすれば良いのでしょうか?サンプルプログラムなどがあれば有り難いです。


TtPIPICH  2004-08-27 22:26:38  No: 10624

Label1.Font.Nameはstringです


TtPIPICH  2004-08-27 22:30:53  No: 10625

procedure TForm1.Button1Click(Sender: TObject);
var
IniFile:TIniFile;
begin
IniFile:=TIniFile.Create('ファイル名');
try
//書き込み
IniFile.WriteString('設定','フォント',Label1.Font.Name);
//読み込んで表示
ShowMessage(IniFile.ReadString('設定','フォント','読み込みに失敗'));
finally
IniFile.Free;
end;
end;


TtPIPICH  2004-08-27 22:33:49  No: 10626

ファイル名は指定してください
IniFile:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'設定.ini')
みたいに


Uga  2004-08-27 23:33:55  No: 10627

少してこずっていましたができました。ラベルを配列にしていたので

Labels[0].Font.Size := ReadInteger('Labels[0]', 'Size', Labels[0].Font.Size);

としていたら読み込めなかったですが、第1引数のSectionを
'Labels[0]'から'Labels(0)'にすればうまくいきました。
ありがとう御座いました。

ここで問題解決とさせて頂きますが、もう少し教えていただきたいことがあります。
ふじっこさんの方法なのですが、この方法がよくわかりませんでした。
もう少し具体的に説明していただければ幸いです。何分、知識不足の私ですが、ご教授お願いします。


ふじっこ  2004-08-28 00:24:48  No: 10628

私の方法は、TFontオブジェクトにある
各プロパティを抜き出してきて
(サンプルでは、間接的ですが)
Ugaさんがご自身で用意された構造体他にいったん保存されるのかと考え
サンプルを書いた次第です。


Uga  2004-08-28 02:40:06  No: 10629

すみません。駄目です。うまくいきません。
AVGのサイトとふじっこさんのサンプルを手本にしてプログラムを作りましたが、エラーになってしまいます。
プログラムの一部を以下に示します。

  TSaveData = record
    Font: TFont;
  end;

//Label1のフォントを保存
procedure TForm1.Button1Click(Sender: TObject);
var
  f: file;
  SaveData: TSaveData;
  test: TFont;
begin
    SaveData.Font       := TFont.Create;
    test := TFont.Create;
    test := Label1.Font;

    SaveData.Font.Color := test.Color;
    SaveData.Font.Name  := test.Name;
    SaveData.Font.Size  := test.Size;

    AssignFile(f, 'C:\JIYUU2004\Delphi\Jikken.sav');
    Rewrite(f,1);
    BlockWrite(f, savedata, sizeof(TSaveData));
    CloseFile(f);

    SaveData.Font.Destroy;
    test.Destroy;
end;

//Label1に保存したフォントを設定
procedure TForm1.Button2Click(Sender: TObject);
var
  f: file;
  LoadData: TSaveData;
  test: TFont;
begin
    LoadData.Font := TFont.Create;
    test := TFont.Create;

    AssignFile(f, 'C:\JIYUU2004\Delphi\Jikken.sav');
    Reset(f,1);
    BlockRead(f, LoadData, sizeof(TSaveData));
    CloseFile(f);

    test.Color := LoadData.Font.Color;
    test.Name  := LoadData.Font.Name;
    test.Size  := LoadData.Font.Size;

    Label1.Font := test;

    LoadData.Font.Destroy;
    test.Destroy;
end;

どこが間違っているのでしょうか?ご教授お願いします。


Mr.XRAY  URL  2004-08-29 06:02:02  No: 10630

>どこが間違っているのでしょうか?ご教授お願いします。

例えば以下のコードでできます.複数のラベルということですので,3つの
例としました.後は適当に...
ちなみに,私自身は,ファイルへの保存を伴う形でレコード型を使用するこ
とはまずないですね.またほとんどTFileStreamを使用しています.(^_^)

implementation

type
  //レコード型の保存読出しテスト用
  TSaveData = packed record
    FontColor: TColor;
    FontName : String[32];
    FontSize : Integer;
  end;

var
  ASaveData : array[0..2] of TSaveData;

{$R *.DFM}

//====================================================================
//  Writeメソッドで保存
//====================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
     AFile : String;
     F     : file of TSaveData;
     i     : Integer;
begin
     //保存前にプロパティを変更(これを保存)
     Label1.Font.Name  :='MS ゴシック';
     Label1.Font.Color :=clGray;
     Label1.Font.Size  :=20;
     Label2.Font.Name  :='MS ゴシック';
     Label2.Font.Color :=clRed;
     Label2.Font.Size  :=25;
     Label3.Font.Name  :='MS P明朝';
     Label3.Font.Color :=clBlue;
     Label3.Font.Size  :=30;

     //保存データをSavedataに代入
     ASavedata[0].FontName :=Label1.Font.Name;
     ASavedata[0].FontColor:=Label1.Font.Color;
     ASavedata[0].FontSize :=Label1.Font.Size;
     ASavedata[1].FontName :=Label2.Font.Name;
     ASavedata[1].FontColor:=Label2.Font.Color;
     ASavedata[1].FontSize :=Label2.Font.Size;
     ASavedata[2].FontName :=Label3.Font.Name;
     ASavedata[2].FontColor:=Label3.Font.Color;
     ASavedata[2].FontSize :=Label3.Font.Size;

     //保存
     AFile  := ChangeFileExt(Application.ExeName,'.sav');
     try
       AssignFile(F, AFile);
       Rewrite(F);
       for i:=0 to 2 do begin
         Write(F, ASavedata[i]);
       end;
     finally
       CloseFile(F);
     end;
end;
//====================================================================
//  Readメソッドで読出す
//====================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
     AFile : String;
     F     : file of TSaveData;
     i     : Integer;
begin
     //保存したデータを読出す
     AFile  := ChangeFileExt(Application.ExeName,'.sav');
     try
       AssignFile(F, AFile);
       Reset(F);
       for i:=0 to 2 do begin
         Read(F, ASavedata[i]);
       end;
     finally
       CloseFile(F);
     end;

     //読出した値でLabelのプロパティ変更
     Label1.Font.Name := ASavedata[0].FontName;
     Label1.Font.Color:= ASavedata[0].FontColor;
     Label1.Font.Size := ASavedata[0].FontSize;
     Label2.Font.Name := ASavedata[1].FontName;
     Label2.Font.Color:= ASavedata[1].FontColor;
     Label2.Font.Size := ASavedata[1].FontSize;
     Label3.Font.Name := ASavedata[2].FontName;
     Label3.Font.Color:= ASavedata[2].FontColor;
     Label3.Font.Size := ASavedata[2].FontSize;
end;

end.


Uga  2004-08-29 10:30:11  No: 10631

Mr.XRAYさん。わざわざサンプルをありがとう御座います。
参考にさせて頂きまして、うまく保存、読込みができました。
皆様、初心者の長々とした質問に答えて頂きましてどうもありがとう御座いました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加