2012-06-06 13 views
33

あるパッケージで定義された多数のDelphiコンポーネントを、別のパッケージの同様のコンポーネントに変更する必要があります。 DFMファイルのテキスト(コンポーネントタイプとプロパティ)をテキストに置き換えることで、多くの面倒な作業を行うことができます。Delphi DFMファイルの奇妙な数[起源と必要性]

私はDFMの「機能」に出くわしのStackOverflowやGoogleを検索しましたし、今http://www.felix-colibri.com/papers/colibri_utilities/dfm_parser/dfm_parser.html

からフェリックスコリブリDFMパーサを適応していますが、パーサは上のチョークというファイル:[番号]の型仕様の後このように:これらDFMSの

inherited DialoogEditAgenda: TDialoogEditAgenda 
    ActiveControl = PlanCalendar 
    Caption = 'Agenda' 
    [snip] 
    inherited PanelButtons: TRzPanel 
    Top = 537 
    [snip] 
    inherited ButtonCancel: TRzBitBtn [0] <== *here* 
     Left = 852 
     [snip] 
    end 
    object CheckBoxBeschikbaarheid: TRzCheckBox [1] <== *here* 
     Left = 8 
     [snip] 
    end 
    inherited ButtonOK: TRzBitBtn [2] <== *here* 
     Left = 900 
     [snip] 
    end 
    end 
    inherited PageControl: TRzPageControl 
    Left = 444 
    [snip] 
    end 
    object PanelBeschikbaarheid: TRzSizePanel [2] <== *here* 
    Left = 967 
    [snip] 
    end 
    object PanelScheduler: TRzPanel [3] <== *here* 
    Left = 23 
    Top = 22 
    [...] 

多くは重く継承されます(私はすでにそのためのコリブリのコードを適応しなければならなかった)が、相続の小さなテストアプリケーションはDFMで[番号] Sを生成することができませんでした。

パーサコードを拡張する前に私の質問:これらの[番号]がどこにあるのか知っていますか?その結果、DFMファイルを解析する前に削除することはできますか?

おかげ

+1

作成順序はdfmファイルの出現順によって決まるため、削除のプロセスでは、これらはzオーダーを指定する必要があります –

+0

私は[短編YouTubeビデオ](http://youtu.be/ _DLbTpIujYQ)この質問に対する質問と回答の両方が本当に明確になることは、hvdの回答に本当に追加する唯一の点は、フォームだけでなくフォームにも当てはまるということです。 – Alister

答えて

33

これらの数字は完全に役に立たないではありません。 TATBTC、およびTBTCのクラスが両方ともTAに由来するとします。 DFMSは、次のようになります。

object A: TA 
    object X: TX 
    end 
end 

inherited B: TB 
    object Y: TY 
    end 
end 

inherited C: TC 
    object Y: TY [0] 
    end 
    inherited X: TX [1] 
    end 
end 

BCそのXYサブコンポーネントの順序が逆になっていることで異なっています。サブコンポーネントの順序の正確な意味はコンポーネントによって異なります(下を参照)が、TWinControlの子孫、またはTWinControlから派生しない子孫の両方がTControlである場合、Xが、、Xを超えています。

これらの数字を削除するとフォームが変更される可能性があるため、盲目的に行うべきではありません。ただし、目的に応じて、パーサ(ソースコードが利用可能と思われる)を変更して、単に数値をスキップすることができます。

コンポーネントの相対的な順番は一般的にはあまり重要ではありませんが、いくつかの例外があります。もう少し詳細に説明する:正常対照について

、サブコンポーネントは、最終的にTWinControlから派生していない(1)TControl子孫、次いで(2)TWinControl子孫、(3)任意の非TControlコンポーネントで開始します。これらの各コンポーネントでは、コンポーネントの相対的な順序は調整可能です。コントロールの場合、「前面に持ってくる」と「戻るに送る」は、コントロールをできるだけ移動させます。TWinControlは、 TWinControl。非コントロールの場合、(わずかに誤った名前の)「作成順序」オプションを使用すると、順序を変更できます。つまり、2つのラベル(AとB)、2つの編集コントロール(CとD)、データセットとデータソース(EとF)があるとします。たとえば、ABCDEF、BACDEF、ABDCFE ACBDEFではなく、

DFMファイルに保存すると、その順序が保持されます。ビジュアル継承を使用しない場合、コンポーネントは単に保存され、順番に再ロードされます。継承を使用すると、DFMファイルは処理された基底に派生するため、上記の場合、TCが作成されると、そのXメンバーはです。Yメンバーの前に常にが作成されます。部品注文が重要な場合は、後で注文を修正するようDelphi RTLに指示するために[0][1]が必要です。

実際にコンポーネントの注文はコンポーネントの種類によって異なります。 「Bring to front」/「Send to back」という名前が示すように、コントロールはコンポーネントオーダーを使用してZオーダーを指定します。他のコンポーネントタイプでは、コンポーネントが意味するものは何でも意味します。たとえば、メニューでは、コンポーネントの順序を使用して、メニュー項目の順序(上から下)を指定できます。ツールバーコントロールは、ツールバーボタン自体がコントロールしていなくても、コンポーネントオーダーを使用してツールバーボタンの順序を指定することができます。データセットは、コンポーネントの順序を使用してフィールドの順序を指定し、それによって列のデフォルトの順序もTDBGridに指定します。

+6

+1。私はDFMファイルでこの構文を見たことがなく、質問と答えの両方を読むのは面白いです。 –

+0

ありがとうございます。その後、パーサを更新する必要があります(悲しいかな)。私は* DFMから数字を削除しようとしましたが、IDEでアプリを再読み込みした後に自動的に再表示されました。それらは、DFMファイル内のコンポーネントの順序だけでなく、異なっていました。 –

+1

同じことをしたい人たちのための迅速なフォローアップ:私たちはColibriパーサを断念しました。オブジェクトがネストされている方法には関心がないので、 'object'/'inherited'から 'end'までのASCIIテキストブロックを解析し、これらのブロックを処理して書き戻します。 –

関連する問題