1

フォームに多くのコンポーネント(パネル、タブ、編集、コンボボックスなど)があるアプリケーションがあります。ただし、ユーザープロファイルによっては、それらのほとんどが自動的に入力されたり、表示されなかったりする場合があります。したがって、ユーザーは作業をより速く行うことができます。

質問:実行時に所有権を作成、配置、変更するなどの簡単な方法はありますか?特定のユニットに対して2つの.dfmファイルを作成してから、使用する.dfmをアプリケーションに指示するものがあります。例:「Hey!ユーザーは上級者です。Unit1Advanced.dfmを使用してください!」実用的な例がいいでしょう。Delphi 7でも使用したいのですが、少なくともDelphiXEでは機能する必要があります。

今までに存在することを私が知っていること:

  1. ComponentsToCodeGExpertsの関数は、この回答で指摘されているgabrのように、特定のコンポーネントからコードを作成できます。
  2. 2つのフォームを作成し、実行時に目的のフォームを作成できます。ただし、これは、追加の.dfmファイルごとに1つの追加の.pasファイルを意味します。これは維持するのが難しいでしょう。
  3. この答えはヒントを与えるようです。しかし、私はTReaderクラスとTWriterクラスに慣れていません...
4

4 に答える 4

4

私はあなたのポイント2に基づいてあなたに解決策を与えることができます:経験の浅いユーザーのためのフォームから始めて、必要に応じてすべてのコントロールを配置し、pasファイルに必要なコードを実装します。次に、最初のフォームから継承した新しいフォームを作成し、経験豊富なユーザーのニーズに合わせて調整します。必要に応じて、実装を追加することもできます。

より柔軟なアプローチは、共通のアンカーから両方のフォームを継承することです。このスキームの実際の実装は、状況によって大きく異なります。

于 2011-12-10T13:37:00.793 に答える
3

複数の.dfmファイルに対して1つの.pasファイルのみを使用したいという要望は次のとおりです。ほぼ不可能ですが、少し理解できないこともあります。コードは、より高度でない形式に制限されます。 可能ですが、実際にはお勧めしません

分離要件について:

  • 作成:2つのデザインを作成し、Uweが言及しているようにVisual Form Inheritance(VFI)によってこれを行うため、個別のメンテナンスの問題は発生しません。
  • 位置とサイズ:これは非常に悪い考えです。コントロールを各ユーザーの同じ場所にとどまらせます。ユーザーは高度な特権を取得し、見慣れない配置にショックを受ける可能性があります。私が作る唯一の例外は、フォームの最小サイズです。高度なバージョンは、より高く、および/またはより広くなる可能性があります。
  • 所有権の変更:ええ、私はあなたが何を意味するのか理解していますが、コントロールはユーザーによって所有されていませんし、所有されるべきでもありません。作成するフォームのタイプを処理するある種のコントローラーを実装します。

VisibleVFIがオプションでない場合は、高度なフォームのみを設計し、リンクされたアクションのプロパティを設定することで高度なコントロールの非表示を制御することをお勧めします。Advanced: Booleanこれは、存在するはずのプロパティのセッター内またはセッターを介して行います。または、すべての高度なコントロールを1つ以上のコンテナー(グループボックス、パネル、またはLU RDコメントなどのフレーム)でグループ化します。次に、そのコンテナの可視性を設定するだけです。現在のスクロールバーは、それに応じて自動的に調整または非表示になります。必要がない場合でも、これらのコントロールに対処できることに注意してください。

于 2011-12-10T17:47:16.350 に答える
2

警告:この回答は、質問を完全にするためのものであり、実験目的でのみ使用されます。実際のシナリオでは使用しないでください。

1つのソースコードファイルに対して2つの別々のフォーム定義ファイルが必要です。

CreateNew重要なのは、コンストラクターを利用することです。そのドキュメントを引用するには:

関連付けられた.DFMファイルを使用してフォームを初期化せずにフォームを作成するには、Createの代わりにCreateNewを使用します。

  1. まず、高度なフォームを作成します。

    unit Advanced;
    
    interface
    
    uses
      Classes, Controls, Forms, StdCtrls;
    
    type
      TAdvancedForm = class(TForm)
        StandardGroupBox: TGroupBox;
          StandardButton: TButton;
        AdvancedGroupBox: TGroupBox;
          AdvancedButton: TButton;
        procedure StandardButtonClick(Sender: TObject);
        procedure AdvancedButtonClick(Sender: TObject);
      end;
    
    implementation
    
    {$R *.dfm}
    
    procedure TAdvancedForm.StandardButtonClick(Sender: TObject);
    begin
      Caption := Caption + ' Button1Click';
    end;
    
    procedure TAdvancedForm.AdvancedButtonClick(Sender: TObject);
    begin
      Caption := Caption + ' Button2Click';
    end;
    
    end.
    
  2. アプリを作成し、にコピーAdvanced.dfmStandard.dfmます。

  3. テキストエディタで開きStandard.dfm、高度なコンポーネント(この場合はボタンを含む高度なグループボックス)を削除し、フォームとフォームタイプの名前を次のように変更します(T)StandardForm

    object StandardForm: TStandardForm
      ...
      object StandardGroupBox: TGroupBox
        ...
        object StandardButton: TButton
          ...
        end
      end
    end
    
  4. 標準フォームのリソースを次の場所に追加しAdvanced.pasます。

    {$R *.dfm}
    {$R Standard.dfm}
    
  5. そして今、次のコードで、同じソースファイルの両方のフォーム定義を開くことができます。

    uses
      Advanced;
    
    procedure TForm1.OpenAdvancedFormClick(Sender: TObject);
    var
      Form: TAdvancedForm;
    begin
      Form := TAdvancedForm.Create(Application);
      Form.Show;
    end;
    
    procedure TForm1.OpenStandardFormClick(Sender: TObject);
    var
    {
      Form: TAdvancedForm; // This is tricky! The form we are about to create has
                           // no AdvancedGroupBox nor AdvancedButton, so make sure
                           // you are not calling it with code completion.
      Form: TStandardForm; // Compiler has no knowledge of TStandardForm!
    }
      Form: TForm;         // So declare your form as TForm!
    begin
      // But create it as TAdvancedForm, otherwise components will not be found!
      Form := TAdvancedForm.CreateNew(Application);
      ReadComponentRes('TStandardForm', Form);
      Form.Show;
    end;
    
于 2011-12-13T00:23:28.050 に答える
0

DevExpressExpressLayoutコンポーネントが役立つ場合があります-http://devexpress.com/Products/VCL/ExLayoutControl/を参照してください

ランタイムフォームのカスタマイズ-ランタイムコントロールのカスタマイズ-画面解像度の独立性などを提供します

于 2011-12-10T13:28:06.193 に答える