- 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
- arrastar um TLayout e posicionar onde deseja que a o VIEW2 seja mostrado
-
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
- 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
- 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] - 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]
- No form principal VIEW1
-
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]
-
No VIEW2 – Gerando os parâmetros