Fórum [ Ajuda ] Função para Criar Forms #416362

07/05/2012

0

Preciso desenvolver uma função para criar forms Dinamicamente, ja tentei de tudo, sempre da o erro no Show, ShowModal, algumas das funções que testei funcionaram no Delphi 2007, mas no XE2 com o FireMonkey Não estão funcionando, TFormClass por exemplo não existe, enfim postarei algumas das que tentei usar...
Se alguém souber como passar, eu gostaria de Chamar de qualquer lugar pois é uma UnitCompartilhada,
chamar assim: NomeDaFuncao( frmParaCriar, TfrmParaCriar ), ou algo do gênero...

Agradeço desde já!



function CreateForms( FormClass: TFormClass; FormName: TCustomForm; ModalForm : Boolean ) : Boolean;
begin
with FormName do
try
FormName := FormClass.Create(Application);
if ModalForm Then
ShowModal
else
Show;
CreateForms := True;
except
CreateForms := False;
end;
end;







procedure CriarForm(aClasseForm: TFormClass; aForm:TForm);
begin
Application.CreateForm(aClasseForm, aForm);
aForm.showmodal;
aForm.free;
end;
Marcelo Jr

Marcelo Jr

Responder

Posts

07/05/2012

Joel Rodrigues

Não estaria faltando uma referência à unit Forms na cáusula Uses?
Para garantir a referência, clique com a direita sobre TFormClass, depois em Refactoring > Find Unit, o Delphi lhe dirá a unit que deve ser adicionada (isso para qualquer identificador).
Responder

Gostei + 0

07/05/2012

Marcelo Jr

Ele não sublinha, ele reconhece todos os comandos e variáveis, compila, mas na hora de dar o SHOW/SHOWMODAL que esta dando erro, não em todas as funções, algumas que eu testei nem compilam...

Se souber de alguma forma, minha idéia era puxar o nome do form do banco, criar atalhos pelo que o usuário tem permissao, dai ele criaria automático...

Responder

Gostei + 0

07/05/2012

Joel Rodrigues

Qual erro está ocorrendo?
Dica: nunca diga apenas que está dando erro, especifique qual é.
Responder

Gostei + 0

07/05/2012

Marcelo Jr

Read Sector 0x00 <-- Alguma coisa desse gênero, mas eu vejo exatamente qual o erro e posto aqui.
Obrigado pela ajuda.
Responder

Gostei + 0

08/05/2012

Cesar Roniglei

Bom dia,
Voce Pode utilizar uma função e cria-los dinamicamente segue um exemplo:

procedure TFrmComum.AbreTela(vForm, vMenu: String; vClasse: TFormClass);
var
nForm: Integer;
vAbre: Boolean;
begin
//Procedimento que abre a tela, não deixa abrir duas ao mesmo tempo
if Trim(vForm) = then begin
MessageBox(Handle, Informe o nome do formulário a ser aberto!,
Sem nome..., MB_OK+MB_ICONEXCLAMATION);
Abort;
end else if vClasse = nil then begin
MessageBox(Handle, Informe a classe do formulário a ser criado!,
Sem classe..., MB_OK+MB_ICONEXCLAMATION);
Abort;
end;
//Por default a variável vAbre fica setado False, ela que indicará se cria a tela ou só executa o show
vAbre := False;
//Varredura em todos os formulários abertos na tela ou Screen
for nForm := 0 to Screen.FormCount - 1 do
//Se encontra o mesmo nome de formulário seta a varável vAbre para True
if Screen.Forms[nForm].Name = vForm then
vAbre := True;
//Se a variável vAbre for falsa haverá a criação do form ou só irá dar um show
if Trim(sUsuario_id) <> then
with DM_Principal.SQLQGeral do begin
Close;
SQL.Clear;
SQL.Add(SELECT GRAVAR, CANCELAR, EXCLUIR, NOVO, ALTERAR, IMPRIMIR, );
SQL.Add(NAVEGAR, PESQUISAR FROM SIS_USU_PERMISSAO);
SQL.Add(WHERE USUARIO_ID = +sUsuario_id);
SQL.Add(AND MENU_ID = +QuotedStr(vMenu));
SQL.Add(AND SISTEMA = +QuotedStr(Copy(uppercase(Application.Title), 1, 3)));
Open;
if FieldByName(GRAVAR).AsString = S then
sBotao := G;
if FieldByName(CANCELAR).AsString = S then
sBotao := C+sBotao;
if FieldByName(EXCLUIR).AsString = S then
sBotao := E+sBotao;
if FieldByName(NOVO).AsString = S then
sBotao := O+sBotao;
if FieldByName(ALTERAR).AsString = S then
sBotao := A+sBotao;
if FieldByName(IMPRIMIR).AsString = S then
sBotao := I+sBotao;
if FieldByName(NAVEGAR).AsString = S then
sBotao := N+sBotao;
if FieldByName(PESQUISAR).AsString = S then
sBotao := P+sBotao;
end;
if not vAbre then begin
//Cria a tela de aguarde...
//Cria a classe do form e executa o show ou showmodal conforme o tag do formulário
//uma vez tag = 0 ou tag > 0
with vClasse.Create(Application) do
if Tag = 0 then
Show
else
ShowModal
end else
Show;

end;


Espero ter ajudado.
Responder

Gostei + 0

08/05/2012

Bruno Leandro

ola a principio estas funções que foram postadas, deveriam funcionar os erros que possam estar acontecendo pode ser devido a falta de falta de uses dos formularios ou/e RegisterClasses([TForms]), caso não tenha encontrado uma solução coloque mais informações para que possamos ajudar mais na solução.
Responder

Gostei + 0

08/05/2012

Marcelo Jr

Elas funcionam para VCL Forms, mas para FireMonkey Não. Vou testar CESAR RONIGLEI mas não entendi por que você dar tantas voltas, o que eu quero é criar um form Dinamcamente, mas ele ja existe como arquivo, só precido da um Create, setar ele e mostrar o que cada usuario tem como permissão, no banco estou tratando uma relação N:N, USUARIO_PERMISSAO, dai eu cadastro os forms e depois o adm vai ter uma listbox para dizer em que forms o user tem acesso, dai eu pesquiso no banco antes de abrir cada form, ou dou um select e guardo em um array todas as permissoes e trabalho com ele global...

Responder

Gostei + 0

09/05/2012

Cesar Roniglei

Bom dia Boeira,

No Exemplo acima eu verifico se o Form ja está aberto, como trabalho com form mdi e shield pode ser que o usuário abriu o cadastro de clientes por ex, e depois o cadastro de produtos. Caso ele vá no menu para abrir novamente o cadastro de clientes a função verifica se já foi aberto e apenas coloca a frente para a sua visualização.

Mas qualquer duvida so me avisar.




César Roniglei
Consultor e Desenvolvedor (Delphi, Oracle, SQLServer, Firebird, MySQL).
E-mail: cesar.roniglei@live.com
Skype : cesar.roniglei
Responder

Gostei + 0

28/05/2013

Nivaldo Ricci

Você conseguiu fazer funcionar a criação dinâmica de formulário no firemonkey?

Elas funcionam para VCL Forms, mas para FireMonkey Não. Vou testar CESAR RONIGLEI mas não entendi por que você dar tantas voltas, o que eu quero é criar um form Dinamcamente, mas ele ja existe como arquivo, só precido da um Create, setar ele e mostrar o que cada usuario tem como permissão, no banco estou tratando uma relação N:N, USUARIO_PERMISSAO, dai eu cadastro os forms e depois o adm vai ter uma listbox para dizer em que forms o user tem acesso, dai eu pesquiso no banco antes de abrir cada form, ou dou um select e guardo em um array todas as permissoes e trabalho com ele global...

Responder

Gostei + 0

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

Aceitar