2

Delphi 2007/2009の奇妙な質問はここにあります:

設計時に定義されたコンポーネントプロパティに基づいて、ファイルをリンクに含めるか、ファイルを残すことができますか?

例:SomePropertyをtrueのままにすると、コンパイル時にユニットSomeUnitがプロジェクトに含まれます。それ以外の場合は含まれません。

この問題に対する私の2番目のアプローチは、2番目のコンポーネントをデプロイすることです。このコンポーネントは、フォームにドロップされると(またはドロップされない場合)、uses句にユニットが含まれます。しかし、それがプロパティで実行できるのであれば、それはより良いでしょう。

プロジェクトがビルドされるたびにコンポーネントが強制的にビルドされるため、IFDEFによる条件付きコンパイルは避けたいと思います。か否か?

プロジェクトにいくつかのユニットを含める簡単な方法を実現しようとしています。そうすれば、それらのユニットが特定のデータベースのサポートを提供します。これらをオプションに含めることは、接続コンポーネントで理想的には簡単です。サポートを確認すれば完了です。チェックを外し、コンパイルされたAPPでKBをいくつか減らします。

編集:たとえば、コンポーネントの方法を使用します。IFDEFの方法などは知っていましたが、プロジェクトをビルドするたびにコンポーネントをビルドする必要があります。か否か?

プロジェクトにいくつかのユニットを含める簡単な方法を実現しようとしていました。そうすれば、そのユニットが特定のデータベースのサポートを提供します。これらをオプションに含めることは、接続コンポーネントで理想的には簡単です。サポートを確認すれば完了です。チェックを外し、コンパイルされたAPPでKBをいくつか減らします。

4

6 に答える 6

6

いいえ。

何を解決しようとしていますか?

コンポーネントのプロパティに基づいてオプションでリソースを含めるコンパイル後の手順を追加できますが、そのような機能を実装するにはコーディングを行う必要があります。

于 2009-01-13T19:53:54.373 に答える
4

{$IFDEF youridentifier} オプション コード {$ENDIF} メソッドを使用して、データを条件付きでアプリケーションにコンパイルし、それを有効にするには、プロジェクト オプションに移動して、適切なオプション フィールドに youridentifier を入力するだけです。これを行う別の方法は、以下をユニットの先頭 (またはインクルード ファイル) に追加することです。

{$DEFINE youridentifier}

あなたの識別子を強制します。無効にするには、$ の直前にピリオドを置きます:

{.$DEFINE youridentifier}

これらの手法を使用すると、条件付きでコードを取り込んだり、コンパイルごとにコードを置き換えたりすることが簡単になります。

于 2009-01-13T20:08:36.247 に答える
3

IDE アドインを作成します。「コンパイル前」の通知を処理し、プロジェクト内のフォームまたはデータ モジュールに目的のタイプのコンポーネントがあるかどうかを確認し、それらのプロパティを確認します。そこにあるものに基づいて、ユニットの内容を変更して、選択した他のユニットを使用できます。確かに簡単ではないように思えますが、可能だと思われます。

2 番目のアイデアは非常に簡単です。TXPManifestたとえば、それはまさにコンポーネントが行うことです。そのようなコンポーネントをフォームから削除しても、関連するユニットが「使用されない」わけではないことに注意してください。

さまざまなデータベースのサポートを条件付きで追加するには、ランタイム パッケージの使用を検討してください。(結局のところ、これが IDE が非常に多くの異なる種類のコンポーネントをサポートする方法です。) 各データベースのカスタム コードを異なるパッケージに入れます。次に、サポートするデータベースは、実行時に利用可能なパッケージがあるデータベースです。コンパイル時または設計時の構成は不要です。ただし、これに対する障害は、利用可能なパッケージを管理し、それらのどれがデータベース サポートを提供するパッケージであるかを判断することです。

于 2009-01-13T19:58:21.883 に答える
1

あなたが求めていることを行う方法はありませんが、uses リストに含まれているが参照されていないユニットが実行可能ファイルのサイズに与える影響は最小限であることに気付いていない可能性があります。Delphi のスマート リンカは、使用されていないコードを非常にうまく削除します。コンポーネントによって参照される「オプションのユニット」に注意し、その中にグローバルに実行されるコードがない場合 (すべてが 1 つまたは複数のクラスに自己完結している)、それがuses 句で使用されていないか、uses 句でまったく使用されていません。

これにより、あなたがやりたいと思うことを簡単に実行できるようになります。つまり、アプリケーションにリンクできるユニットを含むフォームにコンポーネントをドロップすることです。コンポーネントを削除すると、ユニット内でリンクされなくなります。ただし、使用されるユニットに含まれるリソース ($R ディレクティブに含まれるフォームやその他のアイテムなど) は、実行可能ファイルに含まれると思います。

于 2009-01-16T16:15:51.107 に答える
1

DesignIntf​​.RegisterSelectionEditor を使用して選択エディタを登録し(ISelectionEditor に関する Delphi ソース コードのコメントを参照)、RequiresUnits プロシージャを使用して uses 句に追加のユニットを含めることができます。

TMySelectionEditor = class(TSelectionEditor)
public
  procedure RequiresUnits(Proc: TGetStrProc); override;
end;

procedure Register;

implementation

procedure TMySelectionEditor.RequiresUnits(Proc: TGetStrProc);
var
  comp: TMyComponent;
  I: Integer;
begin
  inherited RequiresUnits(Proc);
  Proc('ExtraUnit');  
  // might be a better way of doing the code from here onwards?
  if (Designer=nil)or(Designer.Root=nil) then Exit;

  for I := 0 to Designer.Root.ComponentCount - 1 do
  begin
      if (Designer.Root.Components[i] is TMyComponent) then
      begin
        comp := TMyComponent(Designer.Root.Components[i]);
        if comp.SampleProperty = True then
            Proc('ExtraUnit2');
        Proc(comp.ObjProperty.UnitName);
      end;
  end;
end;

procedure Register;
begin
  RegisterSelectionEditor(TMyComponent, TMySelectionEditor);
end;
于 2010-07-10T01:03:21.370 に答える