2017-11-17 3 views
2

dfmからコンポーネントが作成されるのをスキップする方法はありますか?dfmからコンポーネントが作成されないよう手動でスキップ

私は時には作成したくないビジュアルコンポーネントを持っています。もちろん、コンポーネントを手作業で作成することもできますが、コンポーネントには多くの項目があるため、これは多くの作業になります。

答えて

8

実際には、です。特定のクラスのコンポーネントをスキップする例を次に示します。

procedure TForm224.DoCreateComponent(Reader: TReader; ComponentClass: TComponentClass; var Component: TComponent); 
begin 
    if ComponentClass = <whatever component class shall be skipped> then begin 
    Abort; 
    end; 
end; 

procedure TForm224.DoReaderError(Reader: TReader; const Message: string; var Handled: Boolean); 
begin 
    Handled := True; 
end; 

はその後、フォームのReadState()方法この方法をオーバーライドします:

これらに類似フォームに2つのイベントハンドラを追加します。

procedure TForm224.ReadState(Reader: TReader); 
begin 
    Reader.OnError := DoReaderError; 
    Reader.OnCreateComponent := DoCreateComponent; 
    inherited; 
    Reader.OnError := nil; 
    Reader.OnCreateComponent := nil; 
end; 

が、そのコンポーネントのクラスの複数のインスタンスがあり、あなたが必要な場合個々のインスタンスを確認するには、TReader.OnSetNameイベントを使用できます。

procedure TForm224.ReadState(Reader: TReader); 
begin 
    ... 
    Reader.OnSetName := DoSetName; 
    inherited; 
    Reader.OnSetName := nil; 
    ... 
end; 

procedure TForm224.DoSetName(Reader: TReader; Component: TComponent; var Name: string); 
begin 
    if Name = <instance name> then begin 
    Abort; 
    end; 
end; 
+1

これは、他のリーダーエラーをコンポーネントをスキップする意図として扱う点です。これは、OnErrorイベントハンドラで検出できるセンチネルメッセージを使って例外を作成することで(むしろやっかいな方法で)避けることができます。 –

+1

もう一つの大きな欠点は、それが*個々のコンポーネントには適用できないということです。 ( 'Component'は' nil'に設定されています)。 – kobik

+1

これは賢明であるという点で十分ですが、このような厄介な芝生をレポに投入することに決めた開発者を殺したいというのはそのようなものです。実行時にコンポーネントをこれよりも管理する方が良い方法があります。 –

6

dfmからコンポーネントをスキップする方法はありますか?

私の意見では、これを行うにはクリーンな方法はありません。私はあなたがフォームデザイナーを使って適用できるメソッドを探していると思います。

Uweの答えは、あなたが求めるものを実際に行うコードベースの方法を示していますが、私は個人的には実用的には扱いにくいと考えています。さらに、Uweの答えでは、オプションのコンポーネントがそのクラスの唯一のコンポーネントである必要があります。それは現実的ではありません。私の見解では

、最良の選択肢のいずれかです:

  1. は、コンポーネントが.DFMストリーミングの一部として自動的に作成されており、それを破壊するか、実行時にそれを隠すのいずれか。
  2. 実行時にオプションでコンポーネントを作成します。
+3

実際に私の答えに記述されている方法があります。 –

+0

@J ...あなたは正しいです、特にkobikのポイントを考慮に入れるとき。 –

関連する問題