Criar e chamar formulario - embaçado!
16/07/2008
0
Pessoal, o seguinte...
eu tenho os meus formularios criados no delphi, por exemplo: frmCadastroClientes, frmCadastroProdutos, etc...
Eu nao estou dando autocreate neles. eu quero criá-los em tempo de execução.
Eu quero criar uma tabela de menus, contendo o nome do menu, o icone bmp que vai nele e qual é o formulário que irá abrir. por exemplo.
Tabela menu:
[b:bab3569e06]idmenu, nome_menu, imagem, nome_classe, nome_formulario.[/b:bab3569e06]
Eu quero fazer um While na tabela menu, chamando todos os registros dessa tabela e automaticamente, vou criando meus botões no formulário principal.
em quanto vou fazendo esses botoes, no [b:bab3569e06]Onclick[/b:bab3569e06], vou fazer uma procedure que ao clicar, chama o formulario (Como fazer essa procedure, eu já sei).
O que eu NAO sei, é como dar um createform pegando o nome da classe pelo campo NOME_FORMULARIO da tabela...
por exemplo, algo assim:
[b:bab3569e06]Application.CreateForm(FieldByName(´nome_classe´).asString, FieldByName(´nome_formulario´).asString);
FieldByName(´nome_formulario´).Show;[/b:bab3569e06]
Só que isso como vcs sabem, nao da certo.
Como poderei estar resolvendo meu problema?
eu tenho os meus formularios criados no delphi, por exemplo: frmCadastroClientes, frmCadastroProdutos, etc...
Eu nao estou dando autocreate neles. eu quero criá-los em tempo de execução.
Eu quero criar uma tabela de menus, contendo o nome do menu, o icone bmp que vai nele e qual é o formulário que irá abrir. por exemplo.
Tabela menu:
[b:bab3569e06]idmenu, nome_menu, imagem, nome_classe, nome_formulario.[/b:bab3569e06]
Eu quero fazer um While na tabela menu, chamando todos os registros dessa tabela e automaticamente, vou criando meus botões no formulário principal.
em quanto vou fazendo esses botoes, no [b:bab3569e06]Onclick[/b:bab3569e06], vou fazer uma procedure que ao clicar, chama o formulario (Como fazer essa procedure, eu já sei).
O que eu NAO sei, é como dar um createform pegando o nome da classe pelo campo NOME_FORMULARIO da tabela...
por exemplo, algo assim:
[b:bab3569e06]Application.CreateForm(FieldByName(´nome_classe´).asString, FieldByName(´nome_formulario´).asString);
FieldByName(´nome_formulario´).Show;[/b:bab3569e06]
Só que isso como vcs sabem, nao da certo.
Como poderei estar resolvendo meu problema?
[vaza]
Curtir tópico
+ 0
Responder
Posts
16/07/2008
Fabianosales
Ôpa!
Esse negócio é meio punk mesmo, mas, com uma lida mais cuidadosa do help do delphi, algumas coisa vêm a tona. Dá pra fazer isto usando algumas funções do sistema de streaming de componentes.
Declara essas duas funções:
Agora a implementação:
Um requisito para que as coisas funcionem, é que você deve registrar todas as classes que irá criar a partir do nome. Nesse caso, tô registrando só o meu form de exemplo (TForm2).
Agora, é só chamar a função passando uma string contendo o nome da classe que você quer instanciar e uma variável qualquer do tipo TForm.
Evoé...
8)
Esse negócio é meio punk mesmo, mas, com uma lida mais cuidadosa do help do delphi, algumas coisa vêm a tona. Dá pra fazer isto usando algumas funções do sistema de streaming de componentes.
Declara essas duas funções:
procedure CreateWindow(pWindowClass : TClass; var Obj : TForm); overload; procedure CreateWindow(pWindowClassName : string; var Obj : TForm); overload;
Agora a implementação:
procedure TForm2.CreateWindow(pWindowClass: TClass; var Obj: TForm); begin if not(Assigned(Obj)) or (Obj=nil) then try Screen.Cursor := crHourGlass; Obj := TForm(pWindowClass.NewInstance).Create(Self); Obj.WindowState := wsNormal; Obj.Show; finally Screen.Cursor := crDefault; end else begin Obj.BringToFront; end; end; procedure TForm2.CreateWindow(pWindowClassName: string; var Obj: TForm); var ClassInfo: TClass; begin ClassInfo := FindClass(pWindowClassName); if ClassInfo = nil then raise EClassNotFound.Create( Format(´Não foi possível localizar a classe ¬s´, [pWindowClassName])) else CreateWindow(ClassInfo, Obj); end;
Um requisito para que as coisas funcionem, é que você deve registrar todas as classes que irá criar a partir do nome. Nesse caso, tô registrando só o meu form de exemplo (TForm2).
procedure TForm2.FormCreate(Sender: TObject); begin RegisterClass(TForm2); end;
Agora, é só chamar a função passando uma string contendo o nome da classe que você quer instanciar e uma variável qualquer do tipo TForm.
procedure TForm2.Button2Click(Sender: TObject); var frm : TForm; begin frm := nil; CreateWindow(´TForm2´, frm); end;
Evoé...
8)
Responder
Clique aqui para fazer login e interagir na Comunidade :)