Jump to content

Recommended Posts

Posted

Ola, sou estudante de Sistemas e comecei a desenvolver meu TCC em Delphi, ainda estou no começo porém ja me deparo com um problema que não sei resolver.

Ja foi feita a tela principal onde existem todas as funcionalidades do programa, uma form de splash para a abertura do programa e conexão com o banco (oracle) ok.

Depois que eu criei a tela de login com seus respectivos botões, groupBox, Edits, Labels e image, eu não consegui mais executar o programa, o delphi para na seguinte linha.

procedure FormCreate (Sender : TObject);

Isso no Form do login.

Sei que deve ser coisa simples de se resolver porém ainda estou começando a vida de programar hehehe.

Posted

Clicas com o botão direito no teu projecto no Project Inspector, e escolhes View Source

Ele vai abrir-te o ficheiro .dpr do teu projecto, vulgo, o programa principal.

Possivelmente a ordem de criação das forms não está correcta, e ele está a tentar abrir algo no FormCreate que ainda não está criado.

Se tivesse de tentar adivinhar, diria que estás a iniciar a base de dados numa form diferente da principal, mas essa está a ser criada apenas depois da principal.

No programa principal, tens algo como:

Application.CreateForm(Tform1, form1);
Application.CreateForm(Tform2, form2);

Altera a ordem das linhas de forma a que a tua form principal seja a última a ser criada.

Se não resolver, mostra aqui o código do programa principal e do formcreate que te dá o erro.

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

Este é o código do Form principal.

unit UMenuPrin;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, jpeg, ExtCtrls, ActnList, Menus, ComCtrls, ToolWin, ImgList, DB,
 DBTables;

type
 TFormMenuPrin = class(TForm)
   imgFundo: TImage;
   ActionList1: TActionList;
   ActCliente: TAction;
   ActAnimal: TAction;
   ActFuncio: TAction;
   ActTipo: TAction;
   ActRaca: TAction;
   ActSair: TAction;
   MainMenu1: TMainMenu;
   Cadastros1: TMenuItem;
   Atendimento1: TMenuItem;
   Relatrios1: TMenuItem;
   N1: TMenuItem;
   Animal1: TMenuItem;
   N2: TMenuItem;
   AnimalF31: TMenuItem;
   N3: TMenuItem;
   FuncionrioF41: TMenuItem;
   N4: TMenuItem;
   ipoF51: TMenuItem;
   N5: TMenuItem;
   RaaF61: TMenuItem;
   SairF71: TMenuItem;
   Funo1: TMenuItem;
   Cliente1: TMenuItem;
   N6: TMenuItem;
   Animal2: TMenuItem;
   N7: TMenuItem;
   Atendimento2: TMenuItem;
   Pesquisa1: TMenuItem;
   Cliente2: TMenuItem;
   N8: TMenuItem;
   Animal3: TMenuItem;
   ImageList1: TImageList;
   ToolBar1: TToolBar;
   ToolButton1: TToolButton;
   ToolButton2: TToolButton;
   ToolButton3: TToolButton;
   ToolButton4: TToolButton;
   ToolButton5: TToolButton;
   ToolButton6: TToolButton;
   ToolButton7: TToolButton;
   StatusBar1: TStatusBar;
   Timer1: TTimer;
   Database1: TDatabase;
   Query1: TQuery;
   N9: TMenuItem;
   AnimalF32: TMenuItem;
   N10: TMenuItem;
   FuncionrioF61: TMenuItem;
   UpdateSQL1: TUpdateSQL;
   DataSource1: TDataSource;
   procedure Timer1Timer(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 FormMenuPrin: TFormMenuPrin;
 contaErro : integer;

implementation

uses Ulogin, USplash;

{$R *.dfm}

procedure TFormMenuPrin.Timer1Timer(Sender: TObject);
begin
StatusBar1.Panels[0].Text := ' ' + FormatDateTime('hh:nn:ss',now); //
StatusBar1.Panels[1].Text := ' ' + FormatDateTime ('dddd", "dd" de "mmmm" de "yyyy',now);
end;

procedure TFormMenuPrin.FormClose(Sender: TObject;
 var Action: TCloseAction);
begin
    // Sintaxe: MessageDlg(‘Mensagem’, tipo da tela, [botões], índice ajuda);
if MessageDlg('Deseja fechar a aplicação?', mtConfirmation,
[mbYes, mbNo], 0) = mrYes then
begin
//Dm.tab_Usuario1.Close; // remova o comentário após criar a tela DM
Action := caFree; //ação do objeto TCloseAction para fechar a tela
end
else
Action := caNone ; //ação do objeto TCloseAction para não fechar a tela
end;

procedure TFormMenuPrin.FormCreate(Sender: TObject);
begin
 Try
    FrmLogin := TFrmLogin.Create(Nil);
    FrmLogin.ShowModal;
 Finally
    FrmLogin.Free;
    FrmLogin := Nil;
    end;
end;

end.

Esse é o código da tela de login , que esta dando erro. Depois que eu fiz esse form começou o erro.

unit Ulogin;


interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Buttons, jpeg, ExtCtrls ;

type
 TFrmLogin = class(TForm)
   Image1: TImage;
   GrpBoxLogin: TGroupBox;
   Label1: TLabel;
   Label2: TLabel;
   Label3: TLabel;
   EdtApelido: TEdit;
   EdtSenha: TEdit;
   BtnOk: TBitBtn;
   BtnCancelar: TBitBtn;
   procedure BtnCancelarClick(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormClick(Sender: TObject);
   procedure FormClick(Sender: TObject);
   procedure BtnOkClick(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 FrmLogin: TFrmLogin;
 contaErro : integer;
implementation

uses UMenuPrin;

{$R *.dfm}

procedure TFrmLogin.BtnCancelarClick(Sender: TObject);

begin
Application.Terminate;
end;

procedure TFrmLogin.BtnOkClick(Sender: TObject);

begin
Dm.Usuario1.Open; // abre a tabela tab_Usuarios
FormMenuPrin.StatusBar1.Panels[2].Text := ' Usuário1:' +
FrmLogin.EdtApelido.Text + ' - '+ Dm.tab_Usuario1.SENHAUSUARIO.AsSTring;
If not (Dm.tab_Usuario1.Locate('NOMEUSUARIO', FrmLogin.EdtApelido.Text,
[loPartialKey ])) or (Dm.tab_Usuario1.SENHAUSUARIO.Value <>
FrmLogin.EdtSenha.Text) then
begin
MessageDlg('Nome ou senha do usuário inválidos.'+#13+#13
+ 'Se você esqueceu sua senha, consulte '+ #13
+ 'o administrador do sistema', mtError, [mbOK], 0);
EdtSenha.Clear; // limpa o objeto EdtSenha
EdtSenha.SetFocus; //Ajusta o foco para o objeto EdtSenha
end
else
begin
FrmLogin.Hide; //Esconde a tela
FrmMenuPrin.ShowModal; //chama a tela FrmMenuPrin no modo modal
FrmLogin.Release; //Remove a tela da memória
FrmLogin := Nil; //Atribui conteúdo nulo para a variável de tela FrmLogin
end;
end;

end.
Edited by thoga31
Tags code + GeSHi
Posted

Fabio

Tens de mostrar também o programa principal (ficheiro dpr), caso contrário não te consigo ajudar, já que creio que o problema maior está lá.

De qualquer maneira, tens de dar uma olhada à unit do login. 4 declarações do FormCreate indicam qualquer coisa de muito estranho! 🙂

Especialmente porque não há nenhuma implementação no código que mostras.

Outra coisa é estares a chamar a form principal como modal da form de login, e logo a seguir mandas a de login ao ar. Também não é bom.

Mostra lá o programa principal para tentar perceber melhor com que linhas te estás a cozer, e ver se pomos isso OK! 😉

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Mas nao sera disso mesmo? Se tens as linhas com

procedure FormCreate (Sender : TObject);

o compilador vai dar erro a dizer que nao estão implementadas nao e? Pode ser esse o erro que te dá. Se é isso é so apagares essas funçoes nao implementadas, caso nao precises delas

Posted (edited)

Este é o código do programa principal.

program tcc;
uses
 Forms,
 SysUtils,
 UMenuPrin in 'UMenuPrin.pas' {FormMenuPrin},
 USplash in 'USplash.pas' {FormSplash},
 Ulogin in 'Ulogin.pas' {FrmLogin};
{$R *.res}
begin
 Application.Initialize;
 Application.CreateForm(TFormMenuPrin, FormMenuPrin);
 FormSplash.Show; //exibe a tela FrmSplash
 FormSplash.Refresh; // dá um refresh na tela
 Sleep(2000); // (aguarda 02 segundos)
 Application.Run;
end.
Edited by thoga31
GeSHi
Posted

Apaga as linhas

   procedure FormCreate(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormClick(Sender: TObject);
   procedure FormClick(Sender: TObject);

Da Ulogin para ver se dá o mesmo erro

Posted (edited)

Bem, há aí muitos elementos estranhos. Possivelmente, por não estar a ver todo o código:

Na form de login, estás a usar um identificador chamado dm (presumo que seja um datamodule), mas não está declarado em lado nenhum.

Se realmente estiveres a usá-lo, ele deverá estar declarado em unir própria, e chamado na secção uses de todos os ficheiros que façam uso dele.

Mais ainda, deverá estar a ser criado (Application.CreateForm) no programa principal, logo a seguir ao Application.Initialize, antes de criar a form principal.

Pessoalmente, acho que deves tirar o FormSplash do programa principal, e chamá-lo no FormCreate da form principal.

De seguida, no FormCreate da form principal, estás a criar e chamar (de forma modal) a form de login.

OK, aqui tudo bem (mas pessoalmente dispenso o frmLogin:=nil - O Free já chama o destructor da classe, o nil só vai atrapalhar aí.

Dentro da form login, fazes o que tens a fazer. Quando terminares, nem por um decreto deves chamar a form principal como modal. Lembra-te ela já está criada, e ela é que chamou a de login.

O que deves fazer é, em vez de esconderes a de login com o Hide, finalizas o processo modal começado na form principal.

Para isso, substituis isto:

begin
FrmLogin.Hide; //Esconde a tela
FrmMenuPrin.ShowModal; //chama a tela FrmMenuPrin no modo modal
FrmLogin.Release; //Remove a tela da memória
FrmLogin := Nil; //Atribui conteúdo nulo para a variável de tela FrmLogin
end;

por isto:

ModalResult:=mrOK;

Caso contrário, estás a chamar a form principal como modal de uma que vais destuir a seguir, e que por sua vez é também modal da principal, e com a indicação que uma vez fechada deve ser destruida...

Já estás a ver a confusão que tens para aí?

Faz essas alterações, e depois diz o resultado...

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Comentei as linhas e oo erro foi para a linha de baixo.

Dm.Usuario1.Open; // abre a tabela tab_Usuarios

Afinal estás ou não a usar um datamodule?

Não te basta comentar linhas, há aí coisas que tens mesmo de alterar.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

OK, mas esses database, datasource e query estão colocados em que form?

Segundo o código que aí tens, estão dentro de uma form do tipo datamodule. Mas por outro lado, não tens esse datamodule criado.

Das duas uma:

Ou já tiveste isso a trabalhar e apagaste código.

Ou copiaste código de outro programa e agora dá-te erro, porque não tens os mesmos componentes no projecto.

Qual delas é?

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

No form principal estão os Database,Datasource e query.

Eu peguei esse codigo de um programa que eu ja tinha feito em sala de aula. 🙂

Explicado então...

Tens de remover todas as chamadas ao datamodule (basicamente, tudo o que comece por dm.)

Do mesmo modo, tens de remover todas as chamadas a outros componentes que tenhas e que não existam realmente. Tabelas, funções, etc, vai tudo ao ar.

Primeiro tens de ter a certeza que tudo funciona, e depois começas a implementar o que te falta.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

uma observação.

no construtor do formprincipal vc executa o form de login.

esse por sua vez faz referencia a var global (global é a causa de 99% dos problemas) FormMenuPrin.

porem essa FormMenuPrin ainda ta nula pq a chamada ao construtor q irá ser referenciada por ela ainda não concluiu a execução.

imagine o codigo:

var  //global var
 a : TObjeto;  

procedure Configure();
begin
  a.ExecConfig('Minha config');
end;

function CriaObjeto() : TObjeto;
begin
 Result := TObjeto.Create();
 Configure();  
end;

begin
 a := CriaObjeto();

end.

vai executar a := CriaObjeto();

porem a só vai ser setada no retorno de CriaObjeto;

porem dentro de CriaObjeto() vc ta chmando Configure() q vai usar a q ainda não foi setado.

entendeu?

por essas e outras q eu gosto de:

procedure Configure(a : TObjeto);

lógico q esse código é só um exemplo, rsrs!

Edited by Gilson Nunes
  • 3 weeks later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.