Criar e chamar formulario - embaçado!

16/07/2008

1

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?


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:
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