Solução pra esse código ?

15/07/2004

0

Olá Pessoal, Bom dia !

Peguei esse código aqui no forum de uma discursão sobre criação de formulários, baseando-se em uma string.

Alguém tem uma idéia mais simples de fazer isso ?

Obrigada !


[b:d1a2e63cf2]Código:[/b:d1a2e63cf2]

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;


Renata Coimbra

Renata Coimbra

Responder

Posts

15/07/2004

Nildo

Esse código:

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; 

´
Pode ser trocado por esse:

if Application.FindComponent( z ) <> nil then
begin
   Result := True;
   TForm( Application.FindComponent( z ) ).Show;
end;



Responder

15/07/2004

Renata Coimbra

Obrigada Nildo !

Nildo estou tentando criar um formulário herdado de uma classe:

f_Cliente herda de Tf_Cadastro

Exemplo:
Tf_Cliente = class(Tf_Cadastro)


nessa rotina eu teria que alterar o que ?

o tipo da variavel FormClass: TFormClass para Tf_Cadastro ?


Muito obrigada pela atenção !

Renata Coimbra


Responder

15/07/2004

Persist

Acho que neste código existem duas coisas distintas.
Ele está um formulário para cada classe.
Se na Screen não existir o formulário aberto, ele cria, mas com uma classe diferente.


Responder

15/07/2004

Renata Coimbra

Obrigada persist pela atenção !

No meu caso todos os formulários vai ser herdeiro de Tf_Cadastro,

que são:

Tf_Cliente
Tf_Produtos
Tf_Vendas...
etc...

na funcção eu gostaria de passar o nome do formulário como uma string para ser instaciado.

será se tem como adaptar essa função pra isso ?


Obrigada !

[]´s

Renata


Responder

15/07/2004

Persist

Eu não entendí bem.
Vc tem um menú flexível que é montado a partir de parâmetros externos e por isso vc não pode instanciar fixo nos onClicks do ítens de menú, pq vc não sabe qual formulário irá representar qual ítem.
É mais ou menos isso?


Responder

15/07/2004

Renata Coimbra

Isso mesmo persist !

eu tenho todos os nomes de formulários em uma tabela que são:
Tf_Cliente
Tf_Produtos
Tf_Vendas...
etc..

daí eu tenho uma variavel dentro de um for que pega o nome dos formulários da tabela.

só não estou conseguindo associar a minha string ´Tf_formulario´ herdeiro da classe Tf_cadastro a rotina de instaciar formulários.

com um TForm funciona normal, o problema é que eu uso heranças de formulários, todos herda de Tf_Cadastro.

vc pode me ajudar ?

[]´s

Renata.


Responder

15/07/2004

Persist

Bom, primeiro vc tem que registrar as classes.
RegisterClass(Tf_Cadastro);
RegisterClass(Tf_Cliente);
RegisterClass(Tf_Produtos);
RegisterClass(Tf_Vendas);

Daí vc pega a classe acenstral de acordo com a string que entra
var f:Tf_Cadastro;
begin
f := Tf_Cadastro(GetClass(´string´));
end;



Responder

15/07/2004

Renata Coimbra

Não deu certo persist !

olha todo o código:

procedure TPrograma.ClickMenu(Sender: TObject);
Var
f : Tf_Cadastro;
NewForm: TForm;
strClass: String;
begin
{Essa rotina procura um formularo do tipo Tf_Cadastro e retorna o mesmo}
f := TChamarProgramas.LocalizarFormularioCadastro(´StrForme´);
if f <> nil then
f.Show
else
begin
strClass := ´T´ + StrForm;
f := Tf_Cadastro(GetClass(strClass));
f := Tf_Cadastro.Create(Application );
f.Show;

end;

e na Inicialization estou registrando todas as classes,

RegisterClass([Tf_CLiente, TfProduto, etc...]);


o que estou fazendo de errado ?

a minha var strClass está mostrando o nome da classe certinho.


[]´s

Renata.


Responder

15/07/2004

Persist

Se vc registra uma classe TF_CLIENTE por exemplo, a string da função GetClass tem que ser ´TF_CLIENTE´.
Vc está colocando ´T´ + StrForm, então StrForm deve conter ´F_CLIENTE´.
O que está em StrForm?


Responder

15/07/2004

Renata Coimbra

strForm é igual f_Cliente que eu pego de uma tabela.

T+strForm

strClass = Tf_Cliente

[]´s

Renata.


Responder

15/07/2004

Persist

O que está dando errado então?


Responder

15/07/2004

Renata Coimbra

Pois é persist !

ao invés de criar o Tf_Cliente está criando e abrindo o pai dele Tf_Cadastro.

estou ficando maluca com isso, heheh !

[]´s

Renata;


Responder

15/07/2004

Persist

Entendí, é pq vc está instanciando o objeto TF_Cadastro e não seus descendentes.
Acho que vc terá que fazer um if para criar os descendentes.
São muitos formulários?


Responder

15/07/2004

Renata Coimbra

Bastante !

todos os forms do sistema, uns 15 + ou -


Responder

15/07/2004

Persist

Bom, faça 15 ifs então.


Responder

APRENDA A PROGRAMAR DO ZERO AO PROFISSIONAL

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar