Delphi: Como ajustar programaticamente ordenação visual dos componentes com align = alTop

StackOverflow https://stackoverflow.com/questions/1259849

  •  12-09-2019
  •  | 
  •  

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?

Foi útil?

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:

  1. Ocultar os painéis
  2. Remova os painéis de seu controle pai
  3. Adicione os painéis ao seu controle pai na nova ordem que desejar
  4. 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 Altop e com a mesma altura ):

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top