Delphi: Como ajustar programaticamente ordenação visual dos componentes com align = alTop
Pergunta
Eu tenho um formulário com uma série de painéis, cada um dos quais tem align = alTop, para que eles pilha para baixo muito bem a partir do topo do formulário.
No entanto, eu quero alterar dinamicamente a ordem de aparecimento destes painéis - isto é, movê-los para cima e para baixo. Qual é a melhor maneira de fazer isso?
Solução
Você pode facilmente mover um painel alinhados-top ao topo definindo sua Top para 0 . Fazei isto em ordem solicitada reversa (painel inferior primeiro) e está feito.
Outras dicas
Mover-los da mesma maneira que você movê-los em tempo de design com o mouse: Set propriedade Top
do painel atual para um a menos que a propriedade Top
do painel que deseja estar abaixo do painel atual. A VCL vai cuidar do resto.
Se você tem que se mover vários painéis, comece com BeginDeferWindowPos
. Ajuste todos os painéis para qualquer coordenadas que quiser com DeferWindowPos
, e depois fazê-los todos se movem de uma vez com EndDeferWindowPos
.
Eu sugiro a construção de um quadro onde você remover / adicionar as formas de / para seu controle pai dinamicamente. Em geral, a ordem da criação / adição é a ordem visual, mas a partir de sua pergunta eu entendo que você quer a fim de mudar durante o tempo de vida do aplicativo, portanto apenas mudando a ordem criação original não será suficiente.
Para alterar a ordem, tente:
- Ocultar os painéis
- Remova os painéis de seu controle pai
- Adicione os painéis ao seu controle pai na nova ordem que desejar
- Mostrar os painéis
Que tal experimentar um TGridPanel
alinhado-top com uma coluna e n linhas em vez --- re-ordenação painéis alinhados-top é um pouco de dor, realmente.
. (Nota: TGridPanel
está disponível em Delphi 2007 e até, se bem me lembro)
Se você alterar a parte superior do painel da ordem de visualmente mudança painel.
Tente este (todos os painéis alinhados
PANEL0
PNEL1
PANEL2
panel3
PANEL4
No OnClick caso de todos os painéis fazer isso:
TPanel(Sender).Top := TPanel(Sender).Top - TPanel(Sender).Height - 2;
Se você clicar em um painel que se move uma posição acima.
Essa é a idéia. Alterar os pixels Top X.
Ao mesmo tempo, se você fizer isso:
TPanel(Sender).Top := TPanel(Sender).Top - (TPanel(Sender).Height * 2)- 2;
O painel de cima 2 posições.
ADICIONADO: Se você usar Drag & Drop, estes eventos retornar a posição (X e Y); Com a posição original ea posição final, você pode calcular o topo wew para Assign ao painel.
desculpa formar meu pobre Inglês. relação
Eu usei o código a seguir:
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;
de acordo com o meu desejo Panel_1 Panel_2 Panel_3 Panel_4
Eu sei que é um post antigo, mas basicamente me ajudou - a idéia de definir a propriedade superior a zero. Eu não posso usar a idéia de programaticamente definir a posição causa isso é com o usuário app - que pode optar por mostrar alguns gráficos sobre o aplicativo e, em seguida, todos os painéis (pai) dos os teecharts são Altop alinhar. I definir sua propriedade superior a 0 na ordem inversa e, em seguida, basta definir visível verdadeira ou falsa de acordo com a entrada do usuário ...
Graças.
panel3.Visible := True;
panel3.Top := 0;
panel2.Visible := True;
panel2.Top := 0;
panel1.Visible := True;
panel1.Top := 0;
A última será a primeira.