Passar valores de uma Activity para outra.

Marcelo Quintanilha

Member
Licensed User
Olá pessoal. Criei uma nova Activity utilizando o comando "Project - AddNewModule - ActivityModule" que dei o nome de "Relatorio"
Com Designer criei uma nova configuração de tela.
Na Activity Main (principal) criei botão contendo comando:
Sub Button1_Click
StartActivity(Relatorio)
End Sub
Ao clicar neste botão ele me transfere para a outra Tela (Activity).
Na tela do Relatório criei botão contendo comando:
Sub Button1_Click
Activity.Finish
End Sub.
Isso faz retornar à tela principal.
Tenho valores na Activity principal que preciso transferir para a Activity relatório:
Exemplo: Na principal tenho que X é um valor calculado por uma equação. Como passar o valor de X para a Activity Relatório e poder mostrar na tela com uma Label1.Text ?
E finalmente, pela Activity Relatório como gerar um arquivo TXT para exportar?
 

MaxRosa

Member
Licensed User
Longtime User
Há várias maneiras de fazer isso. Acho que a mais simples é criar uma variável Global no módulo Starter ou criar um módulo de código (Code Module) e criar a vairável lá para ler e escrever o valor a partir de qualquer Activity. Também é possível declarar uma variável Global na seção Process Global da Activity principal, assim ela fica visível em qualquer outra Activity.

Quanto ao relatório, basta usar as funções File.ReadString e File.WriteString para ler e escrever um arquivo de texto. Outra maneira é usado a classe StateManager para salvar as variáveis e ler de volta. Recomendo a segunda opção.
 

Cableguy

Expert
Licensed User
Longtime User
Como foi dito pelo @MaxRosa, criando variáveis globais (sub Globals) no serviço Starter, tem como grande vantagem que o valor persiste em memória mesmo após ter saído da aplicação, desde que o serviço se mantenha a funcionar no background.
Outra opção é cria da mesma forma as variáveis globais mas na Main activity (sub App_globals se não me engano, mas de qualquer forma, é a primeira sub da Main activity) , uma vez que esta é acessível a partir de qualquer actividade ou módulo.
Em ambos os casos, a variável deve ser precedida pelo nome do módulo ou actividade onde foi criada
 

Marcelo Quintanilha

Member
Licensed User
Max e Cableguy, obrigado pelas dicas...
Hoje à de manhã conheci o Cristiam do Blog IdeiasProgramadas e fizemos juntos os seguintes comandos pois ele nunca usou o B4A.
Para quem precisar fazer algo igual (Podem ser arcaicas e não serem ideais mas funcionaram 100%):

Após criada a nova Activity que chamei de "Relatorio"
1) NA ACTIVITY "MAIN" (Que é a principal):
O botão que abre a tela do Activity Relatório terá:
Sub Button1_Click
StartActivity(Relatorio) 'Abre a activity na tela.
CallSubDelayed2(Relatorio,"reportarx",X) 'Espaçamento final
CallSubDelayed2(Relatorio,"reportarg",G) 'Bitola do estribo
CallSubDelayed2(Relatorio,"reportarr",R) 'Vrd2
CallSubDelayed2(Relatorio,"reportarm",M) 'fctm
CallSubDelayed2(Relatorio,"reportarn",N) 'fctd
CallSubDelayed2(Relatorio,"reportaro",O) 'Vc
CallSubDelayed2(Relatorio,"reportarp",P) 'Vsw
CallSubDelayed2(Relatorio,"reportars",S) 'Asw calculado
CallSubDelayed2(Relatorio,"reportart",T) 'Asw mínimo
CallSubDelayed2(Relatorio,"reportarj",J) 'Espaçamento calculado
CallSubDelayed2(Relatorio,"reportarmaximo",MAXIMO) 'Espaçamento máximo
CallSubDelayed2(Relatorio,"reportarc",C) 'Valor do Vsd
CallSubDelayed2(Relatorio,"reportarverifica",VERIFICA) 'Verifica biela
End Sub

2) NA ACTIVITY "Relatório"
Montada a tela com as Label.Text que desejar os comandos para elas receberem são:
Sub Button1_Click 'Clicando neste botão retorna à tela principal Main
Activity.Finish
End Sub

Sub reportarx (X As Double)
Label22.Text=NumberFormat(X,0,2) 'Espaçamento final
End Sub
Sub reportarg (G As Double)
Label29.Text=NumberFormat(G,0,2) 'Bitola escolhida do estribo
End Sub

Sub reportarr (R As Double)
Label33.Text=NumberFormat(R,0,2) 'Vrd2
End Sub

Sub reportarm (M As Double)
Label34.Text=NumberFormat(M,0,2) 'fctm
End Sub

Sub reportarn (N As Double)
Label35.Text=NumberFormat(N,0,2) 'fctd
End Sub

Sub reportaro (O As Double)
Label36.Text=NumberFormat(O,0,2) 'Vc
End Sub

Sub reportarp (P As Double)
Label37.Text=NumberFormat(P,0,2) 'Vsw
End Sub

Sub reportars (S As Double)
Label38.Text=NumberFormat(S,0,2) 'Asw calculado
End Sub

Sub reportart (T As Double)
Label39.Text=NumberFormat(T,0,2) 'Asw mínimo
End Sub

Sub reportarj (J As Double)
Label40.Text=NumberFormat(J,0,2) 'Espaçamento calculado
End Sub

Sub reportarmaximo (MAXIMO As Double)
Label41.Text=NumberFormat(MAXIMO,0,2) 'Espaçamento MÁXIMO
End Sub

Sub reportarc (C As Double)
Label42.Text=NumberFormat(C,0,2) 'Vsd informado
End Sub

Sub reportarverifica (VERIFICA As String)
Label13.Text=VERIFICA
End Sub
 

Cableguy

Expert
Licensed User
Longtime User
Ao postar código pensa em utilizar as tags [c0de] [/c0de] para que seja mais fácil ler...
De facto, o código postado pode ser bastante mais reduzido, e deve ser evitado a utilização de tanta callsubdelayed consecutiva...
De momento não estou no PC, por isso não posso apresentar um alternativa
 
Top