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:
        [code lang=”pascal”]
        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;
        [/code]
    • 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)
        [code]
        TMeuView2View = class(TFormFactory { TFORM } , IView, IThisAs<TMeuView2View>,
        IMeuView2View, IViewAs<IMeuView2View>, ILayout)
        [/code]
      3. implementar a função do ILayout para que retorne o TLayout a ser mostrado dentro do VIEW1
        [code]
        function TMeuView2View.GetLayout: TObject;
        begin
        result := Layout1;
        end;

        [/code]

  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
      [code]

      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;

      [/code]

    • No VIEW1, pegando os parâmetros digitados no VIEW2:
      [code]

      /// 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;

      [/code]