Passar valor de variável de uma TForm p/ outra TForm?

Delphi

08/09/2009

Amigos, como farei para pegar o valor de uma variável em um Formulário e passar para outro formulário?

O contexto é o seguinte, tenho um formulário de cadastro e para preencher alguns dos campos, chamo um formulário de pesquisa onde o usuário pesquisa o valor desejado e ao fechar o TForm de pesquisa alguns dos campos no TForm de cadastro são automáticamente preenchidos.

Acredito que este seja um caso comum para os experientes... Me ajudem, por favor!


Dogu

Dogu

Curtidas 0

Respostas

Osocram

Osocram

08/09/2009

amigo,
Vc por acaso ja pesquisou aqui no forum mesmo antes de postar?
Pois so mes passado teve 2 topicos sobre esse assunto.
Da uma olhada neles primeiro.


GOSTEI 0
Dogu

Dogu

08/09/2009

Eu não sei como faço para pesquisar um assunto assim, qual seria a palavra chave ou mesmo o tema a ser pesquisado? Fui lá e coloquei ´TForm para Tform´ e o resultado da pesquisa foi um ´pau lascado´ no resultado da consulta. Olha aí um pedaço do resultado:

DEBUG MODE

SQL Error : 1406 Data too long for column ´search_array´ at row 1

INSERT INTO phpbb_search_results (search_id, session_id, search_array) VALUES(590326299, ´871cc57afb7b21b5e182f6c1b6b9d2c0´, ´a:7:{s:14:´search_results´;s:79456:´3, 39, 43, 64, 68, 71, 74, 118, 120, 121, 128, 146, 155, 174, 179, 247, 282, 302, 314, 315, 332, 355, 358, 391, 3


GOSTEI 0
Dogu

Dogu

08/09/2009

Na verdade é ´TForm para outro Tform´ que causa isso. ´TForm para Tform´ não dá problema não!


GOSTEI 0
Osocram

Osocram

08/09/2009

eu tentei por ´passar valor´

http://forum.devmedia.com.br/search.php?mode=results
esta aqui o resultado


GOSTEI 0
Dogu

Dogu

08/09/2009

Encontrei este tópico abaixo pela sua chave de peskisa, mas não foi nada interessante. Houve uma debatezinho lá, mas acho que a solução proposta ficou muito a nível de gambiarra... Acredito que com o Delphi dá pra ser mais profissional não acha?

http://forum.devmedia.com.br/viewtopic.php?t=94449&highlight=passar+valor


GOSTEI 0
Osocram

Osocram

08/09/2009

veja este link, é um dos topicos que estavam la
[url]http://forum.devmedia.com.br/viewtopic.php?t=101595&start=0&postdays=0&postorder=asc&[/url]

É sobre como mandar o valor do MenuItem que esta clicando para o form que ele abriu.
Acho que é isso que vc quer.
Veja se resolve.


GOSTEI 0
Dogu

Dogu

08/09/2009

Dei uma lida no tópico indicado por vc acima, mas acredito que não é isso não. Acho que em um fórum como este ou eu me expressei mal pra karamba, ou os colegas que sabem não estão muito dispostos a responder rsrsrs... MAS, uma solução indicada por Vinicius Vieira, utiliza o recurso de ´ModalResult := mrOk;´ no formulário de onde quero importar os dados. Então, qdo o evento ocorre, estou pronto para importar quaisquer dados de variáveis do formulário. Tipo primeiroForm.aributo1 := segundoForm.atributo2.


GOSTEI 0
Osocram

Osocram

08/09/2009

As pessoas nesse forum como em quase todos os outros não gostam de ficar respondendo tópicos que ja foram discutidos.

Este por exemplo ao meu ver é exatamente o mesmo caso.

Tudo depende de como vc programa, existem milhares de formas, vai depender tbm do seu conhecimento.

Vamos dar nome aos bois FormCadastro e FormPesquisa.
O jeito mais simples de se fazer isso
no FormCadastro
var
resultado :string

FormPesquisa := TFormPesquisa.Create(nil);
try
//so p inicializar a variavel
resultado := ´´;
//importando que no seu form Pesquisa vc use ModalResult para fechar, exemplo ModalResult := mrOK no botão OK e ModalResult := mrOK no botão cancelar;
if formPesquisa.showModal = mrOk then begin
resultado := FormPesquisa.ResultadoDaPesquisa;
end;
finally
FormPesquisa.release;
formPesquisa := nil
end;


GOSTEI 0
Osocram

Osocram

08/09/2009

esqueci de colocar as tags e perdeu toda a formatação...
:?

var
  resultado :string

  FormPesquisa := TFormPesquisa.Create(nil);
  try
    //so p inicializar a variavel
    resultado := ´´;
    //importando que no seu form Pesquisa vc use ModalResult para fechar, exemplo ModalResult := mrOK no botão OK e ModalResult := mrOK no botão cancelar;
    if formPesquisa.showModal = mrOk then begin
      resultado := FormPesquisa.ResultadoDaPesquisa;      
    end;
  finally
    FormPesquisa.release;
    formPesquisa := nil
  end;



GOSTEI 0
Afarias

Afarias

08/09/2009

Uma forma (não elaborada) de fazer é apenas:


procedure TFormCadastro.Button1Click(Sender: TObject);
begin
  with TFormPesquisa.Create(Self) do
    try
      if ModalResult=mrOK then
      begin
         // leia as propriedades/componentes do form
         // e preencha os campos
      end;
    finally
      Free;
    end;
end;



T+


GOSTEI 0
Dogu

Dogu

08/09/2009

Exatamente! E a forma que agora uso é assim:

    try Application.CreateForm(TFormPeskisaFornecedor,FormPeskisaFornecedor);
        if FormPeskisaFornecedor.ShowModal = mrOk then
        begin
            edtFornecedor.Text := FormPeskisaFornecedor.Nome;
            DsOutrasContas.DataSet.FieldByName(´FOR_ID´).AsInteger := FormPeskisaFornecedor.idFornecedor;
        end;
    Finally FreeAndNil(FormPeskisaFornecedor);
      End;
    Try
        if dbedtNumDoc.canfocus then
            dbedtNumDoc.SetFocus;
    except end;



GOSTEI 0
Walterfoliveira

Walterfoliveira

08/09/2009

Olha colega verifica se te ajuda, mas comenta se deu certo ou nao, qualque duvida posta ai.


Na secao private do Form ( Pesquisa ) declare assim:

Constructor Criar(Owner : TComponent; Key : Char);

Constructor TfmConsulta.Criar(Owner : TComponent; Key : Char);
begin
inherited create(owner);
If key in ([´a´..´z´, ´A´..´Z´, ´0´..´9´]) Then
edtValor.Text:= Key;
ComandoSQL...
End;


Agora na tela de cadastro
No evento OnKeyPress ( do edit/DbEdit )

var
Consulta : TfmConsulta;
begin
Consulta:= TfmConsulta.Criar(Self, key); //Cidade
if (Consulta.ShowModal = mrOk) then
begin
If (Not ( cdsCliente.State in [dsEdit, dsInsert])) Then
cdsCliente.Edit;

cdsClienteCIDADE.AsString:= Consulta.dscPesquisa.fieldByName(´Nome´).AsString;
cdsConveniadoUF.AsString:= Consulta.dscPesquisa.fieldByName(´Sigla´).AsString;

end;
Key:= #0;
Consulta.Free;
end;


GOSTEI 0
Osocram

Osocram

08/09/2009

Uma dica sobre como liberar o Formulario.
Não use FreeAndNil para liberar o Formulario, agora não lembro mto bem o pq, mas FreeAndNil utilize para liberar Objetos normais, sem ser o formulario nem os datamodules.

use assim
  finally 
    FormPesquisa.release; 
    formPesquisa := nil 
  end;

Exatamente! E a forma que agora uso é assim:
    try Application.CreateForm(TFormPeskisaFornecedor,FormPeskisaFornecedor);
        if FormPeskisaFornecedor.ShowModal = mrOk then
        begin
            edtFornecedor.Text := FormPeskisaFornecedor.Nome;
            DsOutrasContas.DataSet.FieldByName(´FOR_ID´).AsInteger := FormPeskisaFornecedor.idFornecedor;
        end;
    Finally FreeAndNil(FormPeskisaFornecedor);
      End;
    Try
        if dbedtNumDoc.canfocus then
            dbedtNumDoc.SetFocus;
    except end;



GOSTEI 0
Dogu

Dogu

08/09/2009

Não fiz o teste ainda não, mas só de vê percebo que a sua versão de código tem a sensibilidade de já chamar a tela de pesquisa com um caracter antecipando uma prévia de resultados. E que a grande sacada está na alteração do Construtor para ser capaz de receber o tal caracter. Muito legal :!:


GOSTEI 0
Dogu

Dogu

08/09/2009

Uai, FreeAndNil aprendi com as vídeo-aulas da DevMedia, agora não sei se foi com Rodrigo Mourão ou com Renato Correia. Mas, lembro-me de que era exatamente para não usar estes dois passos separados de release e free nos formulários. Se for fácil de achar esta questão no livro Bíblia Delphi 2005 do Marco Cantu, volto aqui postarei alguma coisa...


GOSTEI 0
POSTAR