TColorを保存するには?

解決


チャーリー  2004-11-18 21:28:48  No: 11830

こんいちは、チャーリーです。
-----
TBameiColor=record
Bamei:string;
BColor:TColor;
end;
------
Comboboxのitemindexの背景色を
0:Brush.color:=clRed;
1:Brush.Color:=clBlue;
として、Comboboxのitemindexを選択してクリックすると選択された背景色をTBameiColor.BColorに登録するというプログラムを進めているのですが、TColorをTFileStreamで保存する場合どうしたらいいのでしょうか。TColorをStringに変換するにはどうしたらいいのでしょう。


さしすせお  2004-11-18 21:41:12  No: 11831

> TColorをStringに変換するにはどうしたらいいのでしょう。

ColorToString 関数があります。
TColor 型は整数型と等価なので integer でキャストしてセーブ、ロードは TColor
にキャストして復元できます。


チャーリー  2004-11-19 03:17:15  No: 11832

こんにちは。
書き込み:TBC.BColor:=ColorToString(ComboBox1.Canvas.Brush.Color);
このように書き込んでテキストを見てみたところ空白になってしまいます。ColorToStringの使い方はこれでいいのでしょうか。
---------------------------------
TBC.BColorはTColor型で読み込むとき、★部分で変数パラメーターに定数オブジェクトを渡すことが出きません。となってしまいます。。。。
FS := TFileStream.Create(Filename,fmOpenRead or fmShareDenyWrite);
  try
    try
      L :=Length(ColorToString(TBC.BColor));//文字列の長さ
      FS.Read(L,SizeOf(L));//FS.Read(var Buffer;Count:integer)
      SetLength(TBC.BColor,L);//指定した変数の長さに設定★
      FS.Read(PChar(TBC.BColor)^,L);
    except
      exit;
    end;
  finally
    FS.Free;
  end;


TtPIPICH  2004-11-19 05:31:16  No: 11833

単に色をStringで示すだけなら、ColorToString は必要ありません。
よく使う色は定数にして名前がついてあるので、ColorToString はそれを返すだけですから。
>TBC.BColorはTColor型で読み込むとき、★部分で変数パラメーターに定数オブジェクトを渡すことが出きません。となってしまいます。。。。
「変数の内容を関数内で変更するから、定数渡されたら変更できへん」と言うわけ。
結果が沢山ある関数はResultだけじゃかえされへんからそういうことするみたい。


っていうか  2004-11-19 05:43:34  No: 11834

何万色もあるのにすべて名前がついてるって思う方がおかしいでしょ。
なぜ、string 型にする必要があるのか理解できません。普通に integer に
キャストするとなんでもできるのに。


っていうか  2004-11-19 20:38:07  No: 11835

スレの題名が

TColorを保存するには?

ですから、もし、テキストにする必要があるんでしたら、

TextColor := IntToStr(integer(Color));

で数値をテキストとして保存し、復元は

Color := TColor(StrToInt(TextColor));

とするといいのでは。


TtPIPICH  2004-11-20 06:23:21  No: 11836

というかTColor<->Integer間はキャストしなくてもエラーがでないようです。


チャーリー  2004-12-02 06:08:31  No: 11837

こんにちは、TColor<->integer間はキャストしなくてもエラーが出ないので、stringで保存して読み込むときにTColorを復元したい。
読み込むときに★部分でエラーになってしまいます。
-----
TBC=record
BColor:string;
end;
------
TFileStream(FS)を使って書き込みfunction部分
L :=Length(TBC.BColor);
      FS.Write(L,SizeOf(L));
      FS.Write(PChar(TBC.BColor)^,L);
----------------------------------------
データ書き込み部分
TBC.BColor:=IntToStr(ComboBox1.Canvas.Brush.Color);//血統色
------------------------------------------
TFileStream(FS)を使って読み込みfunciton部分
L :=Length(TBC.BColor);//文字列の長さ
      FS.Read(L,SizeOf(L));//
      SetLength(TBC.BColor,L);//指定した変数の長さに設定
      FS.Read(PChar(TBC.BColor)^,L);
-----------------
復元するとき
Canvas.Brush.Color:=TColor(TBC.BColor);//★TColor(StrToInt(TBC.BColor))にすると、エラーになる


りおりお  2004-12-02 07:02:48  No: 11838

単純にして試してみました。

    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Button2: TButton;

を Form1 にはって、新規でためしてください。

type
TBC=record
  BColor:string;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  fs:TFileStream;
  bc:TBC;
  L:integer;
begin
  Label1.Color := clLime;
  bc.BColor := IntToStr(Label1.Color);

  L := Length(bc.BColor);

  fs := TFileStream.Create('c:\Test.txt',fmCreate or fmShareExclusive);
  try
    fs.Write(L,SizeOf(L));
    fs.Write(PChar(bc.BColor)^,L);
  finally
    fs.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  fs:TFileStream;
  bc:TBC;
  L:integer;
begin
  fs := TFileStream.Create('c:\Test.txt',fmOpenRead or fmShareExclusive);
  try
    fs.Read(L,SizeOf(L));
    SetLength(bc.BColor,L);
    fs.Read(PChar(bc.BColor)^,L);
    Label2.Color := TColor(StrToInt(bc.BColor));
  finally
    fs.Free;
  end;
end;


Mr.XRAY  URL  2004-12-02 07:50:32  No: 11839

前の方のログをあまり読んではいないのですが,とにかくTColorの値を
保存して読出すというだけでコーディングしてみました.
実際のアプリでは,TColorだけの読書きというのはないと思いますので,
いろいろ工夫は必要かと思います.

新規プロジェクトのFormにボタンとTColorDialogを各々一つづつ配置し
て下さい.ColorDialogで色を変更するとFormの色が変わります.
アプリを終了して,次回起動するとFormがその色になります.
動作確認は,WindowsXP(SP2)+Delphi5(UP1)です.

var
   AColor    : TColor;
   AFile     : TFileStream;
   AFilePath : String;

procedure TForm1.FormCreate(Sender: TObject);
begin
     AFilePath:=ChangeFileExt(Application.ExeName,'.fst');
     if FileExists(AFilePath) then begin
       AFile:=TFileStream.Create(AFilePath,fmOpenReadWrite);
       try
         AFile.Read(AColor,SizeOf(AColor));
         Self.Color:=AColor;
       finally
         AFile.Free;
       end;
     end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     if ColorDialog1.Execute then begin
       AColor:=ColorDialog1.Color;
       Self.Color:=AColor;
       AFile:=TFileStream.Create(AFilePath,fmCreate);
       try
         AFile.Write(AColor,SizeOf(AColor));
       finally
         AFile.Free;
       end;
     end;
end;

end.


りおりお  2004-12-02 08:14:48  No: 11840

いや、テキストで保存したいってことなのでは・・・


Mr.XRAY  URL  2004-12-02 08:34:56  No: 11841

>いや、テキストで保存したいってことなのでは・・・

あれまっ,そうなんですね.
失礼しました (^^;)


チャーリー  2004-12-03 02:45:23  No: 11842

解決しました。
レコード型で保存した場合の読み出しの仕方に問題があって、
TBC=record
BColor:string;
end;
だけにしたらできました。Filestreamの読み込みの仕方がまだよく分かってないのでまた聞きたいと思います。


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

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






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