フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: DFM のデフォルトプロパティの問題
DEKO
管理者
投稿数: 2693
DFM のデフォルトプロパティの問題
on: 2013/04/15 20:06 Mon

フォームのプロパティがデフォルトの値と同じ場合には、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

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.034 sec.