FabioMalta Posted February 6, 2014 at 04:20 PM Report #544235 Posted February 6, 2014 at 04:20 PM 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.
Kline777 Posted February 6, 2014 at 04:33 PM Report #544236 Posted February 6, 2014 at 04:33 PM (edited) Acho que só essa linha não dá erro... Isso é o cabeçalho da funçao. Dá para pores o codigo completo da funçao FormCreate? Edited February 6, 2014 at 04:33 PM by Kline777 1 Report
nunopicado Posted February 6, 2014 at 04:40 PM Report #544237 Posted February 6, 2014 at 04:40 PM 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. 1 Report "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.
FabioMalta Posted February 10, 2014 at 04:20 PM Author Report #544662 Posted February 10, 2014 at 04:20 PM (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 February 10, 2014 at 04:23 PM by thoga31 Tags code + GeSHi
thoga31 Posted February 10, 2014 at 04:24 PM Report #544665 Posted February 10, 2014 at 04:24 PM Um aparte: coloquei o teu código nas tags CODE, indicando a linguagem para ser feito highlight. Vê aqui como se fazer 😉 Knowledge is free!
nunopicado Posted February 10, 2014 at 05:16 PM Report #544682 Posted February 10, 2014 at 05:16 PM 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.
Kline777 Posted February 10, 2014 at 05:26 PM Report #544685 Posted February 10, 2014 at 05:26 PM 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
FabioMalta Posted February 10, 2014 at 05:39 PM Author Report #544690 Posted February 10, 2014 at 05:39 PM (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 February 10, 2014 at 09:17 PM by thoga31 GeSHi
Kline777 Posted February 10, 2014 at 05:52 PM Report #544692 Posted February 10, 2014 at 05:52 PM 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
nunopicado Posted February 10, 2014 at 05:53 PM Report #544693 Posted February 10, 2014 at 05:53 PM (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 February 10, 2014 at 05:54 PM 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.
FabioMalta Posted February 10, 2014 at 06:18 PM Author Report #544707 Posted February 10, 2014 at 06:18 PM (edited) Comentei as linhas e oo erro foi para a linha de baixo. Dm.Usuario1.Open; // abre a tabela tab_Usuarios Edited February 10, 2014 at 09:17 PM by thoga31 GeSHi
nunopicado Posted February 10, 2014 at 06:20 PM Report #544708 Posted February 10, 2014 at 06:20 PM 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.
FabioMalta Posted February 10, 2014 at 06:25 PM Author Report #544709 Posted February 10, 2014 at 06:25 PM Agora reparei que não estou usando Data Module, e sim DataBase ,DataSource e Query
nunopicado Posted February 10, 2014 at 06:28 PM Report #544711 Posted February 10, 2014 at 06:28 PM 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.
FabioMalta Posted February 10, 2014 at 06:47 PM Author Report #544718 Posted February 10, 2014 at 06:47 PM 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. 🙂
nunopicado Posted February 10, 2014 at 07:26 PM Report #544727 Posted February 10, 2014 at 07:26 PM 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.
Gilson Nunes Posted February 10, 2014 at 09:12 PM Report #544739 Posted February 10, 2014 at 09:12 PM (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 February 10, 2014 at 09:15 PM by Gilson Nunes
FabioMalta Posted February 13, 2014 at 03:33 PM Author Report #545151 Posted February 13, 2014 at 03:33 PM Tentando Resolver isso aqui. 👍
FabioMalta Posted March 4, 2014 at 06:36 PM Author Report #547521 Posted March 4, 2014 at 06:36 PM Poxa era coisa simples mesmo...erro de principiante, eu não tinha declarado a Unit. Valeu pela ajuda pessoal.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now