Janela de Pesquisa

Em uma app desktop tenho um formulrio de manuteno de usurios com botoes Incluir, alterar, excluir, pesquisar e etc…
A ideia dentro da janela de manuteno de usurios quando o boto pesquisar for pressionado chamar uma janela que eu digite o nome, e ele me liste todos os usuarios com este nome.

Minha pergunta : como fazer isso em Xojo ?
devo chamar outra janela ou criar um container .

No Visual Fox tem uma opo em que eu chamo esta janela de pesquisa e tudo que e feito nesta janela de pesquisa o formulario que chamou esta janela de pesquisa, consegue ver o que feito neste formulario.

No sei se fui muito claro, gostaria de saber como fazer isso de melhor maneira no xojo.

Cauby, eu procuro usar o padro abaixo, mostrando primeiro uma lista, com a opo de busca no topo, e a medida que o usurio digita, ou quando clica na lupa, faz a busca.

… No cdigo, a montagem do sql para a pesquisa fica mais ou menos assim, preenchendo novamente a listBox"

"and fornecedores.razaosocial like " + "'%" + txtBusca.Text + "%'"

Completando, funciona do modo que voc escolher. No caso mostrado, uso um Container Control, e quando o usurio clica duas vezes, chamo outro Container Control com os detalhes do registro. Sou avesso a abrir janelas, a no ser as de mensagens de erros e avisos para o usurio.

Mas se decidir abrir uma janela em separado, tambm possvel passar parmetros e receber retornos.

Como seria esta passagem de parametro de um formulario para outro ?

Eu costumo fazer da seguinte maneira:

  • Você cria no formulário (Window) que precisa receber o parâmetro, uma propriedade, e torna ela pública. Por exemplo, se você precisar receber um código de cliente, que deverá ser mostrado em um formulário, quando um usuário clica em uma lista. Neste caso, você cria no formulário, a propriedade myCodigoCliente, como string, pública. Supondo que você vai usar este código em uma cláusula sql select, para buscar o registro…

  • Na janela que contém a lista, digamos que você vai chamar o formulário ao clicar no botão “Alterar”. Vamos também concordar, que o nome do formulário chamado, no projeto, seria winClienteDetalhe. Então, ao clicar no botão, você cria uma nova instância do formulário desejado, com o código Dim formClienteDetalhe As New winClienteDetalhe.

  • Antes de você mostrar o formulário, com o comando “show”, você atribui um valor da sua lista (o id do registro…), a propriedade pública do formulário. Assim: formClienteDetalhe.myCodigoCliente = myIdDaLista.

  • Agora sim, você mostra o formulário com “formClienteDetalhe.show”, e ele já terá acesso ao código que interessa, pois você já atribuiu a propriedade pública. Então, no evento Open do formulário, você pode colocar a sua busca SQL e atribuir os valores encontrados aos campos do formulário.

Desta forma, você pode criar diversos tipos de propriedades, e passar qualquer objeto, inclusive um outro formulário (window) como parâmetro. Assim, se você quiser atualizar algum valor no formulário antigo, antes de fechar o atual, você pode. Mas isso é apenas um exemplo, uma forma de fazer… E mostra bem o quanto Xojo é flexível.

Entendi a ideia da propriedade para chamar outro formulrio com passagem de parmetro , mas o uso do Container Control no ficou muito claro, olhei o exemplo do xojo achei meio complicado a explicao.

Se eu incorporar ele ao formulrio.
Chamaria ele assim:
Container.Visible = True // o conteiner aparece na janela
Container.Visible = False // o conteiner escondido da janela

OU
Se eu no colocar ele no formulrio
Ficaria assim:
Dim tc As New TestContainer
tc.EmbedWithin(Self, 10, 100, 300,400)

Outra duvida se tenho um container com um text field chamado nome e quiser passar para um text field do formulrio, o formulrio enxerga o text field do container ?
ex: formulario.textfield.text = container.textfield.text // isso valido ?

Se tiver um pequeno exemplo de uso do container para eu enteder melhor agradeo.

Estou dando um trabalho danado, kkkkk

Antecipadamente.

      Obrigado.

Cauby, tranquilo, perguntando e testando que se aprende. Vamos por partes…

Quanto ao Container Control, se voc tratar ele como se fosse um formulrio, colocando listbox, campos e botes, a idia usar a sua segunda opo, estanciando e usando EmbedWithin. Para dar uma idia, na figura que postei mais acima, todo o lado direito, que no o Menu Lateral, um controle Canvas, onde eu adiciono e removo Containers, como no exemplo que voc citou. Assim, no abro janelas.

Quanto a acessar um TextField de um Container, funciona, e fcil. Desde que voc use o acesso totalmente qualificado do componente. Ou seja, se o Container estiver dentro de uma Window ou de um Canvas, voc precisa usar Canvas.Container.textField.text, ou Window.Container.TextField.text.

De resto, no tem segredo. como voc postou. Tem alguns pequenos detalhes para levar em conta. Por exemplo, voc precisa ter na sua janela principal, um mtodo que seja chamado antes de instanciar qualquer Container Control, para verificar se j no existe um outro Container Control no Canvas, e se existir, remover. Neste caso, voc precisa saber antecipadamente, qual o Container que est instanciado l… Como fazer isso ? Este um timo exemplo do que citei anteriormente. Voc mantm uma propriedade pblica, do tipo Container Control, na janela principal, e assim que for instanciar um Container, guarda o nome dele nesta propriedade. Assim, no momento da remoo, voc sabe onde buscar a informao.

Estou com o tempo muito curto nestas ltimas semanas, mas a partir do meio da semana que vem, minha agenda volta ao normal, e vou tratar de todos estes detalhes no blog tambm. Mas no se preocupe, pergunte a vontade. Enquanto eu puder ajudar, estou a disposio. Mas pelo jeito, seu ritmo de aprendizado est muito bom…

Testando o Container, notei que se um formulrio chamar um container e esse container ficar por cima do formulrio, o foco fica no formulrio e no container tambm, ou seja voce pode digitar nos text field de formulario e no text field de um container tambm .

Tem como o container ter comportamento de um formulrio modal ? ou seja, quando eu estiver no container nao conseguir digitar nos controles do formulrio.

Outra pegunta:
criei um container em um formulario

Dim ctusu As New CtnUsuario
ctusu.EmbedWithin(Self, 0,20)

Como eu destruo este conainer ?

ctusu.close() // seria assim que eu retiro o container do formulario

Obrigado.

  Cauby.

Quanto a destruir o container, isso mesmo. Eu uso tambm container = nil, aps o container.close. No lembro se tive algum problema anterior, mas adotei este procedimento como padro.

J quanto a sua primeira pergunta, confesso que no entendi muito bem o que voc est tentando fazer… Voc poderia postar parte do cdigo, de preferncia com uma cpia de tela ?

Desculpe, esta semana tambm fiquei meio enrolado, mais acho que entendi o comportamento do Container, qualquer zebra eu pergunto novamente.

Para o caso especifico que eu queria resolvi adotar o PagePanel que foi tranquilo de trabalhar, nem perguntei nada sobre ele aqui no grupo, kkkkk

Obrigado.