Delphi: Come regolare programmazione ordinamento visivo dei componenti con align = ALTOP
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?
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:
- nascondere i pannelli
- rimuovere i pannelli dal loro controllo padre
- Aggiungi i pannelli al loro controllo padre nel nuovo ordine che si desidera
- 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.