2009-08-11 6 views

Répondre

26

Vous pouvez facilement déplacer un panneau supérieur aligné vers le haut en définissant sa Top propriété à . Faites-le dans l'ordre inverse demandé (panneau inférieur d'abord) et vous avez terminé.

+1

Parfois, si vous affectez une valeur négative, cela fonctionnera mieux. Cela a fonctionné pour moi de cette manière. – HOPE

1

Je suggère de construire un cadre où vous supprimez/ajoutez dynamiquement les formulaires de/à leur contrôle parent. En général, l'ordre de création/ajout est l'ordre visuel, mais d'après votre question, je comprends que vous voulez que la commande change au cours de la vie de l'application, donc juste changer l'ordre de création original ne suffira pas.

Pour changer l'ordre, essayez:

  1. Masquer les panneaux
  2. Retirez les panneaux de contrôle de leur parent
  3. Ajouter les panneaux à leur contrôle parent dans le nouvel ordre que vous souhaitez
  4. Afficher les panneaux
1

Pourquoi ne pas essayer un TGridPanel avec une colonne et n lignes plutôt --- le réordonnancement des panneaux alignés sur le dessus est un peu pénible, vraiment.

(Note: TGridPanel est disponible en Delphi 2007 et plus, si je me souviens bien).

+0

idée de Nice, mais mes panneaux ne sont pas réellement placés directement sur une forme - ils re sur un autre composant de type panneau qui donne un effet de fond, et le TGridPanel le cache. pour garder la question simple, j'ai omis de mentionner cette subtilité ... – Roddy

+0

Vous ne pouvez pas mettre 'TGridPanel.ParentBackground' à' True'? Je pensais que les descendants 'TPanel' pouvaient être transparents de cette façon ... – onnodb

1

Si vous modifiez le haut du panneau par ordre de modification visuelle du panneau.

Essayez ceci (tous les panneaux alignés ALTOP et avec la même hauteur):

PANEL0
PANEL1
PANEL2
Panel3
PANEL4

à événement OnClick de tous les panneaux font ceci:

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

Si vous cliquez sur un panneau, il monte d'une position.

C'est l'idée. Changez les X premiers pixels.
En même temps, si vous faites ceci:

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

Le panneau jusqu'à 2 positions.

AJOUT: Si vous utilisez Drag & Drop, ces événements renvoient la position (X et Y); Avec la position d'origine et la position de fin, vous pouvez calculer le sommet de wew pour asign au panneau.

Excusez-moi de mon pauvre anglais. ce qui concerne

6

Déplacez-la même façon que vous souhaitez les déplacer au moment de la conception avec la souris: Définissez la propriété du panneau actuel Top à un de moins que la propriété Top du panneau que vous voulez être en dessous du panneau actuel. La VCL s'occupera du reste.

Si vous devez déplacer plusieurs panneaux, commencez par BeginDeferWindowPos. Ajustez tous les panneaux à toutes les coordonnées souhaitées avec DeferWindowPos, puis faites-les tous se déplacer en même temps avec EndDeferWindowPos.

+0

Bon, je ne connaissais pas' DeferWindowPos'. [Mais n'est-ce pas 'DisableAlign'/'EnableAlign' plus facile alors] (http://stackoverflow.com/a/15625706/757830)? – NGLN

+0

@Ngln, avec 'DeferWindowPos', la fenêtre ne bouge pas du tout jusqu'à ce que vous appeliez' EndDeferWindowPos'. Si vous déplacez de nombreuses fenêtres, cela évite de scintiller car les positions de certaines fenêtres sont mises à jour avant que les autres n'aient bougé. Pour autant que je sache, 'DisableAlign' n'empêche pas les contrôles de se déplacer n'importe où, juste l'alignement de l'alignement du parent. Je ne peux pas juger qui est le meilleur. –

0

Je sais que c'est un vieux message mais m'a aidé fondamentalement - l'idée de mettre la propriété supérieure à zéro. Je ne peux pas utiliser l'idée de définir par programme la position parce que c'est à l'utilisateur de l'application - il peut choisir d'afficher des graphiques sur l'application, puis, tous les panneaux (parents) sont alignés altop. Je place leur propriété supérieure à 0 dans l'ordre inverse, puis je mets juste la valeur Vrai ou Faux en fonction de l'entrée de l'utilisateur ...

Merci.

0

Je l'ai utilisé le code suivant:

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; 

selon mon souhait Panel_1 Panel_2 Panel_3 Panel_4

Questions connexes