Delphi: Come regolare programmazione ordinamento visivo dei componenti con align = ALTOP

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

  •  12-09-2019
  •  | 
  •  

Domanda

Ho un modulo con una serie di pannelli, ognuno dei quali ha ALIGN = ALTOP, così che vengano impilate giù bene dalla parte superiore del modulo.

Tuttavia, voglio cambiare dinamicamente l'ordine comparsa di questi pannelli - cioè, spostarli su e giù. Qual è il modo migliore di fare questo?

È stato utile?

Soluzione

Si può facilmente spostare un pannello superiore allineato alla parte superiore impostando il suo Top di proprietà di 0 . Fate questo in ordine inverso richiesto (pannello inferiore prima) e si è fatto.

Altri suggerimenti

Spostare loro lo stesso modo in cui li ci si sposta in fase di progettazione con il mouse: Impostare la proprietà Top del pannello corrente a uno meno la proprietà Top del pannello che si desidera essere sotto il pannello corrente. La VCL si prenderà cura di tutto il resto.

Se si deve spostare diversi pannelli, iniziare con BeginDeferWindowPos . Regolare tutti i pannelli a qualsiasi coordinate che vuoi con DeferWindowPos, e poi farli tutti si muovono in una volta con EndDeferWindowPos.

Suggerisco la costruzione di un quadro in cui si rimuove in modo dinamico / aggiungono i moduli da / per il loro controllo padre. In generale, l'ordine della creazione / aggiunta è l'ordine visivo, ma dalla tua domanda capisco che si desidera l'ordine di cambiare durante la vita dell'applicazione, quindi basta cambiare l'ordine creazione originale non sarà sufficiente.

Al fine di modificare l'ordine, provare:

  1. nascondere i pannelli
  2. rimuovere i pannelli dal loro controllo padre
  3. Aggiungi i pannelli al loro controllo padre nel nuovo ordine che si desidera
  4. Mostra i pannelli

Che ne dite di provare un TGridPanel top-allineato con una colonna e n righe invece --- riordinare i pannelli top-allineati è un po 'di dolore, in realtà.

(Nota: TGridPanel è disponibile in Delphi 2007 e fino, se non ricordo male).

Se si modifica la parte superiore del pannello dell'ordine di cambiamento del pannello visivamente.

Prova questo (tutti i pannelli allineati Altop e con la stessa altezza ):

PANEL0
PANEL1
PANEL2
Panel3
PANEL4

Al Su clic caso di tutti i pannelli fare questo:

 TPanel(Sender).Top := TPanel(Sender).Top - TPanel(Sender).Height - 2;

Se si fa clic su un pannello si muove su una posizione.

Questa è l'idea. Modificare i pixel Top X.
Allo stesso tempo, se si fa questo:

   TPanel(Sender).Top := TPanel(Sender).Top - (TPanel(Sender).Height * 2)- 2; 

Il pannello fino 2 posizioni.

ha aggiunto: Se si utilizza il Drag & Drop, questi eventi restituire la posizione (X e Y); Con la posizione e la posizione finale originale è possibile calcolare la parte superiore wew per Asign al pannello.

Scusa forma il mio povero inglese. saluti

Ho usato il seguente codice:

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;

secondo il mio desiderio Panel_1 Panel_2 Panel_3 Panel_4

So che la sua un vecchio post, ma in fondo mi ha aiutato - l'idea di impostare la proprietà superiore a zero. Non posso usare l'idea di impostare programatically la causa posizione di questo è compito dell'utente app - si può scegliere di visualizzare alcuni grafici sul app e poi, tutti i pannelli (padre) della i teecharts sono Altop align. Ho impostato la loro proprietà in alto a 0 sul nell'ordine inverso e poi basta impostare visibile vere o false in base all'input dell'utente ...

Grazie.

panel3.Visible  := True;
panel3.Top      := 0;

panel2.Visible  := True;
panel2.Top      := 0;

panel1.Visible  := True;
panel1.Top      := 0;

L'ultimo sarà il primo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top