Delphi6 Entと Delphi 2005 Proを使って確認していますが、
DelphiのTEditとTComboBox等、Enabled := Falseにした場合、他言語(VB6や、Win32SDK等)と動作が違う為、
みなさんどのような感じで、やっているか教えて下さい。
TEditや、TComboBox等のVCLコンポーネントがDelphi(6,2005)で
TEdit.Enabled := False;
TComboBox.Enabled := False;
とEnabledを使用不可にした場合、背景色が変わらない事に疑問を持っています。
通常Win32SDKやVB6の場合は、Win2kやWinXPまで(非Vistaや7)なら、
EnabledプロパティをFalseにすれば、背景が灰色になりつつ、文字色もグレーになります。
Delphiの場合、EnabledをFalseにしてもなりません。DelphiのVCL側で何かやってるんでしょうか?
みなさんは、通常のWindows仕様と合わせる為、
TEdit.Enabled := False;
TEdit.Color := clBtnFace;
とセットしているんでしょうか?
ちなみに、背景色が変わるのは、Windowsのシステムカラーに関係している為、
Vistaの場合は、Enabled := Falseにしても、背景色が白なのがWindows的な仕様の為、OS的な環境依存にも影響されたくないので、
上記のようなColorプロパティを固定にclBtnFaceに設定したくはないです。
ちょっとうまく説明できていませんが、目的は、Windows自体の通常のEditやComboBoxのコントロールと同じ動作仕様にしたいのが目的です。
これに関して、DelphiのVCL側の動作仕様や、回避方法に関して、何かご存じであれば教えて頂きたいです。
他にも、Delphi 2009やDelphi 2010ならVCL側に修正があって、Delphi 2009だとEnabled := Falseにすれば同じ動作するよという情報でも結構です。
Delphiは Enabledを変えたときに CM_ENABLEDCHANGEDメッセージを送るだけで、それ以外に何もしていない。
ということは、他言語(VB6や、Win32SDK等)の方が背景色を変える特別のことをやってたりして。
SDKレベルでいうと、通常はコントロールから親ウィンドウにWM_CTLCOLOREDITなどのメッセージが飛んできます。
それを何も処理しないでDefWindowProcに渡すと、Disabledの時には灰色になるという仕組みです。
Delphiの場合、TControl.Colorプロパティで背景色を変更できるので
VCL内でWM_CTLCOLORxxxを処理して色を設定していたと思います。
そこでEnabledによって処理を変えていないのは、考え漏れというよりは
「Enabled=falseだとColorの設定が効かない」
というクレームを回避するために、あえてやっていないのだと思われます。
私はTEditなどの標準コントロールから派生クラスを一式作り、Enabledが変わったら自動的にColorを変更するようにして使っています。
OSの標準動作に合わせるなら、フォームの方でWM_CTLCOLOR系(あるいは対応するCM系メッセージ)を乗っ取ってDefWndProcに渡してやるといいのかもしれません。
遅いレスすいません。
torさんの細かい説明で、大体納得しました。
> 「Enabled=falseだとColorの設定が効かない」
とかありそうですね。
あと、torさんのようにDelphiの場合、複数のコントロールを同じように制御しやすいように、
基本的に全てのコンポーネントの派生クラスを作っておき、共通仕様的に差異を吸収させたりして、
使うのがベストのような気がしてきてます。
後は、色々やってみようと思います。皆さん助言ありがとうございました。
ツイート | ![]() |