Problema ao Chamar Form pela Classe
Estou a criar o form da seguinte maneira:
o problema é que assim dá erro, mas em vez de fazer o FindComponent fazer logo assim já funciona.
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
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
Curtidas 0
Respostas
Massuda
14/09/2005
Talvez [url=http://forum.clubedelphi.net/viewtopic.php?t=63052]este tópico[/url] seja útil para você. Tem um exemplo meu de como criar um form a partir do [b:4dd2a1edc3]nome da classe[/b:4dd2a1edc3].
GOSTEI 0
Massuda
14/09/2005
Talvez [url=http://forum.clubedelphi.net/viewtopic.php?t=63052]este tópico[/url] seja útil para você. Tem um exemplo meu de como criar um form a partir do [b:4dd2a1edc3]nome da classe[/b:4dd2a1edc3].
GOSTEI 0
Porty
14/09/2005
Talvez [url=http://forum.clubedelphi.net/viewtopic.php?t=63052]este tópico[/url] seja útil para você. Tem um exemplo meu de como criar um form a partir do [b:d5291e436a]nome da classe[/b:d5291e436a].
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
Massuda
14/09/2005
O que você chama de ´nome do form´? É o nome da [b:b9a76b587a]classe[/b:b9a76b587a] do form ou o nome da [b:b9a76b587a]variável/instância[/b:b9a76b587a] do form?
GOSTEI 0
Porty
14/09/2005
O que você chama de ´nome do form´? É o nome da [b:00cdd019d7]classe[/b:00cdd019d7] do form ou o nome da [b:00cdd019d7]variável/instância[/b:00cdd019d7] do form?
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
Massuda
14/09/2005
Faça você um exemplo com o código que coloquei e veja o resultado.
Reproduzindo do tópico que citei num post anterior, ligeiramente modificado para sua conveniência...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
Massuda
14/09/2005
Percebi um pequeno erro de digitação... No segundo exemplo, o correto é...
function CriarFormPeloNomeDaClasse(const ONomeDaClasse: string): TForm;
GOSTEI 0
Porty
14/09/2005
Percebi um pequeno erro de digitação... No segundo exemplo, o correto é...
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
Massuda
14/09/2005
Tenho que usar sempre isto?)
Se não usar o RegisterClass, pode ser que o runtime do Delphi não consiga localizar a classe do seu form pelo nome. Por outro lado, se usar o RegisterClass, em alguns casos você pode omitir o nome da unit do form no uses da unit que cria os forms.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
Porty
14/09/2005
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.
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
Massuda
14/09/2005
Ou seja no Create do Form principal devo colocar o RegisterClass de todos os meus forms...
Isso mesmo.Já agora não vou ter problemas se estiver usar MDI...
Nunca usei isso com MDI... não sei o que pode acontecer....já agora não é preciso no Destroy no form principal destruir o registerClass dos forms...
Sim, existe uma procedure UnRegisterClass (acho que é isso). Embora seja boa prática desfazer as coisas que fizemos, geralmente não tem problema omitir o ´desregistro´ das classes pois o programa está sendo encerrado.GOSTEI 0