Fórum Problema ao Chamar Form pela Classe #295529

14/09/2005

0

Estou a criar o form da seguinte maneira:

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


Porty

Porty

Responder

Posts

14/09/2005

Massuda

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].


Responder

Gostei + 0

14/09/2005

Massuda

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].


Responder

Gostei + 0

14/09/2005

Porty

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


Responder

Gostei + 0

14/09/2005

Massuda

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?


Responder

Gostei + 0

14/09/2005

Porty

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.


Responder

Gostei + 0

14/09/2005

Massuda

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´);
Para isso funcionar direito, inclua o seguinte no final de cada unit que implementa o form a ser criado através da função:
initialization
  RegisterClass(...classe do seu form...);

// use assim: RegisterClass(TFrEmpresas)
Um efeito colateral disso é que, dependendo do caso, você não precisa mais incluir as units que implementam seus forms no uses para poder criar seus forms.

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´);
Note que neste caso é criado um novo form da mesma classe do form cujo nome foi passado (é uma ´clonagem´).


Responder

Gostei + 0

14/09/2005

Massuda

Percebi um pequeno erro de digitação... No segundo exemplo, o correto é...
function CriarFormPeloNomeDaClasse(const ONomeDaClasse: string): TForm;



Responder

Gostei + 0

14/09/2005

Porty

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.





Responder

Gostei + 0

14/09/2005

Massuda

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.


Responder

Gostei + 0

14/09/2005

Porty

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


Responder

Gostei + 0

14/09/2005

Massuda

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar