dfmからコンポーネントが作成されるのをスキップする方法はありますか?dfmからコンポーネントが作成されないよう手動でスキップ
私は時には作成したくないビジュアルコンポーネントを持っています。もちろん、コンポーネントを手作業で作成することもできますが、コンポーネントには多くの項目があるため、これは多くの作業になります。
dfmからコンポーネントが作成されるのをスキップする方法はありますか?dfmからコンポーネントが作成されないよう手動でスキップ
私は時には作成したくないビジュアルコンポーネントを持っています。もちろん、コンポーネントを手作業で作成することもできますが、コンポーネントには多くの項目があるため、これは多くの作業になります。
実際には、はです。特定のクラスのコンポーネントをスキップする例を次に示します。
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;
dfmからコンポーネントをスキップする方法はありますか?
私の意見では、これを行うにはクリーンな方法はありません。私はあなたがフォームデザイナーを使って適用できるメソッドを探していると思います。
Uweの答えは、あなたが求めるものを実際に行うコードベースの方法を示していますが、私は個人的には実用的には扱いにくいと考えています。さらに、Uweの答えでは、オプションのコンポーネントがそのクラスの唯一のコンポーネントである必要があります。それは現実的ではありません。私の見解では
、最良の選択肢のいずれかです:
実際に私の答えに記述されている方法があります。 –
@J ...あなたは正しいです、特にkobikのポイントを考慮に入れるとき。 –
これは、他のリーダーエラーをコンポーネントをスキップする意図として扱う点です。これは、OnErrorイベントハンドラで検出できるセンチネルメッセージを使って例外を作成することで(むしろやっかいな方法で)避けることができます。 –
もう一つの大きな欠点は、それが*個々のコンポーネントには適用できないということです。 ( 'Component'は' nil'に設定されています)。 – kobik
これは賢明であるという点で十分ですが、このような厄介な芝生をレポに投入することに決めた開発者を殺したいというのはそのようなものです。実行時にコンポーネントをこれよりも管理する方が良い方法があります。 –