Criar Formulario.

Delphi

23/05/2004

Pessoal.
Preciso criar os formularios da minha aplicação em tempo de execução, só que o nome do formulario esta em uma tabela no meu banco.
O menu da minha aplicação esta sendo criado em função da permissão do usuário que esta logando.
Quando o usuário clicar na opção do menu, eu devo criar o formulário pertencente a opção clicada.
Alguem tem alguma solução?

Grato.
:lol:


Ericfp

Ericfp

Curtidas 0

Respostas

Carlosmielke

Carlosmielke

23/05/2004

caro colega

use a funcao FINDCLASS. ela retorna um obejto da classe tpersistentclass.

use desse modo

FINDCLASS(´t´+nome do formulario na tabela);

atenção

para que esta funcao funcione deve-se colocar o seguinte comando na seção INITIALIZATION

registerclass(TFORM1)

crie uma variavel do tipo TForm e use o seguinte comando.

form:=tform(findclass(´t´+nome do formulario na tabela)).create(self)

deve ser assim não lembro bem

espero ter ajudado..

CArlos mielke :)


GOSTEI 0
Carlosmielke

Carlosmielke

23/05/2004

corrigindo o comando que eu dei acima:

use assim

with TFormClass(FindClass(([b:6d0962c117]´T´+nomeform[/b:6d0962c117])).Create(Self) do
try
ShowModal;
finally
Free;
end;

t+
carlos mielke


GOSTEI 0
Ericfp

Ericfp

23/05/2004

Obrigado Carlos.
Desculpe a minha burrice. Onde fica a INITIALIZATION?

Grato.


GOSTEI 0
Carlosmielke

Carlosmielke

23/05/2004

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}
procedures
.....
....
....

[b:e7e2935bae]initialization[/b:e7e2935bae]
registerclass(TForm1);
end.


GOSTEI 0
Guilherme B

Guilherme B

23/05/2004

Srs !

Fiz exatamento conforme o exemplo apresentado pelo Carlos e continua dando o erro de classe não encontrada.
Não consigo fazer funcionar


GOSTEI 0
Info.wtomfs

Info.wtomfs

23/05/2004

Eu tbm estou com este problema!!!

Alguém pode ajudar ?


GOSTEI 0
Guilherme B

Guilherme B

23/05/2004

Acho que conseguiríamos solucionar o problema se tivesse uma maneira de traduzir uma string para TFormClass.

Será possível ?


GOSTEI 0
Info.wtomfs

Info.wtomfs

23/05/2004

Acabei de passar um e-mail para a borland....

Eles tem que resolver daí eu lançarei no Fórum Ok!!!


GOSTEI 0
Rômulo Barros

Rômulo Barros

23/05/2004

Aqui :::

...
[size=18:7fbc1fb2da][color=red:7fbc1fb2da] Uses Classes;[/color:7fbc1fb2da][/size:7fbc1fb2da]
....

procedure TForm1.Button1Click(Sender: TObject);
Var
  Nome : TComponentClass;
  Ref : TForm;
begin
  Nome := TForm2;
  Application.CreateForm(TComponentClass(Nome),Form2);


  // Ou assim

  Application.CreateForm(Nome,Ref);
  Ref.Name := ´MeuForm´;
  Ref.ShowModal; 
end;



GOSTEI 0
Guilherme B

Guilherme B

23/05/2004

ESTE ÚLTIMO EXEMPLO TAMBÉM NÃO SE APLICA AO CASO.
O NOME DO FORM É UMA VARIÁVEL .

GRATO


GOSTEI 0
Info.wtomfs

Info.wtomfs

23/05/2004

Exatamente, como eu disse o form é uma string que vêm do banco, que é jogado na variável string da procedure


Procedure CriaForm(NomeForm : Tform);
Begin
NomeForm := TForm.Create(Application);
NomeForm.Show;
End
Else NomeForm.Show;

e na hora de chamar a procedure teria que existir por exemplo

CriarForm( StrToForm(MeuCampodeumaTabelacomnomedoForm.asString));

Entendeu...???

Valeu mesmo assim...


GOSTEI 0
Xanatos

Xanatos

23/05/2004

FormClass: TformClass;
Form: Tform;
begin
// Nome := TForm2;
// Application.CreateForm(TComponentClass(Nome),Form2);

FormClass := TFormClass(GetClass(´TFrCidade´));
Form := FormClass.Create(Application);
Form.Name := ´FrCidade´;
Form.Show;
end;

initialization // Nao esqueca disso
RegisterClasses([TFrCidade]); // Nao esqueca!!!
end.


GOSTEI 0
Xanatos

Xanatos

23/05/2004

ops...vou mandar direito agora:

Var
FormClass: TformClass;
Form: Tform;
begin
FormClass := TFormClass(GetClass(´TFrCidade´));
Form := FormClass.Create(Application);
Form.Name := ´FrCidade´;
Form.ShowModal;
Var
Nome : TComponentClass;
T: TPersistentClass;
Ref : TForm;
FormClass: TformClass;
Form: Tform;
begin
// Nome := TForm2;
// Application.CreateForm(TComponentClass(Nome),Form2);

FormClass := TFormClass(GetClass(´TFrCidade´));
Form := FormClass.Create(Application);
Form.Name := ´FrCidade´;
Form.ShowModal;
Form.Free;
end;

e la embaixo de tudo:

initialization // Deve registrar todos os forms das chamadas!
RegisterClasses([TFrCidade]);

end.

Bom Agora acho que vai!!!


GOSTEI 0
Xanatos

Xanatos

23/05/2004

Que merda! :oops: é só isso:

procedure TFRprincipal.Cidades1Click(Sender: TObject);
Var
FormClass: TformClass;
Form: Tform;
begin
FormClass := TFormClass(GetClass(´TFrCidade´));
Form := FormClass.Create(Application);
Form.Name := ´FrCidade´;
Form.ShowModal;
Form.Free;
end;


initialization
RegisterClasses([TFrCidade, TFrPessoa]);


GOSTEI 0
Info.wtomfs

Info.wtomfs

23/05/2004

Ai em inicialization teria que ser a mesma variável não é...

Como posso passar o parâmetro lá em baixo no inicialization ?

registerclass(?????????);

Pq não sei qual que vou chamar na hora, já que é dinâmico né ???


Tá embaçado né......rsrsrsrsrs

Valeu....


GOSTEI 0
Xanatos

Xanatos

23/05/2004

Essa Funcao que encontrei em outro forum de delphi americano eu acho. Eles tambem demoraram muito para chegar na resposta!!! mas de pouco em pouco criaram uma funcao muito interessante!!!

function ShowAForm(z: string): boolean;
var
i: integer;
strClass: String;
FormClass: TFormClass;
NewForm: TForm;
begin
result := false;
// verifica se o form ja foi criado e mostra ele
for i := 0 to Screen.FormCount - 1 do begin
if UpperCase(Screen.Forms[i].Name) = UpperCase(z) then begin
result := true;
Screen.Forms[i].Show;
exit;
end;
end;
// Se nao foi criado, cria e mostra!!!
if not result then begin
try
strClass := ´T´ + z;
FormClass := TFormClass(GetClass(strClass));
if (FormClass = nil) then begin // Nao existe form (nao deve ter sido registrado!)
exit;
end;
NewForm := FormClass.Create(Application);
NewForm.Name := z;
NewForm.Show;
Result := true;
except
Result := false;
end;
end;
end;

Vale a pena testar!!! :lol:


GOSTEI 0
Xanatos

Xanatos

23/05/2004

Eu sei que é dinâmico, mas voce nao vai criar um formulário de cadastro de clientes dinamicamente né!! e ja esta criado !!! voce só vai fazer a chamada dinamica!!!

Coloque o initialization no teu formulário principal e todos os formulários que serao chamados dinamicamente nele!!!!

initialization
RegisterClasses([TFrCliente, TFrCidade, ..., TFrContas]);

Entendeu?? :idea:


GOSTEI 0
Guilherme B

Guilherme B

23/05/2004

SRS !

Funcionou bem conforme a orientação.
Porém, é como se o formuá
rio não tivesse sido criado. Em alguns forms mais elaborados, não é reconhecido instruções tipo como segue abaixo:

if nomedoformulario.edit1.text=´ ´ then .......

O Comando acima gera um erro em tempo de execução.

Alguém tem alguma idéia o porque acontece isso ???

Grato


GOSTEI 0
Info.wtomfs

Info.wtomfs

23/05/2004

Comigo acontece a mesma coisa

qdo eu tento pegar o valor do edit1.text do form1 através do form 2
da erro de violação de acesso...

procedure TForm2.Button1Click(Sender: TObject);
begin
ShowMessage(Form1.Edit1.Text);
End;

isso gera o erro


GOSTEI 0
Guilherme B

Guilherme B

23/05/2004

Srs !

Peço que não deixem está dúvida sem resposta.
Se alguém souber como solucionar este problema, por favor.


GOSTEI 0
Paulo_amorim

Paulo_amorim

23/05/2004

Olá

Eu fiz um teste simples aqui e funcionou, eu não sei se eh isso que vcs estão querendo...

procedure NovoForm(s: String);
var MyForm: TForm;
begin
  if Application.FindComponent(s) = nil then Exit;
  MyForm := TForm( Application.FindComponent(s) );
  MyForm.Show;
  MyForm.Free;
end;


Espero que ajude
Até+


GOSTEI 0
Xanatos

Xanatos

23/05/2004

Bom Paulo, isso nao funcionou aqui.

Eu tenho procurado muito sobre isso, mas nao achei nada por enquanto. O que posso fazer quanto ao fato de acessar um componente dentro de um formulario criado dessa forma, bom...

Nome:= (Form.FindComponent(´DBEditNome´) as TdbEdit).Text;

Bom, nos formulários que voce tiver que acessar um componente por exemplo. Mas ainda nao é o que queremos...

Nao Desistiremos!!! :roll:


GOSTEI 0
Xanatos

Xanatos

23/05/2004

Bom, até como até agora ninguem mais manifestou vamos ter que nos conformar com alternativas.

Var
FormClass: TformClass;
Form: Tform;

Str: string;
begin
FormClass := TFormClass(GetClass(´TForm1));
Form.Name := ´Form1´;
Form := FormClass.Create(Application);
Str:= (Form.FindComponent(´Edit1´) as TEdit).Text;
Str:= (Form as TForm1).Teste; // Teste é uma variavel string
Form.ShowModal;
Form.Free;
end;

Se vc ia usar Form1.Edit1 entao use (Form as TForm1).Edit1.Text;

Espero ter ajudado.

:idea: alternativas sao sempre úteis!!!


GOSTEI 0
POSTAR