2013年12月15日

dfmファイルを弄る

(Delphi Advent Calender2013投稿記事です)

BDEコンポーネントの切り替え方法として、
.dfmファイルを直接書き換える話をするのですが、.dfmファイルを直接弄るということをする人が少ないようなので、以前の記事に追加して少しまとめて見ます。テーブルコンポーネントの切り替え以外にどれだけ役に立つかは微妙なところですが、知っておくとまれに役立ちます。

.dfmファイルは、Delphi Ver5Ver6あたり(いまいちきちんと覚えていない)から、テキスト形式で保存できるようになっています。また、IDE上でテキスト表示もできます。


今回は、Delphi2007でいろいろ試しています。

メニューのツール=>オプション=>VCLデザイナで、テキスト形式で保存するかの指定ができます。
とりあえず、ボタンコンポーネントとパネルコンポーネントを張ったFromのソースを見てみます。

Objectの後に、オブジェクト名とクラス名がありその後にプロパティ(下記例では“〜〜略〜〜”の部分でこの例では省略します)が表示されます。プロパティは、デフォルト設定値以外のプロパティが表示されます。


Formも同じで、Formの中に各コンポーネントがあると構造も表現されています。


object Form1: TForm1

〜〜略〜〜

  object Button1: TButton

〜〜略〜〜
 
end

  object Panel1: TPanel

〜〜略〜〜
 
end

end


構造が表現されているという例で下記のように修正してみます

object Form1: TForm1
〜〜略〜〜

  object Panel1: TPanel

〜〜略〜〜
   
object Button1: TButton

〜〜略〜〜

  
  end

 
end

end


変更後、フォームとして表示すると、パネルコンポーネントの中に、ボタンコンポーネントが表示されるようになります。

このフォームを継承し、テキストがどのようになるか見てみます。

inherited Form2: TForm2

〜〜略〜〜

  inherited Panel1: TPanel

〜〜略〜〜
    inherited Button1: TButton

〜〜略〜〜

    end

 
end

end


object の部分がinheritedになっています。Formも同様です。


継承オブジェクトについては、このように定義が変わります。プロパティは、継承元と違うものが出力されます。

上記例では、ボタンコンポーネントとパネルコンポーネントの情報が表示されていますが、これは位置を少しずらしたため出力されていて、もし何も変えていない場合、これらは表示されません。
新たに、パネルにボタンを追加すると


inherited Form2: TForm2

〜〜略〜〜

  inherited Panel1: TPanel

〜〜略〜〜  
     inherited Button1: TButton
〜〜略〜〜
  

     end

     object Button2: TButton
〜〜略〜〜

     end
 
end

end


こんな感じで、objectが追加されることになります。


次に、コンポーネントクラスの切り替えを弄ります。

以前記事でも書きましたがDfmファイルのクラス定義を修正し、フォーム表示に切り替え後、保存すると、pasファイルとクラスの定義が違うけど、pasの定義を変更するかという確認メッセージが表示され、OKを押すと、pasファイルの定義を自動で変更してくれます。また、互換のないプロパティやイベントは無効となりますので注意が必要です(フォーム表示時に発生します。具体例は、後述)。
上記で、
Button2TBitBtnに変更します。その後、フォーム表示に変更します。見た目は変わらないのでこの状態ではわかりません。
保存します。

---------------------------

エラー
---------------------------
フィールド Form2.Button2 は TBitBtn 型であるべきですが,TButton として宣言されています。宣言を修正しますか?
---------------------------
はい(Y)   いいえ(N)   キャンセル   ヘルプ(H)  
---------------------------
というダイアログが出ます。“はい”を押した後に、
pasファイルを確認すると、

   Button2: TBitBtn;
という感じで書き換わっています。


ちょっと遊んでみます。

ここで、エディタに戻って、TBitBtn TEditに変えます。
---------------------------

フォームの読み込み中のエラー
---------------------------
Button2.Captionの読み込み中のエラー:プロパティCaptionは存在しません。エラーを無視して続行しますか?

注意:エラーを無視すると、コンポーネントまたはプロパティが失われる可能性があります。

---------------------------
無視(I)   キャンセル   すべて無視(A)  
---------------------------

“無視”を押すと、フォーム表示され、
BitBtnだったものが、Editコンポーネントに変わっています。



このように、互換のないプロパティやイベントについては無効になるので注意が必要で、重要なプログラムについて作業を行う場合、確認しながら進める必要があります。手抜きをして上記画面で“すべて無視”を選んでしまうと後で公開することもあるので面倒でも、確認しながら、“無視”ボタンをひとつづつ確認するのが無難です。


最後の例は、あまり意味ないですが、この、dfmを直接書き換える方法は、BDEコンポーネントの切り替えなどには、役立つと思います。


まだ弄ったことがない人は一度、いろいろ試してみてください。


<注意>

最後に、慣れないうちはバックアップを取ってから修正するようにしてください。修正時、コンポーネント構造がおかしくなると、フォーム表示に復活できなくなります。


posted by しんくそふと at 17:16| Comment(0) | TrackBack(0) | 開発TIPS
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/82615231
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック