43 votes

Comment créer une boîte de dialogue comme élément qui permet la baisse d'autres contrôles à l'intérieur d'elle?

C'est un Firemonkey composant, cependant j'ai pu voir que la plupart de la composante de base est la même pour VCL et FMX, de sorte s'il vous plaît si vous savez comment faire de la VCL de partager vos connaissances, il peut éventuellement être la solution pour mon cas.

Je suis à l'aide d'un TPopup comme l'ancêtre. Il est pratique pour moi, car il reste sur la forme/châssis et je peux l'associer avec LiveBindings en utilisant le même contexte, la structure de la société mère, ce qui est très pratique pour moi.

J'ai besoin de se comporter exactement, il est le TPopup, comme un conteneur. Mais j'ai besoin c'est mieux et d'avoir mon spécifiques des boutons (j'ai créé quelques propriétés et les automatismes pour mon logiciel à l'intérieur)

Le problème est que j'ai créer certains contrôles internes, comme TLayouts, Tpanels et Tbuttons de faire ressemble à ceci: (vide)

My empty Popup

Que le noir de la zone de l'intérieur, c'est là où je veux déposer des contrôles, comme TEdit et les autres.

J'ai mis tous les internes contrôles créés pour Stocker = faux, de sorte qu'il n'est pas stocké sur le système de streaming. Faire que lorsque je déposer un TEdit par exemple, ce que je reçois est-ce (Tedit avec aligné=top j'en ai besoin):

My Popup with TEdit

Mais je m'attendais à ce:

My popup with TEdit in the right position

Si je change le Magasin = vrai que je peut obtenir l'effet, mais tout l'intérieur contrôles sont exposées sur le panneau Structure et à chaque fois que je enregistrez le formulaire et de le rouvrir tout est dupliqué. L'intérieur des composants exposés n'est pas un problème pour moi, mais la répétition est, si j'ai fermer et ouvrir le composant 10 fois que je vais obtenir la totalité de l'intérieur de la structure reproduit 10 fois.

Je vais essayer de montrer un peu de code qui est lié à la conception du composant:

Déclaration de la classe:

  [ComponentPlatformsAttribute(pidWin32 or pidWin64 or pidOSX32 or pidiOSSimulator or pidiOSDevice or pidAndroid)]
  TNaharFMXPopup = class(TPopup, INaharControlAdapter, INaharControl)
  private
  protected
    FpnlMain       : TPanel;
    FlytToolBar    : TLayout;
    FbtnClose      : TButton;
    FbtnSave       : TButton;
    FbtnEdit       : TButton;
    FpnlClientArea : TPanel;
    FlblTitle      : TLabel;
    procedure   Loaded; override;
    procedure   Notification(AComponent: TComponent; Operation: TOperation); override;

constructor Create:

    constructor TNaharFMXPopup.Create(AOwner: TComponent);
    begin
      inherited;

      FpnlMain         := TPanel.Create(Self);
      FlblTitle        := TLabel.Create(Self);
      FlytToolBar      := TLayout.Create(Self);
      FbtnEdit         := TButton.Create(Self);
      FpnlClientArea   := TPanel.Create(Self);
      FbtnClose         := TButton.Create(FlytToolBar);
      FbtnSave          := TButton.Create(FlytToolBar);

      Height         := 382;
      Placement      := TPlacement.Center;
      StyleLookup    := 'combopopupstyle';
      Width          := 300;

      ApplyControlsProp;

    end;

Définition des propriétés des contrôles internes:

procedure TNaharFMXPopup.ApplyControlsProp;
begin
  with FpnlMain do
  begin
    Parent         := Self;
    Align          := TAlignLayout.Client;
    StyleLookup    := 'grouppanel';
    TabOrder       := 0;
    Margins.Bottom := 10;
    Margins.Left   := 10;
    Margins.Right  := 10;
    Margins.Top    := 10;
    Stored         := false;
  end;
  with FlblTitle do
  begin
    Parent         := FpnlMain;
    Text           := 'Título';
    Align          := TAlignLayout.Top;
    Height         := 36;
    StyleLookup    := 'flyouttitlelabel';
    Stored         := false;
  end;
  with FpnlClientArea do
  begin
    Parent         := FpnlMain;
    Align          := TAlignLayout.Client;
    StyleLookup    := 'gridpanel';
    TabOrder       := 0;
    Margins.Bottom := 5;
    Margins.Left   := 5;
    Margins.Right  := 5;
    Margins.Top    := 5;
    Stored         := false;
  end;
  with FlytToolBar do
  begin
    Parent         := FpnlMain;
    Align          := TAlignLayout.Bottom;
    Height         := 50;
    Stored         := false;
  end;
  with FbtnClose do
  begin
    Parent         := FlytToolBar;
    Text           := 'Fecha';
    Align          := TAlignLayout.Left;
    Height         := 50;
    StyleLookup    := 'tilebutton';
    TabOrder       := 0;
    Width          := 70;
    ModalResult    := mrClose;
    Stored         := false;
  end;
  with FbtnEdit do
  begin
    Parent         := FlytToolBar;
    Text           := '';//'Edita';
    Align          := TAlignLayout.Left;
    Height         := 50;
    StyleLookup    := 'tilebutton';
    TabOrder       := 1;
    Width          := 70;
    ModalResult    := mrContinue;
    Stored         := false;
    Enabled        := false;
  end;
  with FbtnSave do
  begin
    Parent         := FlytToolBar;
    Text           := 'Salva';
    Align          := TAlignLayout.Left;
    Height         := 50;
    StyleLookup    := 'tilebutton';
    TabOrder       := 2;
    Width          := 70;
    ModalResult    := mrOk;
    Stored         := false;
  end;
end;

Chargé:

procedure TNaharFMXPopup.Loaded;
begin
  inherited;

  ApplyControlsProp;
  SetEvents;
end;

J'ai essayé la suite de la notification, en essayant de faire le control inséré un parent pour mon intenal "clientarea"

procedure TNaharFMXPopup.Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited;
  if (Operation = opInsert) and (csDesigning in ComponentState) then
  begin
    if AComponent.Owner = self then
      if AComponent is TFmxObject then
      begin
        (AComponent as TFmxObject).Parent := FpnlClientArea;
      end;
  end;

end;

Mais cela n'a rien changer.

J'ai posé la même question avant, mais je n'étais pas au courant de beaucoup de choses sur la création d'un tel composant et la réponse que j'ai donné peu d'aide, j'ai été absent le Parent de chaque composant interne.

Maintenant, je suis en train de vraiment montrer où est mon besoin: j'ai besoin de déposer des contrôles sur mon TPopup boîte de dialogue qui sera le parent de l'ClientArea à l'intérieur.

-2voto

dewelloper Points 9

je pense que vous avez besoin de médiateur dans votre création de contrôle sur la conception du temps comme ceci: http://sourcemaking.com/design_patterns/mediator/delphi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X