Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

brunoguitarman

Como chamar form a partir de classe?

Recommended Posts

Galera, o que preciso pra chamar um form a partir de uma classe? Preciso colocar alguma coisa específica no uses?

 

É que tenho um programa aqui que chama algumas funções que estão dentro de uma classe. Essa classe, então, chama um outro form para que eu possa fazer algumas confirmações. Como não fui eu quem fez o programa e estou só fazendo uma manutenção não queria ter que trocar toda a lógica dele pra fazer de um jeito mais simples.

 

Primeiramente ele tava fazendo a chamada assim:

 

frmCOnf_Exclusao_Lot.ShowModal;

 

O que gerava o seguinte erro:

 

 

Project MeuProjeto.exe raised exception class EAccessViolation with message 'Acces violation at address 006D4F01 in module 'MeuProjeto.exe'.

Read of address 00000000'. Process stopped. Use Step or Run to continue.

 

e quando eu clico em ok para voltar à execução aparece a mensagem que apareceria para o usuário:

 

Access violation at address 005D4F01 in module 'MeuProjeto.exe'. Read of address 00000000.

 

Acredito que isso tenha acontecido por ter chamado o form sem o create antes, mas mesmo colocando-o, dessa forma:

 

frmCOnf_Exclusao_Lot := TfrmConf_Exclusao_Lot.Create;

frmCOnf_Exclusao_Lot.ShowModal;

 

Aparece o seguinte erro:

 

Project MeuProjeto.exe raised exception class EInvalidOperation with message 'Cannot make a visible window modal'. Process stopped. Use Step or Run to continue.

 

E, para o usuário, a seguinte mensagem:

 

Cannot make a visible window modal.

 

Alguém saberia me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite Brunoguitarman.

 

Primeiramente configure a propriedade Visible do frmCOnf_Exclusao_Lot para False, isto é, se o seu sistema for SDI. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Caso o seu sistema seja MDI, então jamais voce poderá usar o método ShowModal :o

 

ShowModal não funciona em sistemas MDI, porque se não o sistema deixa de ser MDI para ser SDI.

 

Utilize o método de criação e visualização do form em sistema MDI desta forma:

 

Application.CreateForm(TfrmCOnf_Exclusao_Lot, frmCOnf_Exclusao_Lot);

Com o método acima ele é automaticamente visualizado.

 

Caso voce queira destruir o Form da memória quando este for fechado, então configure o seu método OnClose desta forma:

 

procedure TfrmCOnf_Exclusao_Lot.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;

 // ou

 FreeAndNil(frmCOnf_Exclusao_Lot);  // Prefiro este.
end

Espero que isso resolva

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite Brunoguitarman.

 

Primeiramente configure a propriedade Visible do frmCOnf_Exclusao_Lot para False, isto é, se o seu sistema for SDI. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Caso o seu sistema seja MDI, então jamais voce poderá usar o método ShowModal :o

 

ShowModal não funciona em sistemas MDI, porque se não o sistema deixa de ser MDI para ser SDI.

 

Utilize o método de criação e visualização do form em sistema MDI desta forma:

 

Application.CreateForm(TfrmCOnf_Exclusao_Lot, frmCOnf_Exclusao_Lot);

Com o método acima ele é automaticamente visualizado.

 

Caso voce queira destruir o Form da memória quando este for fechado, então configure o seu método OnClose desta forma:

 

procedure TfrmCOnf_Exclusao_Lot.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;

 // ou

 FreeAndNil(frmCOnf_Exclusao_Lot);  // Prefiro este.
end

Espero que isso resolva

Desculpa a ignorância, mas o que é MDI e SDI e como sei qual dos dois tipos ele é?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Brunoguitarman.

 

Sistemas SDI tanto quanto MDI fazem parte do Delphi como também do VB (Visual Basic), e também ultimamente a interface GUI da linguagem JAVA também o adotou, através de suas bibliotecas AWT e Swing;

 

Mas o que verdadeiramente são ?

 

Começamos por SDI (Single Document Interface - Interface de Documento Único), como o prórpio nome diz, as interfaces dos formulários são individuais e independentes da janela gráfica do projeto principal que tem um formulário principal de abertura, ou seja, voce conseque arrastá-la para fora do ambiente gráfico do Form Principal. Digamos que a resolução do seu vídeo esteja configurada para 1024 X 768 e a interface gráfica do Form Principal tenha um tamanho Width = 500 pixels por Height = 300 pixels, obviamente que essa janela fica menor que a resolução do vídeo, se voce abrir um outro form do projeto que tenha um tamanho maior, este cobrirá todo o Form principal, porque a sua janela gráfica está indenpende do Form principal e quem controla a sua apresentação na tela é o Objeto Application, isto é, se voce instanciar o Form com o Objeto Application como proprietário, que jogará a imagem para o Objeto global Screen que é o Objeto que controla as resoluções de Tela. Além disso, nesse sistema voce pode optar por abrir todos os Forms de um única vez na inicialização do aplicativo, ou no decorrer de sua execução ou ainda abrir cada formulário individualmente e exclusivamente com o método ShowModal, onde este método trava o foco no formulário aberto, não deixando voce clicar fora dele.

 

Já os Sistemas MDI (Mutiple Document Interface - Interface de Documentos Múltiplos), existe o Form Pai (MDIForm) que é o Form Principal e os demais formulários são os Form Filhos (MDIChild), onde os Forms Filhos são abertos dentro da interface gráfico do Form Pai (MDIForm). Mesmo que o o Form Filho (MDIChild) tenha um tamanho maior que o Form Pai (MDIForm) o MDIChild será aberto dentro do MDIForm com barras de scroll, ou seja, se o comprimento (Width) for maior, o scroll será horizontal e se a altura (Height) for maior, o scroll será vertical, ou se ambos forem maiores, então terá ambos os scrolls.

Neste sistema as propriedade visibles dos Formulários MDIChild são automaticamente ajustadas para True e não mudam, por isso o método ShowModal não funciona nesse sistema, até porque isto tiraria toda a funcionalidade de um sistema de documento múltiplo, pois só permitiria que cada form fosse aberto de cada vez, como o próprio nome já diz (Interface de Documentos Múltiplos), então subentende que voce quer trabalhar com vários documentos abertos dentro de interface gráfica. Um exemplo de sistema MDI e o aplicativo Word do Office, muito embora a Microsoft admite que as novas versões do Office, o mesmo já não utilize mais este sistema.

 

Faça um teste, crie um projeto novo e na propriedade FormStyle do Form Principal mude de fsNormal para MDIForm, e dos demais forms, mude para MDIChild.

 

Um abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Brunoguitarman.

 

Sou eu de novo.

 

Esqueci de dizer que em sistemas MDI, voce pode trabalhar com os dois tipos de Forms (fsNormal e fsMDIChild), entretanto todo sistema MDI tem que necessariamente haver um MDIForm (Form Pai) para cada projeto. Por isso, mesmo sendo o sistema MDI, o Form configurado como fsNormal pode ser aberto com o método ShowModal, isto porque ele está independente da Interface gráfica do Form pai (MDIForm).

 

Um abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.