cria forms de acordo com o nome passado
Oi pessoal estou com uma dúvida sobre o código abaixo:
*************************************************************
if NomeForm = ´form_aluno´ then
begin
[b:39ed62aaa7]Application.CreateForm(TForm_Aluno, Form_Aluno);[/b:39ed62aaa7]
Form_Aluno.Left := 0;
Form_Aluno.Top := 0;
end;
if NomeForm = ´form_responsavel´ then
begin
[b:39ed62aaa7]Application.CreateForm(TForm_Responsavel, Form_Responsavel);[/b:39ed62aaa7]
Form_Responsavel.Left := 0;
Form_Responsavel.Top := 0;
end;
*************************************************************
Tem alguma maneira de eu cria os forms passando apenas a string NomeForm?
Ex: algo mais ou menos assim
[b:39ed62aaa7]Application.CreateForm(T + ´NomeForm´, NomeForm);[/b:39ed62aaa7]
assim eu teria uma linha para criar o form solicitado dentro da procedure.
Desde já obigado.[b:39ed62aaa7][/b:39ed62aaa7]
*************************************************************
if NomeForm = ´form_aluno´ then
begin
[b:39ed62aaa7]Application.CreateForm(TForm_Aluno, Form_Aluno);[/b:39ed62aaa7]
Form_Aluno.Left := 0;
Form_Aluno.Top := 0;
end;
if NomeForm = ´form_responsavel´ then
begin
[b:39ed62aaa7]Application.CreateForm(TForm_Responsavel, Form_Responsavel);[/b:39ed62aaa7]
Form_Responsavel.Left := 0;
Form_Responsavel.Top := 0;
end;
*************************************************************
Tem alguma maneira de eu cria os forms passando apenas a string NomeForm?
Ex: algo mais ou menos assim
[b:39ed62aaa7]Application.CreateForm(T + ´NomeForm´, NomeForm);[/b:39ed62aaa7]
assim eu teria uma linha para criar o form solicitado dentro da procedure.
Desde já obigado.[b:39ed62aaa7][/b:39ed62aaa7]
Magnof
Curtidas 0
Respostas
Marco Salles
14/03/2005
Tem alguma maneira de eu cria os forms passando apenas a string NomeForm?
Ex: algo mais ou menos assim
Application.CreateForm(T + ´NomeForm´, NomeForm);
assim eu teria uma linha para criar o form solicitado dentro da procedure.
Desde já obigado.
[b:e9c68e048b]Amigo : Tente assim:[/b:e9c68e048b]
procedure CriarFormPeloNome(TFormulario:TComponentClass; var Formulario); begin Application.CreateForm(TFormulario,Formulario); Tform(Formulario).ShowModal; Freeandnil(TForm(formulario)); end; Para Chamar O método basta: CriarFormPeloNome(TNomeDoForm,NomeDoForm);
GOSTEI 0
Magnof
14/03/2005
entendi seu código. porém se eu quiser passar uma string com o nome do form e não o form. teria jeito.
GOSTEI 0
Rômulo Barros
14/03/2005
Pesquise, aqui mesmo no fórum, por [b:0e6c8d739c]FindComponent[/b:0e6c8d739c] para resolver sua situação. :wink:
GOSTEI 0
Marco Salles
14/03/2005
entendi seu código. porém se eu quiser passar uma string com o nome do form e não o form. teria jeito
Jeito em delphi , tudo tem :D :D :D ...
So não entendi qual a dificuldade em passar o Form do Nome do Form :?: :?: :?: ... Sei lá . Me parece indiferente.
:idea: Diga-se de passagem que estes Forms :arrow: Devem estar na Secção Available Forms[b:0c2abd01c6] e [/b:0c2abd01c6]não na secção Auto_Create_Form.
GOSTEI 0
Magnof
14/03/2005
[quote:9bd48bfbf3=´Undeclared Identifier´]Pesquise, aqui mesmo no fórum, por [b:9bd48bfbf3]FindComponent[/b:9bd48bfbf3] para resolver sua situação. :wink:[/quote:9bd48bfbf3]
É exatamente o que eu precisava. Vc é o cara. Veja o código como ficou. Valeu.
[color=red:9bd48bfbf3][b:9bd48bfbf3]var
formulario: TForm;
NomeForm: string
begin
NomeForm := ´Form_Clientes´;
formulario := TForm(Self.FindComponent(NomeForm));
Application.CreateForm(tform, formulario);
formulario.Show;[/b:9bd48bfbf3][/color:9bd48bfbf3]
É exatamente o que eu precisava. Vc é o cara. Veja o código como ficou. Valeu.
[color=red:9bd48bfbf3][b:9bd48bfbf3]var
formulario: TForm;
NomeForm: string
begin
NomeForm := ´Form_Clientes´;
formulario := TForm(Self.FindComponent(NomeForm));
Application.CreateForm(tform, formulario);
formulario.Show;[/b:9bd48bfbf3][/color:9bd48bfbf3]
GOSTEI 0
Magnof
14/03/2005
[quote:dea24d7ba3=´Undeclared Identifier´]Pesquise, aqui mesmo no fórum, por [b:dea24d7ba3]FindComponent[/b:dea24d7ba3] para resolver sua situação. :wink:
É exatamente o que eu precisava. Vc é o cara. Veja o código como ficou. Valeu.
[color=green:dea24d7ba3]var
formulario: TForm;
NomeForm: string
begin
NomeForm := ´Form_Clientes´;
formulario := TForm(Self.FindComponent(NomeForm));
Application.CreateForm(tform, formulario);
formulario.Show;[/b][/quote:dea24d7ba3][/color:dea24d7ba3]
[color=red:dea24d7ba3]Corrigindo. Ainda não consegui. Na verdade o Código acima cria um novo form para a aplicação. Eu queria é chamar um form pasasndo apenas uma string com o nome dele.
É mais ou menos o código acima.
Se alguém ainda puder me ajudar agradeço. [/color:dea24d7ba3]
GOSTEI 0
Marco Salles
14/03/2005
Magnof Citou
Eu vou continuar insistindo mesmo sabendo que corro risco de receber uma má resposta, do tipo:[b:465135f492] ´Eu Quero assim pô´[/b:465135f492]
Qual o Problema em chamar uma Procedure Passando o Nome do Form, da chamanda passando o Form :?: :?: :?:
Eu acho Não tem Nanhuma dificuldade.. Alem do mais o segundo Método , Posso garantir que funciona.. Não irá ter o Problema descrito
Magnof Citou:
[b:465135f492]É Claro que continuo a Insistir:[/b:465135f492]
Marco salles Citou :
Corrigindo. Ainda não consegui. Na verdade o Código acima cria um novo form para a aplicação. Eu queria é chamar um form pasasndo apenas uma string com o nome dele.
É mais ou menos o código acima.
Se alguém ainda puder me ajudar agradeço.
Eu vou continuar insistindo mesmo sabendo que corro risco de receber uma má resposta, do tipo:[b:465135f492] ´Eu Quero assim pô´[/b:465135f492]
Qual o Problema em chamar uma Procedure Passando o Nome do Form, da chamanda passando o Form :?: :?: :?:
Procedure 1) begin NomeForm := ´Form_Clientes´; formulario := TForm(Self.FindComponent(NomeForm)); Application.CreateForm(tform, formulario); formulario.Show;
Procedure 2? procedure CriarFormPeloNome(TFormulario:TComponentClass; var Formulario); begin Application.CreateForm(TFormulario,Formulario); Tform(Formulario).ShowModal; Freeandnil(TForm(formulario)); end; Para Chamar O método basta: CriarFormPeloNome(TForm_Clientes,Form_Clientes);
Eu acho Não tem Nanhuma dificuldade.. Alem do mais o segundo Método , Posso garantir que funciona.. Não irá ter o Problema descrito
Magnof Citou:
Ainda não consegui. Na verdade o Código acima cria um novo form para a aplicação
.[b:465135f492]É Claro que continuo a Insistir:[/b:465135f492]
Marco salles Citou :
Diga-se de passagem que estes Forms Devem estar na Secção Available Forms e não na secção Auto_Create_Form.
GOSTEI 0
Magnof
14/03/2005
[quote:cff9308317=´Marco Salles´]Magnof Citou
Eu vou continuar insistindo mesmo sabendo que corro risco de receber uma má resposta, do tipo:[b:cff9308317] ´Eu Quero assim pô´[/b:cff9308317]
Qual o Problema em chamar uma Procedure Passando o Nome do Form, da chamanda passando o Form :?: :?: :?:
Eu acho Não tem Nanhuma dificuldade.. Alem do mais o segundo Método , Posso garantir que funciona.. Não irá ter o Problema descrito
Magnof Citou:
[b:cff9308317]É Claro que continuo a Insistir:[/b:cff9308317]
Marco salles Citou :
Oi Marcos. Consegui o que queria com o código abaixo. De qualquer forma muito obrigado por sua ajuda T+.
procedure TForm_Menu.CriarForm(NomeForm: String);
var
APersistentClass: TPersistentClass;
AForm: TForm;
FormCriado : Boolean;
begin
NomeForm := TRIM(LowerCase(NomeForm)); [color=green:cff9308317]//converte o NomeForm em minúsculo[/color:cff9308317]
APersistentClass := GetClass(NomeForm);
if APersistentClass = nil then
showmessage(´Programa não localizado!´)
else
begin
[color=green:cff9308317] {Verifica se o Form já foi criado ou não.}[/color:cff9308317]
if Self.MDIChildCount > 0 then
begin
FormCriado := false;
for i := 0 to self.MDIChildCount -1 do
begin
if LowerCase(´t´+ MDIChildren[i].Name) = NomeForm then
FormCriado:= true;
end;
if FormCriado = false then
begin
AForm := TComponentClass(APersistentClass).Create(Application) as TForm;
AForm.Left := 0;
AForm.Top := 0;
AForm.Show;
end;
end else
begin
AForm := TComponentClass(APersistentClass).Create(Application) as TForm;
AForm.Left := 0;
AForm.Top := 0;
AForm.Show;
end;
end;
end;
Corrigindo. Ainda não consegui. Na verdade o Código acima cria um novo form para a aplicação. Eu queria é chamar um form pasasndo apenas uma string com o nome dele.
É mais ou menos o código acima.
Se alguém ainda puder me ajudar agradeço.
Eu vou continuar insistindo mesmo sabendo que corro risco de receber uma má resposta, do tipo:[b:cff9308317] ´Eu Quero assim pô´[/b:cff9308317]
Qual o Problema em chamar uma Procedure Passando o Nome do Form, da chamanda passando o Form :?: :?: :?:
Procedure 1) begin NomeForm := ´Form_Clientes´; formulario := TForm(Self.FindComponent(NomeForm)); Application.CreateForm(tform, formulario); formulario.Show;
Procedure 2? procedure CriarFormPeloNome(TFormulario:TComponentClass; var Formulario); begin Application.CreateForm(TFormulario,Formulario); Tform(Formulario).ShowModal; Freeandnil(TForm(formulario)); end; Para Chamar O método basta: CriarFormPeloNome(TForm_Clientes,Form_Clientes);
Eu acho Não tem Nanhuma dificuldade.. Alem do mais o segundo Método , Posso garantir que funciona.. Não irá ter o Problema descrito
Magnof Citou:
Ainda não consegui. Na verdade o Código acima cria um novo form para a aplicação
.[b:cff9308317]É Claro que continuo a Insistir:[/b:cff9308317]
Marco salles Citou :
Diga-se de passagem que estes Forms Devem estar na Secção Available Forms e não na secção Auto_Create_Form.
[/quote:cff9308317]Oi Marcos. Consegui o que queria com o código abaixo. De qualquer forma muito obrigado por sua ajuda T+.
procedure TForm_Menu.CriarForm(NomeForm: String);
var
APersistentClass: TPersistentClass;
AForm: TForm;
FormCriado : Boolean;
begin
NomeForm := TRIM(LowerCase(NomeForm)); [color=green:cff9308317]//converte o NomeForm em minúsculo[/color:cff9308317]
APersistentClass := GetClass(NomeForm);
if APersistentClass = nil then
showmessage(´Programa não localizado!´)
else
begin
[color=green:cff9308317] {Verifica se o Form já foi criado ou não.}[/color:cff9308317]
if Self.MDIChildCount > 0 then
begin
FormCriado := false;
for i := 0 to self.MDIChildCount -1 do
begin
if LowerCase(´t´+ MDIChildren[i].Name) = NomeForm then
FormCriado:= true;
end;
if FormCriado = false then
begin
AForm := TComponentClass(APersistentClass).Create(Application) as TForm;
AForm.Left := 0;
AForm.Top := 0;
AForm.Show;
end;
end else
begin
AForm := TComponentClass(APersistentClass).Create(Application) as TForm;
AForm.Left := 0;
AForm.Top := 0;
AForm.Show;
end;
end;
end;
GOSTEI 0
Marco Salles
14/03/2005
Muitas das vesez a gente não sabe exatamente o que os amigos querem.
e a reciproca segue fiel e verdadeira :) :) :)
Isto porque a escrita nen sempre e bem compreendida
Eu tentei simular o que voce disse: :lol: :lol: :lol:
Sinceramente eu Esperava que o Form2 Fosse Criado ao ser disparado o Evento OnClick Do Botão. Mas definitivamente Não foi :cry: :cry: :cry:
Mas como eu mesmo disse:
[b:02198264b8]Muitas das vesez a gente não sabe exatamente o que os amigos querem.[/b:02198264b8]
[b:02198264b8]Mas de tudo vale aquilo que voce disse:[/b:02198264b8]
E eu fico feliz por isto :P :P :P :P :P
e a reciproca segue fiel e verdadeira :) :) :)
Isto porque a escrita nen sempre e bem compreendida
Eu tentei simular o que voce disse: :lol: :lol: :lol:
Abri um novo projeto com dois forms ( O Form Principal Chamado De TFORM_MENU e o Form Secundário Chamei de Form2) Então No Evento OnClick De Um Botão Escrevi: procedure TForm_Menu.Button1Click(Sender: TObject); begin Form_Menu.CriarForm(´Form2´); end; Rodei o Programa e ao clicar no evento OnClick De Um Botão ,Recebi sempre a mesma resposta: ´Programa não localizado´
Sinceramente eu Esperava que o Form2 Fosse Criado ao ser disparado o Evento OnClick Do Botão. Mas definitivamente Não foi :cry: :cry: :cry:
Mas como eu mesmo disse:
[b:02198264b8]Muitas das vesez a gente não sabe exatamente o que os amigos querem.[/b:02198264b8]
[b:02198264b8]Mas de tudo vale aquilo que voce disse:[/b:02198264b8]
Oi Marcos. Consegui o que queria com o código abaixo. De qualquer forma muito obrigado por sua ajuda T+.
E eu fico feliz por isto :P :P :P :P :P
GOSTEI 0
Massuda
14/03/2005
Para o esquema usando FindClass funcionar OK, em cada unit que declara um form que poderá ser criado pelo nome, inclua o seguinte:no final da unit, antes do ´end.´ Isso garante que o Delphi conseguirá encontrar a classe pelo nome.
Aliás, esse esquema de usar RegisterClass/FindClass pode ser usado para qualquer classe que seja descendente de TPersistent.
initialization RegisterClass(TSeuForm);
Aliás, esse esquema de usar RegisterClass/FindClass pode ser usado para qualquer classe que seja descendente de TPersistent.
GOSTEI 0