Fórum Problema ao Chamar Form pela Classe #295529
14/09/2005
0
procedure TFrPrincipal.CriarFormPeloNome(TFormulario:TComponentClass; var Formulario); begin Application.CreateForm(TFormulario,Formulario); Tform(Formulario).Show; end; procedure TFrPrincipal.Button1Click(Sender: TObject); var wform: TForm; tclasse : TComponentClass; begin prgactual := 11; tclasse := TComponentClass(FindComponent(´tfrempresas´)); CriarFormPeloNome( tclasse,wform); end;
o problema é que assim dá erro, mas em vez de fazer o FindComponent fazer logo assim
tclasse := tfrempresas;
Como posso resolver isso? Pois quero fazer um procedimento generico para me chamar menus. pois o menu do ususario está na base dados ou seja é feito dinamicamente
Os forms estão todos em Available Forms, e a aplicação é MDI
Porty
Curtir tópico
+ 0Posts
14/09/2005
Massuda
Gostei + 0
14/09/2005
Massuda
Gostei + 0
14/09/2005
Porty
Já li este e outros tópicos mas não consigo soluccionar o meu problema. Pois nenhum está a funcionar. O que eu quero é muito simple pelo nome do Form chamar o Form nada mais simples. Mas está a dar trabalho.
Obrigrada
Gostei + 0
14/09/2005
Massuda
Gostei + 0
14/09/2005
Porty
Eu chamo a classe o TFrempresas ou seja a classe do form certo? Pois o nome do Form é FrEmpresas logo ele cria a classe TFrempresas
Faça você um exemplo com o código que coloquei e veja o resultado.
Gostei + 0
14/09/2005
Massuda
Outras formas de criar forms...
...criar o form a partir da classe do form:
function CriarFormPelaClasse(const AClasse: TFormClass): TForm; begin Result := AClasse.Create(Application); end; // use assim: MeuForm := CriarFormPelaClasse(TFrEmpresas);
...criar um form a partir do nome da classe do form:
function CriarFormPeloNomeDaClasse(const ONomeDaClasse: TFormClass): TForm; var Classe: TFormClass; begin Classe := TFormClass(FindClass(ONomeDaClasse)); Result := Classe.Create(Application); end; // use assim: MeuForm := CriarFormPeloNomeDaClasse(´TFrEmpresas´);
initialization RegisterClass(...classe do seu form...); // use assim: RegisterClass(TFrEmpresas)
Para poder criar um form a partir de um nome (propriedade TForm.Name), o form cujo nome será referenciado [b:0c04678ca8]precisa ter sido criado previamente[/b:0c04678ca8]. Nesse caso, faça assim:
function CriarFormPeloNome(const ONome: string): TForm; var Classe: TFormClass; I: Integer; begin Result := nil; for I := 0 to Screen.FormCount - 1 do begin if Screen.Forms[I].Name = ONome then begin Classe := TFormClass(Screen.Forms[I].ClassType); Result := Classe.Create(Application); Break; end; end; end; // use assim: MeuForm := CriarFormPeloNome(´FrEmpresas´);
Gostei + 0
14/09/2005
Massuda
function CriarFormPeloNomeDaClasse(const ONomeDaClasse: string): TForm;
Gostei + 0
14/09/2005
Porty
function CriarFormPeloNomeDaClasse(const ONomeDaClasse: string): TForm;
Tenho que usar sempre isto?
initialization RegisterClass(...classe do seu form...); // use assim: RegisterClass(TFrEmpresas)
é que eu não queira colocar esse código pois já tenho imensos forms criados. E já agora tenho que colocar no final do código do form ex:
unit UnFrTemp;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, IBCustomDataSet, IBTable, StdCtrls, ExtCtrls, DBCtrls,
Grids, DBGrids, Buttons;
type
TFrTemp = class(TForm)
Button1: TButton;
private
{ Private declarations }
public
{ Public declarations }
end;
var
FrTemp: TFrTemp;
implementation
{$R *.dfm}
uses unglobal, DmActiveWin;
procedure TFrTemp.FormActivate(Sender: TObject);
begin
ibtable1.Active;
end;
initialization
RegisterClass(TFrTemp);
end.
Gostei + 0
14/09/2005
Massuda
O RegisterClass não precisa necessariamente estar na unit do form, pode estar na unit que vai criar os forms e precisa ser executada antes de você tentar criar forms. Por exemplo, você pode por no OnCreate do seu form principal.
Gostei + 0
14/09/2005
Porty
Ou seja no Create do Form principal devo colocar o RegisterClass de todos os meus forms como o exemplo a seguir:
procedure TFrPrincipal.FormCreate(Sender: TObject); begin RegisterClass(TFrFornecedores); RegisterClass(TFrClientes); RegisterClass(TFrEmpresa); end;
Já agora não vou ter problemas se estiver usar MDI, já agora não é preciso no Destroy no form principal destruir o registerClass dos forms.
obrigada,
um abraço
Gostei + 0
14/09/2005
Massuda
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)