0

Delphi XE2 に取り組んでいます。サードパーティのコンポーネントやスイートはなく、派手なものはありません。

フォームに TCategoryPanelGroup (catPanGroup) を取得しました。必要な数の TCategoryPanel を簡単に追加できます。

procedure TSomeForm.PopulateGrp(Sender: TObject);
var catPanel: TCategoryPanel;
  x: word;
begin
  x := 0;
  while x < 9 do
  begin
    catPanel := catPanGroup.CreatePanel(Self) as TCategoryPanel;
    // Also tried the line below, using the panel group as the owner
    // catPanel := catPanGroup.CreatePanel(catPanGroup) as TCategoryPanel;
    //it also works without the following line
    catPanel.PanelGroup := catPanGroup;
    catPanel.Caption := 'and nothing else matters';
    Inc(x);
  end; //loop
end;

パネルの順序は気にしませんし、(まだ) 見た目も気にしません。これらのパネル内にラベル、テキストボックス、ボタンを挿入できます。これらは正常に機能し、問題はありません。私はアプリケーションを終了し、(明らかな)リークはありません。

ただし、アプリケーションは少し動的であり、パネルを削除する必要があります。最後のパネルとしましょう。したがって、私の即時の反応は次のとおりです。

var catPanel: TCategoryPanel;
begin
  catPanel := catPanGroup.Panels[catPanGroup.Panels.Count - 1];
  catPanGroup.Panels.Remove(catPanel);
end;

または:

var catPanel: TCategoryPanel;
begin
  catPanGroup.Panels.Delete(catPanGroup.Panels.Count - 1);
end;

平:

var catPanel: TCategoryPanel;
begin
  catPanel := catPanGroup.Panels[catPanGroup.Panels.Count - 1];
  catPanGroup.Panels.Remove(catPanel);
  catPanGroup.RemoveControl(catPanel);
  //catPanel.PanelGroup := nil; <- can't do, it raises an exception
end;

そして、物事がうまくいかなかったとき、私は:

  catPanGroup.Panels.Clear();
  //and rebuild every single panel

では、エラーは何ですか? エラーが発生しない場合もありますが、アプリケーションを終了すると常に例外 (アクセス違反) が発生します。¿おそらく、TCategoryPanel 内に挿入したコントロールから来ているのでしょうか? いいえ、これらのパネルにコントロールを作成しなくてもアクセス違反が発生します。そして、例外は、パネルを削除する (または削除しようとする) ときにのみポップします。近いうちに XE3 で自宅で試してみます。

誰でも実行時に TCategoryPanel を作成および削除できますか?

4

3 に答える 3

1

まるでパネルが取り外されることを意図していないように見えます。VCL のパネル削除コード ( TCustomCategoryPanelGroup.RemovePanel) はプライベートであり、カテゴリ パネル デストラクタから、およびパネルの新しい親パネル グループを設定するときにのみ呼び出されます。後者の場合、VCL は新しい親が存在する (nil ではない) ことを確認し、存在しない場合は例外を発生させます。

以下はあまり良くない回避策です。削除するパネルをホストする一時的なパネル グループを作成します。

var
  catPanel: TCategoryPanel;
  dummy: TCategoryPanelGroup;
begin
  catPanel := catPanGroup.Panels[catPanGroup.Panels.Count - 1];

  dummy := TCategoryPanelGroup.Create(nil);
  try
    dummy.Visible := False;
    dummy.Parent := Self;
    catPanel.PanelGroup := dummy;
  finally
    dummy.Free;
  end;
于 2013-12-28T00:19:48.400 に答える