Passar valor de variável de uma TForm p/ outra TForm?
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!
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
Curtidas 0
Respostas
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.
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
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
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
08/09/2009
Na verdade é ´TForm para outro Tform´ que causa isso. ´TForm para Tform´ não dá problema não!
GOSTEI 0
Osocram
08/09/2009
eu tentei por ´passar valor´
http://forum.devmedia.com.br/search.php?mode=results
esta aqui o resultado
http://forum.devmedia.com.br/search.php?mode=results
esta aqui o resultado
GOSTEI 0
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
http://forum.devmedia.com.br/viewtopic.php?t=94449&highlight=passar+valor
GOSTEI 0
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.
[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
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
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;
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
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
08/09/2009
Uma forma (não elaborada) de fazer é apenas:
T+
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
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
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;
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
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
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
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
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