8

この特定のケースでは、PowerPDFライブラリを使用してPDFドキュメントを動的に作成していますが、親コントロール内でコントロールを動的に整列させるという一般的な概念にも同じことが当てはまります。このライブラリでTPRPageは、はすべての要素コントロール、この場合はのシーケンシャルインスタンスを含む基本コントロールですTPRLayoutPanel

コントロールを動的に追加するときに行うこと:

  1. コントロールを作成する(TPRLayoutPanel
  2. コントロールの親を設定します(TPRPage
  3. コントロールを上に揃えます(PRLayoutPanel.Align:= alTop;

問題は、ページの最後(下)ではなく、最初(上)に強制されることです。

私はその順序を設定しようとしましたが、運がありませんでしたPRLayoutPanel.SendToBack;PRLayoutPanel.BringToFront

親コントロール内で複数のコントロールを動的に作成して整列させるにはどうすればよいですか?私の現在の唯一の回避策は、コントロールを逆の順序(最後から最初まで)で追加することです。これは途方もなく不要です。

これが、この親に整列されたコントロールのすべての新しいインスタンスを作成する私のユニバーサル関数です。

function TfrmReport.InsertPanel: TPRLayoutPanel;
begin
  Result:= TPRLayoutPanel.Create(PRPage);
  Result.Parent:= PRPage;
  Result.Align:= alTop;
  Result.Height:= 40; //Default, may change later
end;
4

3 に答える 3

22

もう一度、DisableAlignそしてEnableAlign救助するために:

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
  P: TPanel;
begin
  DisableAlign;
  try
    for I := 0 to 4 do
    begin
      P := TPanel.Create(Self);
      P.Caption := IntToStr(I);
      P.Align := alTop;
      P.Parent := Self;
    end;
  finally
    EnableAlign;
  end;
end;

説明:

アラインメントが有効になっている場合、コンテナ(この特定のケースではフォーム自体)にコントロールを追加するたびに、そのコンテナ内の他のすべてのコントロールのすべてのアラインメント(およびアンカー)設定が再評価されます。コントロールに特定のTopプロパティが設定されていない場合は、にTopなります0。すでに上部に別のコントロールが配置されている場合は、が付いた2つのコントロールがありTop = 0、挿入しようとしているコントロールが優先されます。私は(現在)それについて詳細な説明はありませんが、それはただのことであり、位置の順序は実際に作成の順序から逆になっています。

これで、コンテナの配置が無効になっている場合、連続して追加されたコントロールは、すべての配置プロパティを変更せずに挿入するだけです。アラインメントが再び有効になると、これらのコントロールはすべて同じ方法で再評価されますが、これはControls配列内のインデックスの順序で1つのループで行われるという違いがあります。つまり、それらが作成された順序です。

于 2013-03-25T22:04:14.413 に答える
10

Topプロパティを前のパネルの下部に設定する必要があります。たとえば、次のようになります。

PanelTop := 0;
for i := 0 to 5 do
begin
  Panel[i] := TPanel.Create(Self);
  Panel[i].Parent := Self;
  Panel[i].Height := PanelHeight;
  Panel[i].Align := alTop;
  Panel[i].Top := PanelTop;
  inc(PanelTop, PanelHeight);
end;

コードに合わせるには、最後に追加されたパネルの場所を追跡する必要があります。おそらく、関数にvarパラメーターを追加することができます。InsertPanel

function TfrmReport.InsertPanel(var PanelTop: Integer): TPRLayoutPanel;
begin
  Result:= TPRLayoutPanel.Create(PRPage);
  Result.Parent:= PRPage;
  Result.Top:= PanelTop;
  Result.Height:= 40;
  Result.Align:= alTop;
  inc(PanelTop, Result.Height);
end;

私はあなたがアイデアを得ると信じています!

于 2013-03-25T19:48:16.653 に答える
0

alCustom align typeを使用し、CustomAlignPositionメソッドを介してすべてのパネル位置を制御できます(親コントロールでオーバーライドする必要があります)。これにより、柔軟性と制御が向上します。

于 2013-03-25T20:11:16.330 に答える