1

小さなメニューから複数のパネルにアクセスできるシングルウィンドウアプリケーションを作成したいと思います。パネルを片側からスライドさせたい。

私は小さなデモアプリケーションを実行しましたが、すべてが機能します。唯一の問題は、デモアプリ用に1つのフォームに約7つのパネルがあることです。それらはすべて互いに重なり合っているため、これらのパネルの概要を維持したり、変更したりするのは困難です。

そこで、パネルごとに追加のユニットを作成し、パネルを好きなようにデザインして変更し、コードを使用してメインフォームに追加したいと思いました。

フォームのfmxファイルを調べて、パネル用に1つ作成しました。また、パネル用に.pasを作成しました。

Unit2.pas:

unit Unit2;

interface

uses ...

type
  TPanel1 = class(TPanel)
  Label1: TLabel;
end;
var
  Panel1: TPanel1;

implementation
{$R *.fmx}

end.

Unit2.fmx:

object Panel1: TPanel1
  Left = 0
  Top = 0
  Caption = 'Panel1'
  ClientHeight = 551
  ClientWidth = 800
  Visible = False
  StyleLookup = 'backgroundstyle'
  object Label1: TLabel
    Position.Point = '(8,8)'
    Width = 120.000000000000000000
    Height = 15.000000000000000000
    TabOrder = 9
    Text = 'Panel1'
  end
end

これで、デザイナーを使用してパネルをデザインできます。しかし、次のようなことをしてメインフォームで使用したい場合:

Panel1 := TPanel1.Create(Self);
Panel1.Parent := Self;

私が設計したものではなく、標準のTPanelしか入手できません。

すべてを同じに保ち、基本クラスをTPanelからTFormに変更すると、期待どおりに機能します(もちろん、テストするには.Parent =の代わりに.Showを使用します)。

設計したパネルをメインフォームにするには、何をする必要がありますか?

助けてくれてありがとう。

4

2 に答える 2

3

これを行う方法は、私が埋め込みフォームと呼んでいるものを使用することです。これは、FireMonkeyのフレームに相当します。

パネルごとに、フォームを作成し、それにパネルを追加します。

type TPanelForm1 = class(TForm)
  Panel1: TPanel;
  ...

コントロールをパネル内に配置します。

メインフォームで、各フォームをインスタンス化し、そのパネルをフェッチします。

procedure TForm1.FormCreate(Sender: TObject);
begin
  PF1 := TPanelForm1.Create(Self);
  PF1.Panel1.Parent := Self;
  PF1.Position := ...
  PF1.Align := ...
end;

(必要に応じて、PositionプロパティとAlignプロパティを設定します)。

パネルが小さい場合は、複数のパネルを1つのフォームに追加して、各親を個別に設定できます。パネルが大きい場合、またはモジュール性を高めるために、各フォームに1つ追加します。

于 2012-07-20T16:24:22.240 に答える
1

TPanelフォームリソースからサブコンポーネントをロードする方法がわかりません。それがフォームとフレームを特別なものにしているのです。フレームにアクセスできない場合は、代わりにコードですべてのサブコンポーネントを作成できます。GExpertsを使用して開始することができます。新しいフォームを作成し、パネルの外観に合わせてデザインします。その上にあるすべてのコンポーネントを選択し、GExpertsの「コンポーネントをコーディングする」ツールを使用します。これにより、クリップボードにコードが配置されます。パネルユニットを開き、コンストラクターに生成されたコードを貼り付けます。

constructor TPanel1.Create(AOwner: TComponent);
begin
  inherited;

  // paste GExperts-generated code here
end;

コードはTPanel1まだ存在しないフィールドを参照するので、クラス宣言で欠落しているフィールドを宣言してください。これで、デザインしていたフォームを破棄するか、将来のデザイン変更のために保存することができます。前のコードに変更を貼り付けるだけです。

于 2012-07-20T13:57:52.100 に答える