Share Button
  1. Tudo bem, você já mostrou no #1 como um VIEW faz para abrir outro VIEW, mas no meu caso eu tenho um TLayout no form principal e queria mostrar meu segundo form dentro do TLayout, como fazer isto ?
    R. O TLayout é um componente do framework FMX. Dado a complexidade em embutir um formulário dentro de outro formulário quando se usa FMX – o caminho mais rápido para fazer isto é pegar um TLayout do VIEW2 e mostrar ele dentro de um TLayout da VIEW1. O MVCBr tem método pronto para fazer esta mágica com pouco código, mas precisa preparar o terreno antes:

    • No form principal VIEW1
      1. arrastar um TLayout e posicionar onde deseja que a o VIEW2 seja mostrado
      2. no ShowView do VIEW1 fazer a chamada para o VIEW2:

              
        uses meuView2.Controller.interf ;
        ... 
        function TNewMVCAppView.ShowView(const AProc: TProc<IView>): integer;
        var
          LController2: IMeuView2Controller;
        begin
          inherited;
          /// Carrega o controller do VIEW2
          LController2 := resolveController<IMeuView2Controller>;
          /// embute o Layout do VIEW2 dentro do Layout do VIEW1 (aqui vai a mágica)
          LController2.Embedded(Layout1);
        end;
        
    • No form do VIEW2
      1. arrastar um TLayout para dentro do VIEW2 e mudar a propriedade “align=client”, os componentes visuais serão arrastados para dentro do TLayout e posicionados a vontade
      2. Incluir na criação do objeto a interface ILayout (é ele que torna acessível o TLayout do VIEW2)
                TMeuView2View = class(TFormFactory { TFORM } , IView, IThisAs<TMeuView2View>,
                         IMeuView2View, IViewAs<IMeuView2View>, ILayout)
              
      3. implementar a função do ILayout para que retorne o TLayout a ser mostrado dentro do VIEW1
        function TMeuView2View.GetLayout: TObject;
        begin
          result := Layout1;
        end;
        
        
  2. Como posso retornar para o VIEW1 uma cadeia de parâmetros que foram digitados no VIEW2 ? Exemplo: no VIEW2 eu digito alguns parâmetros que gostaria de formatar uma WHERE no SELECT que esta no VIEW1. Então como posso retornar estes dados do VIEW2 para o VIEW1 ?
    R. Lembrando que tudo no MVCBr é INTERFACE, então é preciso pensar em termos de interface. No VIEW2 você precisa de uma função que retorne os parâmetros formatados para serem utilizados no VIEW1. Exemplo: function GetWhereString: string;

    • No VIEW2 – Gerando os parâmetros

      
      Type
        IParametrosView = interface(IView)
          ['{838227AC-E658-4193-91B9-25790379DF49}']
          // incluir especializacoes aqui
          function GetWhereString: string;
        end;
      .....
      
      procedure TParametrosView.FormShow(Sender: TObject);
      begin
        /// clear
        FWhere := '';
      end;
      
      procedure TParametrosView.Button1Click(Sender: TObject);
      begin
        WhereBuilder;  /// construtor da where
        close;
      end;
      
      /// construtor da where
      procedure TParametrosView.WhereBuilder;
        procedure add( AText:string );
        begin
          if FWhere <> '' then
             FWhere := FWhere + ' and ' ;
          FWhere := FWhere + AText;
        end;
      begin
        FWhere := '';
        if LabeledEdit1.text<>'' then
           add( 'email_from like ('+quotedStr(LabeledEdit1.text+'%')+')');
        if LabeledEdit2.text<>'' then
           add( 'email_to like ('+quotedStr(LabeledEdit2.text+'%')+')');
        if LabeledEdit3.text<>'' then
           add( 'email_subject like ('+quotedStr(LabeledEdit3.text+'%')+')');
      end;
      
      /// function da interface do VIEW2
      function TParametrosView.GetWhereString: string;
      begin
        result := FWhere;  /// retorna a where montada
      end;
      
      
    • No VIEW1, pegando os parâmetros digitados no VIEW2:

      
      /// evento para receber os dados digitados no VIEW2
      procedure TNewMVCAppParametersView.ParametersApply(AView: IView);
      begin
        ///  faz alguma coisa com os dados digitados no VIEW2 
        Memo1.lines.text := (AView as IParametrosView).GetWhereString;
      end;
      
      /// abre a janela do VIEW2
      procedure TNewMVCAppParametersView.Button1Click(Sender: TObject);
      begin
        /// No ShowView chamar com os parametros:
        ///   a interface do controller da VIEW2 - irá procurar na lista de controllers qual a view desejada
        ///   nil para o segundo parâmetro   (OnProcBeforeShow);
        ///   método que irá receber o parâmetro  (OnProcCloseEvent);
        ShowView(IParametrosController, nil, ParametersApply);
      end;