きわめて初歩的なので、恥ずかしいのですが、
ColorDialogで色の設定を下あと、このTcolor値を保存して、カスタマイズ用フィルを作ろうと思うのですけど、
type myColors =record
color1:integer;
color2:integer;
end;
とやると、Tcolorと互換性がない、とエラー表示が出ました。integerの他に
TstringsとかString[xx]とかやっても同じエラーが出ました。
すいません、ヘルプで分かりませんでした。型変換のヘルプも参考にしようとしたのですけど、基礎知識不足でわかりませんでした。
どなたか、アドバイスをいただけませんでしょうか。
color1に、どのような値を登録するか解りませんが、もしTColor型の値を登録したいのであれば、
color1: TColor;
color2: TColor;
ではだめですか?
もし無理ならば、color1に値を入れるときに、
color1 := TColor(intValue);
とすれば、型変換されます。
にしの様、早速アドバイスをいただきありがとうございます。
type TmyColors=record 宣言で
color1:TColor;
color2:TColor;
end;
var myColors:TmyColors;
として、
coColorDialog1.CustomColorsの値はTStringsですので
myColors.color1:=TColor(coColorDialog1.CustomColors);
としてみましたが、
TStringsでの16進数文字列をこれではうまく格納できませんでしたし、
RichEdit1.SelAttributes.Color:=myColors.color1 としても色がちょっと変色する程度で設定したはずの色は出ません。
また、上記の宣言で逆にTStringsの方を使って
color1;TStrings;
color2:Tstrings; とやってみましたが、やはり、上と同様に、型変換のところで値が変形してしまって、色に反映されませんでした。
住みません、お手数掛けますが、どうかもう一度お教え下さい。
どなたもこんな低級な質問をなさらないので本当に気が引けます。。。。
例の「開発者ガイド」っていう本、一体僕のような低級ユーザには何の価値があるのか分かりかねます。
TColorDialogのCustomColorsは、ヘルプを見ての通り
ColorX=16進数文字列
です。
つまり、ここに複数色が格納されています。
myColorsは2色分だけです。
やりたいことは、
1.複数色のうち、2色だけ保存したい。
2,複数色全てを保存したい。
のどちらでしょうか。
1ならば、
myColors.color1 := TColor(StrToIntDef("#0" + ColorDialog1.CustomColors.Values['ColorA'], 0);
myColors.color2 := TColor(StrToIntDef("#0" + ColorDialog1.CustomColors.Values['ColorB'], 0);
としまs。
2ならば、TMyColors型から間違っています。
# 2色分しか保存できないため
作るのであれば、
TMyColors=record
Colors: array [0..15] of TColor;
end;
とし、
for i := 0 to 15 do MyColors.Colors[i] := TColor(StrToIntDef("#0" + ColorDialog1.CustomColors.Values['Color' + Chr(Ord('A') + i)], 0);
とするべきです。
# 16色全て保存します。
使い方は、
RichEdit1.SelAttributes.Color := MyColors.Colors[0];
のようになります。
付属の開発者ガイドより、初心者向けDelphi解説書を読んだ方がわかりやすいと思います。
にしの様、どうもありがとうございます。
私のしようとしているのは1.のほうです。確かにヘルプのその箇所を見るとColorA〜Pまで合計して16色が設定できるとなっていますね。
ColorAはTstring型ですね。var ColorA, B, C, D:TString;
としておけば、ColorDialog1.Executeでここに16進数文字列が入るのですね。
myColors.color1 := TColor(StrToIntDef("#0" + ColorDialog1.CustomColors.Values['ColorA'], 0);をじっさいはしらせてみますと、「”#0”」でまず最初のエラーが出ましたが。。。。なぜcolorAを引用符でくくるのですか?お教えいただければ幸いです。
何でわざわざTcolor型に変換する必要があるんですか?
アプリのユーザーに色を選択させて、その作成した色も保存したいのなら、
Tstringsのまま保存した方が、色を復元するも楽ですよ。
const
MY_COLOR_FILE = 'MyColors.dat';
procedure TForm1.Button1Click(Sender: TObject);
begin
//保存された色ファイルがあれば、読み込んで色を復元する
if FileExists(MY_COLOR_FILE) then begin
ColorDialog1.CustomColors.LoadFromFile(MY_COLOR_FILE);
end;
if ColorDialog1.Execute then begin
RichEdit1.SelAttributes.Color := ColorDialog1.Color and $ffffff;
ColorDialog1.CustomColors.SaveToFile(MY_COLOR_FILE);
end;
end;
ありがとうございます、Passengerさま.
あの、まだ試せないでいますけど、これだと一色の保存のために一ファイルが必要になるわけですね。私の希望は4ないし5色です。1つのファイルに色情報をまとめたいのですが。。。
(大変参考になります。TStringsをそのままフィアルに預けちゃうってのは楽ですね。確かに)
引き続き、アドバイスをお願いできませんか?一つのファイルに複数の色情報を保存、(そしてたぶんこれができれば逆のに、ファイルからの色情報はRichEdit1.SelAttributes.Color でちゃんと処理できるはずと踏んでます)
いつまでたっても分からない私ですが、よろしく。
記述間違いでした。
"#0"でなく、'#0'です。
> なぜcolorAを引用符でくくるのですか?お教えいただければ幸いです。
ヘルプを見ましょう。
TStrings型の、Valuesプロパティは、
property Values[const Name: string]: string;
となっていますよね。だから引用符でくくる(文字列が入る)のです。
> あの、まだ試せないでいますけど、これだと一色の保存のために一ファイルが必要になるわけですね。
もしかして、ColorDialogは1色を取得するために使用しています?
CustomColorsの値を、SelAttributes.Colorに設定していたので、てっきりColorDialogのパレットに全ての色を設定して、それを使って何かしようとしているのかと思いましたが・・・。
それとも、パレットに値を設定して、OKを押す、ということでしょうか。
それならば、今までの説明でできるはずです。
1色ずつ設定する場合は次のようになります。
ColorDialog1.ExecuteでTrueが帰ってきたとき、取得したい色はColorDialog1.Colorに入っています。
TColor型なので、
.SelAttributes.Color := ColorDialog1.Color;
でうまく動きます。
各色を、ColorDialog1.Executeで1色ずつ指定した後、Attributesに指定された色(4〜5色)を保存するには、また別の方法をとります。
これらを保存したい場合は、その形式にも依りますが、TStringList型を用意して、Values['Color1'] := IntToStr(...)として、最後にSaveToFileするか、TIniFileやTMemIniFileを用意して、WriteIntegerして最後にUpdateFilesするかです。
それぞれ、TStringList, TIniFile, TMemIniFileを参照してください。
# 64KB以上のINIFILEは扱えない場合があります。
にしの様、Passengerさま、ありがとうございました。
最後の最後になってやっとこさ分かりました: ColorDialog1.の間違ったプロパティを読み取っていました。customColorsでなくてcolorでした。なんだ、型変換も要りませんでしたね。でもいい勉強になりました。すばらしいForumですね、ここは。今後もよろしくお願いいたします。
ツイート | ![]() |