Criar Formulario.
Pessoal.
Preciso criar os formularios da minha aplicação em tempo de execução, só que o nome do formulario esta em uma tabela no meu banco.
O menu da minha aplicação esta sendo criado em função da permissão do usuário que esta logando.
Quando o usuário clicar na opção do menu, eu devo criar o formulário pertencente a opção clicada.
Alguem tem alguma solução?
Grato.
:lol:
Preciso criar os formularios da minha aplicação em tempo de execução, só que o nome do formulario esta em uma tabela no meu banco.
O menu da minha aplicação esta sendo criado em função da permissão do usuário que esta logando.
Quando o usuário clicar na opção do menu, eu devo criar o formulário pertencente a opção clicada.
Alguem tem alguma solução?
Grato.
:lol:
Ericfp
Curtidas 0
Respostas
Carlosmielke
23/05/2004
caro colega
use a funcao FINDCLASS. ela retorna um obejto da classe tpersistentclass.
use desse modo
FINDCLASS(´t´+nome do formulario na tabela);
atenção
para que esta funcao funcione deve-se colocar o seguinte comando na seção INITIALIZATION
registerclass(TFORM1)
crie uma variavel do tipo TForm e use o seguinte comando.
form:=tform(findclass(´t´+nome do formulario na tabela)).create(self)
deve ser assim não lembro bem
espero ter ajudado..
CArlos mielke :)
use a funcao FINDCLASS. ela retorna um obejto da classe tpersistentclass.
use desse modo
FINDCLASS(´t´+nome do formulario na tabela);
atenção
para que esta funcao funcione deve-se colocar o seguinte comando na seção INITIALIZATION
registerclass(TFORM1)
crie uma variavel do tipo TForm e use o seguinte comando.
form:=tform(findclass(´t´+nome do formulario na tabela)).create(self)
deve ser assim não lembro bem
espero ter ajudado..
CArlos mielke :)
GOSTEI 0
Carlosmielke
23/05/2004
corrigindo o comando que eu dei acima:
use assim
with TFormClass(FindClass(([b:6d0962c117]´T´+nomeform[/b:6d0962c117])).Create(Self) do
try
ShowModal;
finally
Free;
end;
t+
carlos mielke
use assim
with TFormClass(FindClass(([b:6d0962c117]´T´+nomeform[/b:6d0962c117])).Create(Self) do
try
ShowModal;
finally
Free;
end;
t+
carlos mielke
GOSTEI 0
Ericfp
23/05/2004
Obrigado Carlos.
Desculpe a minha burrice. Onde fica a INITIALIZATION?
Grato.
Desculpe a minha burrice. Onde fica a INITIALIZATION?
Grato.
GOSTEI 0
Carlosmielke
23/05/2004
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedures
.....
....
....
[b:e7e2935bae]initialization[/b:e7e2935bae]
registerclass(TForm1);
end.
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedures
.....
....
....
[b:e7e2935bae]initialization[/b:e7e2935bae]
registerclass(TForm1);
end.
GOSTEI 0
Guilherme B
23/05/2004
Srs !
Fiz exatamento conforme o exemplo apresentado pelo Carlos e continua dando o erro de classe não encontrada.
Não consigo fazer funcionar
Fiz exatamento conforme o exemplo apresentado pelo Carlos e continua dando o erro de classe não encontrada.
Não consigo fazer funcionar
GOSTEI 0
Info.wtomfs
23/05/2004
Eu tbm estou com este problema!!!
Alguém pode ajudar ?
Alguém pode ajudar ?
GOSTEI 0
Guilherme B
23/05/2004
Acho que conseguiríamos solucionar o problema se tivesse uma maneira de traduzir uma string para TFormClass.
Será possível ?
Será possível ?
GOSTEI 0
Info.wtomfs
23/05/2004
Acabei de passar um e-mail para a borland....
Eles tem que resolver daí eu lançarei no Fórum Ok!!!
Eles tem que resolver daí eu lançarei no Fórum Ok!!!
GOSTEI 0
Rômulo Barros
23/05/2004
Aqui :::
...
[size=18:7fbc1fb2da][color=red:7fbc1fb2da] Uses Classes;[/color:7fbc1fb2da][/size:7fbc1fb2da]
....
...
[size=18:7fbc1fb2da][color=red:7fbc1fb2da] Uses Classes;[/color:7fbc1fb2da][/size:7fbc1fb2da]
....
procedure TForm1.Button1Click(Sender: TObject); Var Nome : TComponentClass; Ref : TForm; begin Nome := TForm2; Application.CreateForm(TComponentClass(Nome),Form2); // Ou assim Application.CreateForm(Nome,Ref); Ref.Name := ´MeuForm´; Ref.ShowModal; end;
GOSTEI 0
Guilherme B
23/05/2004
ESTE ÚLTIMO EXEMPLO TAMBÉM NÃO SE APLICA AO CASO.
O NOME DO FORM É UMA VARIÁVEL .
GRATO
O NOME DO FORM É UMA VARIÁVEL .
GRATO
GOSTEI 0
Info.wtomfs
23/05/2004
Exatamente, como eu disse o form é uma string que vêm do banco, que é jogado na variável string da procedure
Procedure CriaForm(NomeForm : Tform);
Begin
NomeForm := TForm.Create(Application);
NomeForm.Show;
End
Else NomeForm.Show;
e na hora de chamar a procedure teria que existir por exemplo
CriarForm( StrToForm(MeuCampodeumaTabelacomnomedoForm.asString));
Entendeu...???
Valeu mesmo assim...
Procedure CriaForm(NomeForm : Tform);
Begin
NomeForm := TForm.Create(Application);
NomeForm.Show;
End
Else NomeForm.Show;
e na hora de chamar a procedure teria que existir por exemplo
CriarForm( StrToForm(MeuCampodeumaTabelacomnomedoForm.asString));
Entendeu...???
Valeu mesmo assim...
GOSTEI 0
Xanatos
23/05/2004
FormClass: TformClass;
Form: Tform;
begin
// Nome := TForm2;
// Application.CreateForm(TComponentClass(Nome),Form2);
FormClass := TFormClass(GetClass(´TFrCidade´));
Form := FormClass.Create(Application);
Form.Name := ´FrCidade´;
Form.Show;
end;
initialization // Nao esqueca disso
RegisterClasses([TFrCidade]); // Nao esqueca!!!
end.
Form: Tform;
begin
// Nome := TForm2;
// Application.CreateForm(TComponentClass(Nome),Form2);
FormClass := TFormClass(GetClass(´TFrCidade´));
Form := FormClass.Create(Application);
Form.Name := ´FrCidade´;
Form.Show;
end;
initialization // Nao esqueca disso
RegisterClasses([TFrCidade]); // Nao esqueca!!!
end.
GOSTEI 0
Xanatos
23/05/2004
ops...vou mandar direito agora:
Var
FormClass: TformClass;
Form: Tform;
begin
FormClass := TFormClass(GetClass(´TFrCidade´));
Form := FormClass.Create(Application);
Form.Name := ´FrCidade´;
Form.ShowModal;
Var
Nome : TComponentClass;
T: TPersistentClass;
Ref : TForm;
FormClass: TformClass;
Form: Tform;
begin
// Nome := TForm2;
// Application.CreateForm(TComponentClass(Nome),Form2);
FormClass := TFormClass(GetClass(´TFrCidade´));
Form := FormClass.Create(Application);
Form.Name := ´FrCidade´;
Form.ShowModal;
Form.Free;
end;
e la embaixo de tudo:
initialization // Deve registrar todos os forms das chamadas!
RegisterClasses([TFrCidade]);
end.
Bom Agora acho que vai!!!
Var
FormClass: TformClass;
Form: Tform;
begin
FormClass := TFormClass(GetClass(´TFrCidade´));
Form := FormClass.Create(Application);
Form.Name := ´FrCidade´;
Form.ShowModal;
Var
Nome : TComponentClass;
T: TPersistentClass;
Ref : TForm;
FormClass: TformClass;
Form: Tform;
begin
// Nome := TForm2;
// Application.CreateForm(TComponentClass(Nome),Form2);
FormClass := TFormClass(GetClass(´TFrCidade´));
Form := FormClass.Create(Application);
Form.Name := ´FrCidade´;
Form.ShowModal;
Form.Free;
end;
e la embaixo de tudo:
initialization // Deve registrar todos os forms das chamadas!
RegisterClasses([TFrCidade]);
end.
Bom Agora acho que vai!!!
GOSTEI 0
Xanatos
23/05/2004
Que merda! :oops: é só isso:
procedure TFRprincipal.Cidades1Click(Sender: TObject);
Var
FormClass: TformClass;
Form: Tform;
begin
FormClass := TFormClass(GetClass(´TFrCidade´));
Form := FormClass.Create(Application);
Form.Name := ´FrCidade´;
Form.ShowModal;
Form.Free;
end;
initialization
RegisterClasses([TFrCidade, TFrPessoa]);
procedure TFRprincipal.Cidades1Click(Sender: TObject);
Var
FormClass: TformClass;
Form: Tform;
begin
FormClass := TFormClass(GetClass(´TFrCidade´));
Form := FormClass.Create(Application);
Form.Name := ´FrCidade´;
Form.ShowModal;
Form.Free;
end;
initialization
RegisterClasses([TFrCidade, TFrPessoa]);
GOSTEI 0
Info.wtomfs
23/05/2004
Ai em inicialization teria que ser a mesma variável não é...
Como posso passar o parâmetro lá em baixo no inicialization ?
registerclass(?????????);
Pq não sei qual que vou chamar na hora, já que é dinâmico né ???
Tá embaçado né......rsrsrsrsrs
Valeu....
Como posso passar o parâmetro lá em baixo no inicialization ?
registerclass(?????????);
Pq não sei qual que vou chamar na hora, já que é dinâmico né ???
Tá embaçado né......rsrsrsrsrs
Valeu....
GOSTEI 0
Xanatos
23/05/2004
Essa Funcao que encontrei em outro forum de delphi americano eu acho. Eles tambem demoraram muito para chegar na resposta!!! mas de pouco em pouco criaram uma funcao muito interessante!!!
function ShowAForm(z: string): boolean;
var
i: integer;
strClass: String;
FormClass: TFormClass;
NewForm: TForm;
begin
result := false;
// verifica se o form ja foi criado e mostra ele
for i := 0 to Screen.FormCount - 1 do begin
if UpperCase(Screen.Forms[i].Name) = UpperCase(z) then begin
result := true;
Screen.Forms[i].Show;
exit;
end;
end;
// Se nao foi criado, cria e mostra!!!
if not result then begin
try
strClass := ´T´ + z;
FormClass := TFormClass(GetClass(strClass));
if (FormClass = nil) then begin // Nao existe form (nao deve ter sido registrado!)
exit;
end;
NewForm := FormClass.Create(Application);
NewForm.Name := z;
NewForm.Show;
Result := true;
except
Result := false;
end;
end;
end;
Vale a pena testar!!! :lol:
function ShowAForm(z: string): boolean;
var
i: integer;
strClass: String;
FormClass: TFormClass;
NewForm: TForm;
begin
result := false;
// verifica se o form ja foi criado e mostra ele
for i := 0 to Screen.FormCount - 1 do begin
if UpperCase(Screen.Forms[i].Name) = UpperCase(z) then begin
result := true;
Screen.Forms[i].Show;
exit;
end;
end;
// Se nao foi criado, cria e mostra!!!
if not result then begin
try
strClass := ´T´ + z;
FormClass := TFormClass(GetClass(strClass));
if (FormClass = nil) then begin // Nao existe form (nao deve ter sido registrado!)
exit;
end;
NewForm := FormClass.Create(Application);
NewForm.Name := z;
NewForm.Show;
Result := true;
except
Result := false;
end;
end;
end;
Vale a pena testar!!! :lol:
GOSTEI 0
Xanatos
23/05/2004
Eu sei que é dinâmico, mas voce nao vai criar um formulário de cadastro de clientes dinamicamente né!! e ja esta criado !!! voce só vai fazer a chamada dinamica!!!
Coloque o initialization no teu formulário principal e todos os formulários que serao chamados dinamicamente nele!!!!
initialization
RegisterClasses([TFrCliente, TFrCidade, ..., TFrContas]);
Entendeu?? :idea:
Coloque o initialization no teu formulário principal e todos os formulários que serao chamados dinamicamente nele!!!!
initialization
RegisterClasses([TFrCliente, TFrCidade, ..., TFrContas]);
Entendeu?? :idea:
GOSTEI 0
Guilherme B
23/05/2004
SRS !
Funcionou bem conforme a orientação.
Porém, é como se o formuá
rio não tivesse sido criado. Em alguns forms mais elaborados, não é reconhecido instruções tipo como segue abaixo:
if nomedoformulario.edit1.text=´ ´ then .......
O Comando acima gera um erro em tempo de execução.
Alguém tem alguma idéia o porque acontece isso ???
Grato
Funcionou bem conforme a orientação.
Porém, é como se o formuá
rio não tivesse sido criado. Em alguns forms mais elaborados, não é reconhecido instruções tipo como segue abaixo:
if nomedoformulario.edit1.text=´ ´ then .......
O Comando acima gera um erro em tempo de execução.
Alguém tem alguma idéia o porque acontece isso ???
Grato
GOSTEI 0
Info.wtomfs
23/05/2004
Comigo acontece a mesma coisa
qdo eu tento pegar o valor do edit1.text do form1 através do form 2
da erro de violação de acesso...
procedure TForm2.Button1Click(Sender: TObject);
begin
ShowMessage(Form1.Edit1.Text);
End;
isso gera o erro
qdo eu tento pegar o valor do edit1.text do form1 através do form 2
da erro de violação de acesso...
procedure TForm2.Button1Click(Sender: TObject);
begin
ShowMessage(Form1.Edit1.Text);
End;
isso gera o erro
GOSTEI 0
Guilherme B
23/05/2004
Srs !
Peço que não deixem está dúvida sem resposta.
Se alguém souber como solucionar este problema, por favor.
Peço que não deixem está dúvida sem resposta.
Se alguém souber como solucionar este problema, por favor.
GOSTEI 0
Paulo_amorim
23/05/2004
Olá
Eu fiz um teste simples aqui e funcionou, eu não sei se eh isso que vcs estão querendo...
Espero que ajude
Até+
Eu fiz um teste simples aqui e funcionou, eu não sei se eh isso que vcs estão querendo...
procedure NovoForm(s: String); var MyForm: TForm; begin if Application.FindComponent(s) = nil then Exit; MyForm := TForm( Application.FindComponent(s) ); MyForm.Show; MyForm.Free; end;
Espero que ajude
Até+
GOSTEI 0
Xanatos
23/05/2004
Bom Paulo, isso nao funcionou aqui.
Eu tenho procurado muito sobre isso, mas nao achei nada por enquanto. O que posso fazer quanto ao fato de acessar um componente dentro de um formulario criado dessa forma, bom...
Nome:= (Form.FindComponent(´DBEditNome´) as TdbEdit).Text;
Bom, nos formulários que voce tiver que acessar um componente por exemplo. Mas ainda nao é o que queremos...
Nao Desistiremos!!! :roll:
Eu tenho procurado muito sobre isso, mas nao achei nada por enquanto. O que posso fazer quanto ao fato de acessar um componente dentro de um formulario criado dessa forma, bom...
Nome:= (Form.FindComponent(´DBEditNome´) as TdbEdit).Text;
Bom, nos formulários que voce tiver que acessar um componente por exemplo. Mas ainda nao é o que queremos...
Nao Desistiremos!!! :roll:
GOSTEI 0
Xanatos
23/05/2004
Bom, até como até agora ninguem mais manifestou vamos ter que nos conformar com alternativas.
Var
FormClass: TformClass;
Form: Tform;
Str: string;
begin
FormClass := TFormClass(GetClass(´TForm1));
Form.Name := ´Form1´;
Form := FormClass.Create(Application);
Str:= (Form.FindComponent(´Edit1´) as TEdit).Text;
Str:= (Form as TForm1).Teste; // Teste é uma variavel string
Form.ShowModal;
Form.Free;
end;
Se vc ia usar Form1.Edit1 entao use (Form as TForm1).Edit1.Text;
Espero ter ajudado.
:idea: alternativas sao sempre úteis!!!
Var
FormClass: TformClass;
Form: Tform;
Str: string;
begin
FormClass := TFormClass(GetClass(´TForm1));
Form.Name := ´Form1´;
Form := FormClass.Create(Application);
Str:= (Form.FindComponent(´Edit1´) as TEdit).Text;
Str:= (Form as TForm1).Teste; // Teste é uma variavel string
Form.ShowModal;
Form.Free;
end;
Se vc ia usar Form1.Edit1 entao use (Form as TForm1).Edit1.Text;
Espero ter ajudado.
:idea: alternativas sao sempre úteis!!!
GOSTEI 0