多数のパネルを含むフォームがあり、それぞれに があるAlign=alTop
ため、フォームの上からうまく積み重ねられます。
ただし、これらのパネルの表示順序を動的に変更したい、つまり上下に移動したい。これを行う最善の方法は何ですか?
Topプロパティを0に設定すると、上揃えのパネルを簡単に上に移動できます。要求された逆の順序でこれを実行すると (一番下のパネルが最初)、完了です。
設計時にマウスで移動するのと同じ方法で移動します。現在のパネルのプロパティを、現在のパネルの下に配置するパネルのTop
プロパティよりも 1 小さい値に設定しTop
ます。残りは VCL が処理します。
複数のパネルを移動する必要がある場合は、 から始めBeginDeferWindowPos
ます。ですべてのパネルを任意の座標に調整しDeferWindowPos
、 ですべてを一度に移動しEndDeferWindowPos
ます。
次のコードを使用しました。
procedure Show_Hide (Flag_Show : boolean);
begin
if Flag_Show then
begin
with Panel_1 do begin Align := alTop; Visible := true; end;
with Panel_2 do begin Align := alTop; Visible := true; end;
with Panel_3 do begin Align := alTop; Visible := true; end;
with Panel_4 do begin Align := alTop; Visible := true; end;
end else
begin
with Panel_1 do begin Visible := false; Align := alNone; end;
with Panel_2 do begin Visible := false; Align := alNone; end;
with Panel_3 do begin Visible := false; Align := alNone; end;
with Panel_4 do begin Visible := false; Align := alNone; end;
end;
end;
私の願いに従って Panel_1 Panel_2 Panel_3 Panel_4
パネルの上部を変更すると、視覚的にパネルの順序が変更されます。
これを試してください(すべてのパネルが上に整列し、同じ Heightです):
パネル
0
パネル1 パネル2 パネル3
パネル
4
すべてのパネルのOnClickイベントで、次のようにします。
TPanel(Sender).Top := TPanel(Sender).Top - TPanel(Sender).Height - 2;
パネルをクリックすると、1 つ上の位置に移動します。
それがアイデアです。トップ X ピクセルを変更します。
同時に、これを行うと:
TPanel(Sender).Top := TPanel(Sender).Top - (TPanel(Sender).Height * 2)- 2;
パネルを 2 ポジション上げます。
追加:ドラッグ アンド ドロップを使用する場合、このイベントは位置 (X と Y) を返します。元の位置と終了位置を使用して、パネルに割り当てるためのウェット トップを計算できます。
下手な英語ですみません。よろしく
親コントロールとの間でフォームを動的に削除/追加するフレームワークを構築することをお勧めします。一般的には作成・追加の順序は視覚的な順序ですが、ご質問からアプリケーションの存続期間中に順序を変更したいということは理解できますので、元の作成順序を変更するだけでは十分ではありません。
順序を変更するには、次のことを試してください。
TGridPanel
代わりに、1 列n行の上揃えを試してみてはどうでしょうか--- 上揃えのパネルを並べ替えるのは、本当に少し面倒です。
(注:TGridPanel
私の記憶が正しければ、Delphi 2007 以降で使用できます)。
私はそれが古い投稿であることを知っていますが、基本的に私を助けました-トッププロパティをゼロに設定するという考え。プログラムで位置を設定するという考えは使用できません。これはアプリのユーザー次第です。アプリにいくつかのチャートを表示することを選択すると、ティーチャートのすべてのパネル (親) が上に整列します。逆の順序で top プロパティを 0 に設定し、ユーザー入力に応じて表示される true または false を設定するだけです...
ありがとう。