• advertisement_alt
  • advertisement_alt
  • advertisement_alt
caiogarcia

Qual a melhor forma de passar "n" parametros para uma janela?

6 posts in this topic

Vamos supor que esteja fazendo uma insercao de algo e no meio do processo eu tenha que abrir uma outra janela com uma table, preencher alguns valores que tem que ser devolvidos pra essa janela inicial que requisitou essa outra janela de preenchimento...

Pensei em passar um array com os valores, mas nao consegui desenvolver muito pensando nisso... 

Share this post


Link to post
Share on other sites

No caso a Window precisa ser fechada, entao creio eu, que os parametros teriam que ser passados de alguma forma dentro do Close()

Share this post


Link to post
Share on other sites
11 minutos atrás, caiogarcia disse:

No caso a Window precisa ser fechada, entao creio eu, que os parametros teriam que ser passados de alguma forma dentro do Close()

Se quiser usar a função Close(), ela permite que você retorno "n" parâmetros (https://doc.windev.com/en-US/?3038018) desde que a janela tenha sido chamada via Open()

Como exemplo, tem esse código da página linkada acima:
 

// Código da janela inicial, que vai aguardar o retorno da janela a ser aberta e fechada subsequentemente

(MyLogin, MyPassword) = Open(WIN_EditPassword)

IF MyLogin <> "" OR MyPassword <> "" THEN

	Info("Wrong login or password")

END



// Código no botão de 'retorno', fechando a janela e retornado valores informados

Close("", EDT_Login, EDT_Password)

 

1 person likes this

Share this post


Link to post
Share on other sites

O Windev permite passar uma lista de valores como parâmetros.

Também é possível passar um array como parâmetro.

1) Primeiro declare uma estrutura. Exemplo:

estpar is structure

     codigofiscal is int

     situação is string

     cfop is int

     ICMS is int

END // final da declaração de estrutura

//Exemplo de preenchimento da estrutura

stpaspar is estpar

FOR EACH ROW OF TableFiscal // controle tabela de exemplo

     stpaspar.codigofiscal = TableFiscal.COL_codigofiscal 

    stpaspar.situacao = TaleFiscal.COL.situacao..DisplayedValue // se for o caso de um combo ou list

    stpaspar.cfo = TableFiscal.COL_cfop

    stpaspar.icms = TableFiscal.COL_icms

END

//Passando o parâmetro via array

arrPar is array of estpar

srPaspar is estpar

FOR EACH row of TableFiscal

   stPaspar.cfop = TableFiscal.COL_cfop

   stPaspar.situacao = TableFiscal.COL.situacao..DisplayedValu

   ArrayAddLine(arrPar,stPaspar)

END

// Chamando outra janela e passando o array como parâmetro

OPEN (WIN_parametro,arrpar)

Na janela WINPARAMETRO eu terei algo como

PROCEDURE(WIN_parametro,arrpar)

FOR I = 1 _TO_ arrPar..occurrence

  //preenche um controle tabela com o conteúdo do Array

   TableAddLine(TABLE_Fiscal,arrPar.CFOP,arrPar.Situacao

END

Não sei se é exatamente isso que você quer.

Apresentei um vídeo completo sobre isso na Devcon de Porto Alegre.

6 people like this

Share this post


Link to post
Share on other sites

Olá Pessoal,
Eu sei que nem todos gostam do Windows, aliás chamam de Ruindows, mas temos de aprender a tirar proveito das coisas e uma delas é aprender como basicamente o Windows fez para obter o máximo com o menos possível.
Em tese uma janela é uma função complexa porque interage com nosso inimigo público número 1, o usuário, esse elemento é capaz de nos destruir em pouquíssimo tempo de demonstração de software. Mas olhando de uma forma mais dinâmica, eu preciso saber o que o usuário fez e se ele me dá sinal verde para continuar ou não dentro do programa. Então uma WINDOW é fundamentalmente uma função que deve retornar True (sucesso) ou False (abortar) e como devemos então obter valores? Simples, utilizando ponteiros. Um ponteiro é simplesmente um endereço de memória não interessa qual o tipo, aliás isso pode ser decidido dentro do próprio procedimento. Vamos a prática. Preciso de uma WINDOW para pegar usuário que fez login, não me interessa nesse momento se ele acertou a senha ou se precisou ser lembrado dela, preciso saber da WINDOW qual o usuário logado em caso de sucesso. vamos fazer a chamada assim:
GloUsuario is string = ""
IF Open(WIN_LOGIN, GloUsuario)=False then
     endprogram()
end
//Nesse momento eu já sei que os procedimentos de recepção do usuário e que este está habilitado para executar nossa aplicação e principalmente em GloUsuario tenho o nome dele.
INFO(StringBuild("O USUÁRIO LOGADO É %1", GloUsuario))
O ponto da questão aqui é o seguinte, ao passar a variável GloUsuario como parâmetro para a WIN_LOGIN, o que foi para lá não foi o conteúdo dela e sim o endereço da memória que ela se encontra, e como houve sucesso o seu retorno, indica que o conteúdo foi preenchido dentro da WIN_LOGIN, nada mais me interessa nesse momento.
Agora, dentro da Procedure WIN_LOGIN, vamos analisar a primeira linha assim:

 
Olá Pessoal,

Eu sei que nem todos gostam do Windows, aliás chamam de Ruindows, mas temos de aprender a tirar proveito das coisas e uma delas é aprender como basicamente o Windows fez para obter o máximo com o menos possível.

Em tese uma janela é uma função complexa porque interage com nosso inimigo público número 1, o usuário, esse elemento é capaz de nos destruir em pouquíssimo tempo de demonstração de software. Mas olhando de uma forma mais dinâmica, eu preciso saber o que o usuário fez e se ele me dá sinal verde para continuar ou não dentro do programa. Então uma WINDOW é fundamentalmente uma função que deve retornar True (sucesso) ou False (abortar) e como devemos então obter valores? Simples, utilizando ponteiros. Um ponteiro é simplesmente um endereço de memória não interessa qual o tipo, aliás isso pode ser decidido dentro do próprio procedimento. Vamos a prática. Preciso de uma WINDOW para pegar usuário que fez login, não me interessa nesse momento se ele acertou a senha ou se precisou ser lembrado dela, preciso saber da WINDOW qual o usuário logado em caso de sucesso. vamos fazer a chamada assim:

GloUsuario is string = ""

IF Open(WIN_LOGIN, GloUsuario)=False then

     endprogram()

end

//Nesse momento eu já sei que os procedimentos de recepção do usuário e que este está habilitado para executar nossa aplicação e principalmente em GloUsuario tenho o nome dele.

INFO(StringBuild("O USUÁRIO LOGADO É %1", GloUsuario))

O ponto da questão aqui é o seguinte, ao passar a variável GloUsuario como parâmetro para a WIN_LOGIN, o que foi para lá não foi o conteúdo dela e sim o endereço da memória que ela se encontra, e como houve sucesso o seu retorno, indica que o conteúdo foi preenchido dentro da WIN_LOGIN, nada mais me interessa nesse momento.

Agora, dentro da Procedure WIN_LOGIN, vamos analisar a primeira linha assim:

 

PROCEDURE MyWindow(GS_USUARIO)
 

//Repare que nem o nome do argumento é o mesmo, mas o WINDEV sabe que foi passado um endereço e automaticamente associa esse endereço ao nome GS_USUARIO que na realidade ficou no procedimento que o chamou.

MyWindow..ReturnedValue        = False

//Esse código é para garantir o retorno de sucesso ou falso caso o nosso inimigo resolva cancelar a execução da WINDOW (clicando em cancel ou no X de fechamento)

Tudo pronto, então vamos direto para o código do botão validate:

//Ao clicar no botão validate, vamos testar no nosso exemplo se pelo menos o usuário colocou algum preenchimento sobre o nome do LOGIN, mas poderia testar se a senha estaria correta, se o usuário existe em uma tabela pré determinada e etc ...

IF Length(LOGIN)=0 THEN
    Info("Imbecil, pelo menos preencha o nome do usuário")
    ReturnToCapture(LOGIN)
END

//Feito isso, vamos informar ao nosso procedimento que houve sucesso na intenção de capturar o nome do usuário
MyWindow..ReturnedValue        = True

//IMPORTANTE, como o usuário informou o nome do LOGIN, vamos escrever na variável CHAMADORA o nome informado.
GS_USUARIO        = LOGIN

//Mando fechar simplesmente o Procedimento.
Close()

O Close está em um botão para que seja chamado o evento close da Window, o código não está lá porque precisamos ter segurança que foi pelo pressionamento do botão VALIDATE.

Apenas para constar, podemos passar quantos parâmetros desejar, até mesmo uma array inteira, lembrando que a definição dessa variável é de responsabilidade do procedimento chamador e não do procedimento chamado que apenas faz uso dela (mesmo que esteja com outro nome)

 

Abraços

 

1 person likes this

Share this post


Link to post
Share on other sites
Citar

IF Length(LOGIN)=0 THEN
    Info("Imbecil, pelo menos preencha o nome do usuário")
    ReturnToCapture(LOGIN)
END

:D:D

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now