Delphi: Comment ajuster la commande visuelle de programmation des composants avec align = alTop

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

  •  12-09-2019
  •  | 
  •  

Question

J'ai un formulaire avec un certain nombre de panneaux, dont chacun a align = alTop, de sorte qu'ils empile vers le bas bien du haut du formulaire.

Cependant, je souhaite modifier dynamiquement l'ordre d'apparition de ces panneaux - i.e., les déplacer vers le haut et vers le bas. Quelle est la meilleure façon de le faire?

Était-ce utile?

La solution

Vous pouvez facilement déplacer un panneau supérieur aligné vers le haut en définissant son Top propriété 0 . Pour ce faire, en sens inverse l'ordre demandé (panneau inférieur en premier) et vous avez terminé.

Autres conseils

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é de Top du panneau actuel à un de moins que la propriété Top du panneau que vous voulez être en dessous du panneau actuel. La VCL prendra soin du reste.

Si vous devez déplacer plusieurs panneaux, commencez par BeginDeferWindowPos . Régler tous les panneaux à ce que vous voulez avec des coordonnées DeferWindowPos, puis les faire se déplacent tous à la fois avec EndDeferWindowPos.

Je suggère la construction d'un cadre dans lequel vous supprimez / ajouter dynamiquement les formes de / à leur contrôle parent. En général, l'ordre de création / addition est l'ordre visuel, mais de votre question, je comprends que vous voulez l'ordre de changer au cours de la durée de vie de l'application, de sorte que changer l'ordre de création originale ne sera pas suffisant.

Pour changer l'ordre, essayez:

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

Que diriez-vous d'essayer un TGridPanel haut aligné avec une colonne et n lignes au lieu --- réordonner les panneaux supérieurs alignés est un peu d'une douleur, vraiment.

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

Si vous modifiez le haut du panneau l'ordre de changement de panneau visuellement.

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

PANEL0
PANEL1
PANEL2
Panel3
PANEL4

OnClick cas de tous les panneaux faire ceci:

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

Si vous cliquez sur un panneau, il se déplace jusqu'à une position.

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

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

Le panneau jusqu'à 2 positions.

AJOUTEE: Si vous utilisez Drag & Drop, ces évènements renvoient la position (X et Y); Avec la position de position et à la fin d'origine, vous pouvez calculer le haut WEW pour ASIGN au panneau.

Excuse forme mon pauvre anglais. ce qui a trait

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

Je sais que un ancien poste, mais m'a aidé essentiellement - l'idée de la propriété supérieure à zéro. Je ne peux pas utiliser l'idée de mettre la cause programatically de position est ce à l'utilisateur de l'application - il peut choisir d'afficher des graphiques sur l'application puis, tous les panneaux (parents) du teecharts sont les aligner ALTOP. Je mis leur propriété supérieure à 0 sur l'ordre inverse et puis juste VISIBLE vrai ou faux en fonction des entrées utilisateur ...

Merci.

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

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

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

Le dernier sera le premier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top