Fórum Passar valor de variável de uma TForm p/ outra TForm? #374692

08/09/2009

0

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

Responder

Posts

08/09/2009

Osocram

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.


Responder

Gostei + 0

08/09/2009

Dogu

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


Responder

Gostei + 0

08/09/2009

Dogu

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


Responder

Gostei + 0

08/09/2009

Osocram

eu tentei por ´passar valor´

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


Responder

Gostei + 0

09/09/2009

Dogu

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


Responder

Gostei + 0

09/09/2009

Osocram

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.


Responder

Gostei + 0

09/09/2009

Dogu

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.


Responder

Gostei + 0

09/09/2009

Osocram

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;


Responder

Gostei + 0

09/09/2009

Osocram

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;



Responder

Gostei + 0

09/09/2009

Afarias

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+


Responder

Gostei + 0

09/09/2009

Dogu

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;



Responder

Gostei + 0

09/09/2009

Walterfoliveira

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;


Responder

Gostei + 0

10/09/2009

Osocram

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;



Responder

Gostei + 0

10/09/2009

Dogu

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 :!:


Responder

Gostei + 0

10/09/2009

Dogu

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...


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar