Chamar Formulário por variável

Delphi

03/10/2022

Olá a todos!
O código abaixo está funcionando (Registro as classes no initialization e no finalization).
Porém, quando estou no formulário chamado (ex. fornecedor) e a partir do fornecedor, chamo o form de ''''''''Representante'''''''' para adicioná-lo, não consigo manipular a querry do fornecedor, pq diz q não é possível a operação em um dataset fechado.
Quando eu chamava o form através do " Try Application.Createform(TfrmUsina, frmUsina); frmUsina.ShowModal; Finally FreeAndNil(frmUsina);" dava certo.
Desde já, agradeço!

procedure TfrmMenu.abrirFormulario(Sender: TObject);
var Formulario : TForm;
FormularioClasse : TFormClass;
NomeFormulario : String;
begin
NomeFormulario := StringReplace(TSpeedButton(Sender).Name, ''''''''btn'''''''',''''''''Tfrm'''''''', [rfReplaceAll]);
try
FormularioClasse := TFormClass(FindClass(NomeFormulario));
Formulario := FormularioClasse.Create(Application);
Formulario.ShowModal;
except
on E : EClassNotFound do
begin
ShowMessage(''''''''Tela não encontrada'''''''');
end;
end;

Aqui está o problema a partir do código acima (parte de um procedimento para enviar o representante ao Fornecedor):
.....
..
if Caminho = ''''''''fornecedor'''''''' then

begin
frmUsinas.qryRepresentante.Refresh; // já dá pau por aqui..(lembrando que os datasets estão abertos desde o evento onshow do fornecedor);;
frmUsinas.editRepresentante.Text := qryRepresentante[''''''''NOME''''''''];
frmUsinas.qryRepresentante.Locate(''''''''representanteid'''''''',qryRepresentante[''''''''REPRESENTANTEID''''''''],[]);
Close;
end;
..
..
Bruno Gisse

Bruno Gisse

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

03/10/2022

é que você NÃO instanciou frmUsinas, você instanciou Formulario.
frmUsinas não existe na memória.

o comando Application.Createform(TfrmUsina, frmUsina) poderia ser escrito assim:
frmUsina := TfrmUsina.Create(Application) // << aqui teremos frmUsina instanciado a partir da classe TfrmUsina

mas você está fazendo assim:
Formulario := FormularioClasse.Create(Application); // << aqui teremos Formulario instanciado a partir da classe TfrmUsina

dependendo de onde o código abaixo é chamado, você poderia tentar algo assim:
TfrmUsinas(Formulario).qryRepresentante.Refresh; // fazendo typecast para o formulário correto
TfrmUsinas(Formulario).editRepresentante.Text := qryRepresentante['NOME'];
TfrmUsinas(Formulario).qryRepresentante.Locate('representanteid',qryRepresentante['REPRESENTANTEID'],[]);
mas isto funcionará somente se Formulario estiver visível no escopo do código.
GOSTEI 0
Bruno Gisse

Bruno Gisse

03/10/2022

é que você NÃO instanciou frmUsinas, você instanciou Formulario.
frmUsinas não existe na memória.

o comando Application.Createform(TfrmUsina, frmUsina) poderia ser escrito assim:
frmUsina := TfrmUsina.Create(Application) // << aqui teremos frmUsina instanciado a partir da classe TfrmUsina

mas você está fazendo assim:
Formulario := FormularioClasse.Create(Application); // << aqui teremos Formulario instanciado a partir da classe TfrmUsina

dependendo de onde o código abaixo é chamado, você poderia tentar algo assim:
TfrmUsinas(Formulario).qryRepresentante.Refresh; // fazendo typecast para o formulário correto
TfrmUsinas(Formulario).editRepresentante.Text := qryRepresentante['NOME'];
TfrmUsinas(Formulario).qryRepresentante.Locate('representanteid',qryRepresentante['REPRESENTANTEID'],[]);
mas isto funcionará somente se Formulario estiver visível no escopo do código.


Emerson!
Grato pelo feedback, meu querido!
O que ocorre é que essa procedure é capturada por botões no menu principal. Minha idéia é sempre que eu precisar adicionar forms e chamá-los pelo menu, basta eu adicionar speedbuttons com o nome do form, sem a necessidade de mexer no código, bastando chamar a procedure pelo evento onclick. Também registro as classes ( initialization RegisterClass(TfrmUsinas); finalization UnRegisterClass(TfrmUsinas);)
A procedure chama o form normalmente, onde é possível manipular os dados. Funciona numa boa.
Como funciona: Abro o formUsinas e preencho os campos para cadastro. O detalhe é que um desses campos é a chave estrangeira do representante. Então eu abro o frmRepresentante a partir do frmUsinas, escolho o representante e tento associar a querry do frmRpresentante com a da usina (frmUsinas.qryRepresentante.locate .....) o sistema levanta uma exceção dizendo que a qryRepresentante do formUsinas não está ativo/aberto (cannot perform this operation on a closed dataset)???.
Tá sendo o único problema, que seria sanado se eu chamasse o form como eu costumo fazer (Application.Createform(TfrmUsinas, frmUsina)).

GOSTEI 0
POSTAR