フォームのプロパティがデフォルトの値と同じ場合には、DFM に値が格納されません。フォームのプロパティがデフォルトの値と異なる場合のみ、DFM に値が保存される事になります。しかしながら、このデフォルト値が Delphi のバージョンによって異なる事があるため、面倒な問題を引き起こす事があります。
Font プロパティ
Font は Delphi 2005 またはそれ以降で、Tahoma に変更されています。日本語版の場合、以前は "MS Pゴシック" でした。プロパティがデフォルト値と同じであっても異なっていても DFM へ保存されるため、通常は問題になる事はありません。問題になるのは、フォームを動的に生成している場合です。この場合には明示的にフォントを指定しなくてはなりません。
program Project1;
uses Windows, Forms, Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin Application.Initialize;
with Application.DefaultFont do begin Name := 'MS Pゴシック'; Size := 9; Charset := SHIFTJIS_CHARSET; end;
Application.MainFormOnTaskbar := True; Application.CreateForm(TForm1, Form1); Application.Run; end.
Application.DefaultFont をこのように設定し、各フォームの ParentFont を True にする事で対処できます。
Position プロパティ
Position は Delphi 2005 またはそれ以降で、poDefaultPosOnly に変更されています。以前は poDesigned でしたが、この値にしている事はまずない (していたとしても、フォームの位置をコードで指定する事が多いため) ので、そう問題になる事はないと思います。
TPanel.ParentBackground プロパティ
古いプロジェクトを比較的新しい Delphi で開くと TPanel が透明になってしまう事があります。オブジェクトインスペクタで ParentBackground プロパティを False にして下さい。ParentBackground プロパティが False なのに透明な場合には、一旦 True にしてから False に設定してみてください。
TLabel.Transparent プロパティ
Transparent は Delphi 2007 またはそれ以降で True に変更されています。真にやっかいな問題を抱えているのはこのプロパティです。
・Delphi 2006 またはそれ以前で、Transparent プロパティが False (デフォルト) のフォームを Delphi 2007 またはそれ以降で読み込ませた場合
そのままコンパイルすると Transparent が True になってしまい、Color プロパティの指定が利きません。
・Delphi 2007 またはそれ以降で、Transparent プロパティが True (デフォルト) のフォームを、Windows テーマが無効な PC で読み込ませた場合
テーマが無効な PC の場合、Delphi 2007 またはそれ以降であってもデフォルトプロパティは False になります。
つまり、同一 Delphi バージョン、同一ソースであるのに Windows テーマ有効 / 無効の違いで生成されるバイナリが異なる事になります (QC#92147)。
・Delphi 2007 またはそれ以降で、Transparent プロパティが True (デフォルト) のフォームを持つアプリケーションの場合で、プロジェクトオプションでランタイムテーマを無効にしている場合
Transparent は True ですが、実行すると Transparent は False になり、Color プロパティの影響を受けます。
・Delphi 2007 またはそれ以降で、Transparent プロパティが True (デフォルト) のフォームを持つアプリケーションの場合で、Windows テーマが無効な PC でアプリケーションを実行した場合
Transparent は True ですが、実行すると Transparent は False になり、Color プロパティの影響を受けます。
procedure TForm1.FormCreate(Sender: TObject); var i: Integer; begin for i:=0 to ComponentCount-1 do if (Components[i] is TLabel) then (Components[i] as TLabel).Transparent := True; // または False ... end;
無用な混乱を防ぐためには、各フォームの OnCreate の先頭で "プロジェクトが意図するデフォルトの Transparent プロパティ" を指定した上で、個々の Transparent プロパティをコードで明示的に指定する必要があります。
See Also:
[今更聞けない Delphi のコト (フォームファイル編)]
http://ht-deko.minim.ne.jp/tech032.html
[QC#92147: When changed Windows theme, the Transparent property is changed.]
http://qc.embarcadero.com/wc/qcmain.aspx?d=92147
|