6

いくつかのサブパネルを持つカスタムコントロールを作成しました。これらのサブパネルは、設計時にドロップされた追加のコントロールを受け入れるようにします。

残念ながら、デザイン時にドロップされるコントロールは、パネルではなく、カスタムコントロールに配置されます。これは、ラベルをドロップしようとすると特に表示されます。ラベルの青い点は表示されますが、キャプションは表示されません。ラベルの選択を解除すると、ラベルはまったく表示されなくなります。

簡略化されたコード(1つのサブパネルのみ):

type
  TMyContainer = class(TPanel)
    p_SubPanel: TPanel;
  public
    constructor Create(_Owner: TComponent); override;
  end;

  constructor TMyContainer.Create(_Owner: TComponent);
  begin
    inherited;
    p_SubPanel := TPanel.Create(Self);
    p_SubPanel.Parent := Self;
    p_SubPanel.Align := alClient;
  end;

私はここで何が間違っているのですか?

(念のため:Delphi 2007を使用しています。)

[編集]

私は今、それを別の方法で解決しました。コンポーネントにはパネルが含まれなくなりましたが、外部パネルを参照しています。これにより、実際にははるかに柔軟になりますが、欠点としては、直感的に使用できなくなります。

私が最初に説明したことを達成する方法をまだ知りたいです。これを行うオープンソースコンポーネントはどこかにないので、ソースコードを調べることができますか?

4

3 に答える 3

2

これは良い質問です。コントロールのControlStyleプロパティにcsAcceptControlsを追加することにより、カスタムTWinControlで他のコントロールをデザイン時にドロップできるようにすることができます。

constructor TMyContainer.Create(AOwner: TComponent);
begin
  inherited;
  ControlStyle := ControlStyle + [csAcceptControls];
end;

しかし、これを解決しようとしても、カスタムコントロール内のサブパネルにコントロールをドロップできるという成功はほとんどありませんでした。サブパネルのControlStyleにcsAcceptControlsを追加するだけでは不十分です。私が得たクローストは、サブパネルが次のように設計されていることを納得させるためのハックです。

type
  TGiveMeProtected_Component = class(TComponent);

procedure TMyContainer.Create(AOwner: TComponent);
begin
  FSubPanel := TPanel.Create(Self);
  TGiveMeProtected_Component(FSubPanel).SetDesigning(True, True);
end;

そのコードを使用して、コントロールをサブパネルにドロップできるようになりましたが、サブパネルを選択したり、プロパティを変更したり、絶対に不要なものを削除したりすることもできます。申し訳ありませんが、答えを思い付くことができませんでした。それでもうまくいくかどうか知りたいです。:)

于 2009-01-09T01:15:24.187 に答える
1

詳細からはわかりませんが、ラベルの親をサブパネルに設定していますか?設計時にメインコンポーネント(パネルが入っているコンテナなど)にコードを記述して、どのサブパネルがコンポーネントを受け入れているかを把握し、ラベルの親プロパティをそのサブパネルに設定する必要がある場合があります。

コンポーネントが別のコンポーネントに追加または削除されたときに通知メソッドが呼び出されると確信しています。これは、コードを配置する必要がある場所を追跡するのに役立ちます。

于 2008-12-17T15:33:43.080 に答える
0

私はこれを行いましたが、必要に応じて表示/非表示になる通常のパネルにコントロールを置き換えることになりました。

TPanel から派生する代わりに、私のコントロールは TCustomControl から派生します。TPanel から降りて動作させることはできなかったと思いますが、何が問題だったのか思い出せません。

コンテナー コントロール:

TPageControl = class(TCustomControl)
private
  PageList:TObjectList;  // To hold references to all sub-pages for easy access.
end;

constructor TPageControl.Create(AOwner: TComponent);
begin
  inherited;
  ControlStyle := ControlStyle + [csAcceptsControls];
  PageList := TObjectList.Create;
  PageList.OwnsObjects := false;
end;

destructor TVstPageControl.Destroy;
begin
  PageList.Free;
  inherited;
end;

procedure TPageControl.NewPage;
var
  Page:TPage;
begin
  Page := TPage.Create(Self.Owner);
  Page.Parent := Self;
  Page.Align := alClient;

  PageList.Add(Page);
end;

procedure TPageControl.DeletePage(Index:integer);
var
  Page:TPage;
begin
  Page := PageList[Index] as TPage;
  Page.Free;
  PageList.Delete(Index);
end;

ページ/サブパネル コントロール:

TVstPage = class(TCustomControl)
public
  constructor Create(AOwner: TComponent); override;
end;

constructor TPage.Create(AOwner: TComponent);
begin
  inherited;
  ControlStyle := ControlStyle + [csAcceptsControls];
end;
于 2010-07-27T13:48:15.807 に答える