こんいちは、チャーリーです。
-----
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に変換するにはどうしたらいいのでしょう。
> TColorをStringに変換するにはどうしたらいいのでしょう。
ColorToString 関数があります。
TColor 型は整数型と等価なので integer でキャストしてセーブ、ロードは TColor
にキャストして復元できます。
こんにちは。
書き込み: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;
単に色をStringで示すだけなら、ColorToString は必要ありません。
よく使う色は定数にして名前がついてあるので、ColorToString はそれを返すだけですから。
>TBC.BColorはTColor型で読み込むとき、★部分で変数パラメーターに定数オブジェクトを渡すことが出きません。となってしまいます。。。。
「変数の内容を関数内で変更するから、定数渡されたら変更できへん」と言うわけ。
結果が沢山ある関数はResultだけじゃかえされへんからそういうことするみたい。
何万色もあるのにすべて名前がついてるって思う方がおかしいでしょ。
なぜ、string 型にする必要があるのか理解できません。普通に integer に
キャストするとなんでもできるのに。
スレの題名が
TColorを保存するには?
ですから、もし、テキストにする必要があるんでしたら、
TextColor := IntToStr(integer(Color));
で数値をテキストとして保存し、復元は
Color := TColor(StrToInt(TextColor));
とするといいのでは。
というかTColor<->Integer間はキャストしなくてもエラーがでないようです。
こんにちは、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))にすると、エラーになる
単純にして試してみました。
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;
前の方のログをあまり読んではいないのですが,とにかく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.
いや、テキストで保存したいってことなのでは・・・
>いや、テキストで保存したいってことなのでは・・・
あれまっ,そうなんですね.
失礼しました (^^;)
解決しました。
レコード型で保存した場合の読み出しの仕方に問題があって、
TBC=record
BColor:string;
end;
だけにしたらできました。Filestreamの読み込みの仕方がまだよく分かってないのでまた聞きたいと思います。
ツイート | ![]() |