Abstract Error
OLá pessoal, preciso da ajuda de vocês !!!!
Fiz um form principal, em seguida fiz um form de base para eu ter ele como matriz, fiz 2 data modules, um para conexão e outro para a tabela de dados, em seguida criei um novo form herdando do primeiro e agora qdo eu faço a chamada dele esta dando a mensagem "Abstract Error".
A Aplicaçao está como MDI FORM, o formbase esta como MDICHILD. Ja tinha feio algo parecido antes sem dar este problema, a unica diferença agora é o tipo do form MdiChild e as implententações que eu fiz.
Abaixo a Unit do FormBase:
=======================================================================
unit uFrmBase;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ExtCtrls, ActnList, ImgList, ToolWin, ComCtrls, Menus, DB;
type
TFrmBase = class(TForm)
TobBase: TToolBar;
ImgBase: TImageList;
Ac_Base: TActionList;
pnlBase: TPanel;
PpmBase: TPopupMenu;
Ac_Incluir: TAction;
Ac_Alterar: TAction;
Ac_Excluir: TAction;
Ac_Cancelar: TAction;
Ac_Pesquisar: TAction;
Ac_Ferramentas: TAction;
Ac_Salvar: TAction;
Ac_Fechar: TAction;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ToolButton7: TToolButton;
ToolButton8: TToolButton;
ToolButton9: TToolButton;
ToolButton10: TToolButton;
ToolButton11: TToolButton;
Calculadora1: TMenuItem;
Calendrio1: TMenuItem;
N1: TMenuItem;
Ajuda1: TMenuItem;
N2: TMenuItem;
Relatrios1: TMenuItem;
N3: TMenuItem;
DsBase: TDataSource;
procedure Ac_IncluirExecute(Sender: TObject);
procedure Ac_AlterarExecute(Sender: TObject);
procedure Ac_ExcluirExecute(Sender: TObject);
procedure Ac_CancelarExecute(Sender: TObject);
procedure Ac_PesquisarExecute(Sender: TObject);
procedure Ac_FerramentasExecute(Sender: TObject);
procedure Ac_SalvarExecute(Sender: TObject);
procedure Ac_FecharExecute(Sender: TObject);
procedure Ac_IncluirUpdate(Sender: TObject);
procedure Ac_CancelarUpdate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FrmBase: TFrmBase;
implementation
uses
DBClient, Dialogs;
{$R *.dfm}
procedure TFrmBase.Ac_AlterarExecute(Sender: TObject);
begin
if not DsBase.DataSet.IsEmpty then
begin
pnlBase.Enabled := True;
DsBase.DataSet.Edit;
end
else
if DsBase.DataSet.IsEmpty then
ShowMessage('É necessário selecionar um registro para esta opção !!!');
end;
procedure TFrmBase.Ac_CancelarExecute(Sender: TObject);
begin
TClientDataSet(DsBase.DataSet).CancelUpdates;
pnlBase.Enabled := False;
end;
procedure TFrmBase.Ac_CancelarUpdate(Sender: TObject);
begin
TAction(Sender).Enabled := DsBase.DataSet.State in [dsInsert, dsEdit];
end;
procedure TFrmBase.Ac_ExcluirExecute(Sender: TObject);
begin
if not DsBase.DataSet.IsEmpty then
begin
if MessageDlg('Deseja realmente apagar o registro?', mtWarning,[mbYes,mbNo],0) = mrYes then
begin
pnlBase.Enabled := True;
DsBase.DataSet.Delete;
TClientDataSet(DsBase.DataSet).ApplyUpdates(0);
ShowMessage('Registro apagado com sucesso !!!');
end
else
if MessageDlg('Deseja realmente apagar o registro?', mtWarning,[mbYes,mbNo],0) = mrNo then
begin
pnlBase.Enabled := False;
ShowMessage('Operação cancelada !!!');
end;
end
else
if DsBase.DataSet.IsEmpty then
Showmessage('É necessário selecionar um registro para esta opção !!!');
end;
procedure TFrmBase.Ac_FecharExecute(Sender: TObject);
begin
if MessageDlg('Deseja realmmente sair?', mtWarning,[mbYes, mbNo],0) = mrYes then
begin
if DsBase.DataSet.State in [dsInsert, dsEdit] then
begin
if MessageDlg('Deseja salvar as alterações?',mtConfirmation,[mbYes, mbNo, mbCancel],0) = mrYes then
begin
DsBase.DataSet.Post;
TClientDataSet(DsBase.DataSet).ApplyUpdates(0);
ShowMessage('Alterações/Inclusões salvar com sucesso !!!');
Close;
end
else
if MessageDlg('Deseja salvar as alterações?',mtConfirmation,[mbYes, mbNo, mbCancel],0) = mrNo then
begin
TClientDataSet(DsBase.DataSet).CancelUpdates;
ShowMessage('Alterações/Inclusões canceladas !!!');
Close;
end
end;
end;
end;
procedure TFrmBase.Ac_FerramentasExecute(Sender: TObject);
begin
;
end;
procedure TFrmBase.Ac_IncluirExecute(Sender: TObject);
begin
if not DsBase.DataSet.Active then
DsBase.DataSet.Open;
pnlBase.Enabled := True;
DsBase.DataSet.Insert;
end;
procedure TFrmBase.Ac_IncluirUpdate(Sender: TObject);
begin
TAction(Sender).Enabled := DsBase.DataSet.State in [dsInactive, dsBrowse];
end;
procedure TFrmBase.Ac_PesquisarExecute(Sender: TObject);
begin
;
end;
procedure TFrmBase.Ac_SalvarExecute(Sender: TObject);
begin
DsBase.DataSet.Post;
TClientDataSet(DsBase.DataSet).ApplyUpdates(0);
pnlBase.Enabled := False;
end;
end.
==============================================================
O que eu fiz de errado? Onde devo corrigir?
Abraços,
Rogério
Fiz um form principal, em seguida fiz um form de base para eu ter ele como matriz, fiz 2 data modules, um para conexão e outro para a tabela de dados, em seguida criei um novo form herdando do primeiro e agora qdo eu faço a chamada dele esta dando a mensagem "Abstract Error".
A Aplicaçao está como MDI FORM, o formbase esta como MDICHILD. Ja tinha feio algo parecido antes sem dar este problema, a unica diferença agora é o tipo do form MdiChild e as implententações que eu fiz.
Abaixo a Unit do FormBase:
=======================================================================
unit uFrmBase;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ExtCtrls, ActnList, ImgList, ToolWin, ComCtrls, Menus, DB;
type
TFrmBase = class(TForm)
TobBase: TToolBar;
ImgBase: TImageList;
Ac_Base: TActionList;
pnlBase: TPanel;
PpmBase: TPopupMenu;
Ac_Incluir: TAction;
Ac_Alterar: TAction;
Ac_Excluir: TAction;
Ac_Cancelar: TAction;
Ac_Pesquisar: TAction;
Ac_Ferramentas: TAction;
Ac_Salvar: TAction;
Ac_Fechar: TAction;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ToolButton7: TToolButton;
ToolButton8: TToolButton;
ToolButton9: TToolButton;
ToolButton10: TToolButton;
ToolButton11: TToolButton;
Calculadora1: TMenuItem;
Calendrio1: TMenuItem;
N1: TMenuItem;
Ajuda1: TMenuItem;
N2: TMenuItem;
Relatrios1: TMenuItem;
N3: TMenuItem;
DsBase: TDataSource;
procedure Ac_IncluirExecute(Sender: TObject);
procedure Ac_AlterarExecute(Sender: TObject);
procedure Ac_ExcluirExecute(Sender: TObject);
procedure Ac_CancelarExecute(Sender: TObject);
procedure Ac_PesquisarExecute(Sender: TObject);
procedure Ac_FerramentasExecute(Sender: TObject);
procedure Ac_SalvarExecute(Sender: TObject);
procedure Ac_FecharExecute(Sender: TObject);
procedure Ac_IncluirUpdate(Sender: TObject);
procedure Ac_CancelarUpdate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FrmBase: TFrmBase;
implementation
uses
DBClient, Dialogs;
{$R *.dfm}
procedure TFrmBase.Ac_AlterarExecute(Sender: TObject);
begin
if not DsBase.DataSet.IsEmpty then
begin
pnlBase.Enabled := True;
DsBase.DataSet.Edit;
end
else
if DsBase.DataSet.IsEmpty then
ShowMessage('É necessário selecionar um registro para esta opção !!!');
end;
procedure TFrmBase.Ac_CancelarExecute(Sender: TObject);
begin
TClientDataSet(DsBase.DataSet).CancelUpdates;
pnlBase.Enabled := False;
end;
procedure TFrmBase.Ac_CancelarUpdate(Sender: TObject);
begin
TAction(Sender).Enabled := DsBase.DataSet.State in [dsInsert, dsEdit];
end;
procedure TFrmBase.Ac_ExcluirExecute(Sender: TObject);
begin
if not DsBase.DataSet.IsEmpty then
begin
if MessageDlg('Deseja realmente apagar o registro?', mtWarning,[mbYes,mbNo],0) = mrYes then
begin
pnlBase.Enabled := True;
DsBase.DataSet.Delete;
TClientDataSet(DsBase.DataSet).ApplyUpdates(0);
ShowMessage('Registro apagado com sucesso !!!');
end
else
if MessageDlg('Deseja realmente apagar o registro?', mtWarning,[mbYes,mbNo],0) = mrNo then
begin
pnlBase.Enabled := False;
ShowMessage('Operação cancelada !!!');
end;
end
else
if DsBase.DataSet.IsEmpty then
Showmessage('É necessário selecionar um registro para esta opção !!!');
end;
procedure TFrmBase.Ac_FecharExecute(Sender: TObject);
begin
if MessageDlg('Deseja realmmente sair?', mtWarning,[mbYes, mbNo],0) = mrYes then
begin
if DsBase.DataSet.State in [dsInsert, dsEdit] then
begin
if MessageDlg('Deseja salvar as alterações?',mtConfirmation,[mbYes, mbNo, mbCancel],0) = mrYes then
begin
DsBase.DataSet.Post;
TClientDataSet(DsBase.DataSet).ApplyUpdates(0);
ShowMessage('Alterações/Inclusões salvar com sucesso !!!');
Close;
end
else
if MessageDlg('Deseja salvar as alterações?',mtConfirmation,[mbYes, mbNo, mbCancel],0) = mrNo then
begin
TClientDataSet(DsBase.DataSet).CancelUpdates;
ShowMessage('Alterações/Inclusões canceladas !!!');
Close;
end
end;
end;
end;
procedure TFrmBase.Ac_FerramentasExecute(Sender: TObject);
begin
;
end;
procedure TFrmBase.Ac_IncluirExecute(Sender: TObject);
begin
if not DsBase.DataSet.Active then
DsBase.DataSet.Open;
pnlBase.Enabled := True;
DsBase.DataSet.Insert;
end;
procedure TFrmBase.Ac_IncluirUpdate(Sender: TObject);
begin
TAction(Sender).Enabled := DsBase.DataSet.State in [dsInactive, dsBrowse];
end;
procedure TFrmBase.Ac_PesquisarExecute(Sender: TObject);
begin
;
end;
procedure TFrmBase.Ac_SalvarExecute(Sender: TObject);
begin
DsBase.DataSet.Post;
TClientDataSet(DsBase.DataSet).ApplyUpdates(0);
pnlBase.Enabled := False;
end;
end.
==============================================================
O que eu fiz de errado? Onde devo corrigir?
Abraços,
Rogério
Rogério Nascimento
Curtidas 0
Respostas
Wesley Yamazack
11/07/2009
Olá Meu amigo,
Vou analisar teu problema, e logo retornarei, peço que aguarde um pouco, OK ?
Att,
Wesley Y
Vou analisar teu problema, e logo retornarei, peço que aguarde um pouco, OK ?
Att,
Wesley Y
GOSTEI 0
Rogério Nascimento
11/07/2009
Fala ai meu amigo, tudo na paz?!!!
Bom, vamos direcionar este erro, no momento q eu chamo o form MDI Child eu consegui descobrir, era um evento q eu coloquei no on creat do Data Modulo, tirei o evento e o abstract error parou de dar na abertura do form, mas, lembra uma rotina que vc implementou pra mim, que criava os buttons na toolbar, ficando igual a barra de tarefas do Windows Xp, segue abaixo:
procedure TFrmPrincipal.Cliente1Click(Sender: TObject);
begin
Botao := TToolButton.Create(ToolBar1);
FrmCliente := TFrmCliente.Create(Self);
Botao.Caption := FrmCliente.Caption;
Botao.tag := Integer(FrmCliente);
Botao.Parent := ToolBar1;
Botao.OnClick := DoClick;
ToolBar1.ShowCaptions := True;
FrmCliente.Show;
FrmCliente.btnBotao := Botao;
end;
A linha em vermelha eu não consigo colocar, o delphi não compila, se eu tiro esta linha, ele compila, cria o botão, mas qdo fecho o form e não apaga o botão, se eu clico sobre o botão, ele da a mensagem 'Abstract Error', o que pode ser?
Bom, vamos direcionar este erro, no momento q eu chamo o form MDI Child eu consegui descobrir, era um evento q eu coloquei no on creat do Data Modulo, tirei o evento e o abstract error parou de dar na abertura do form, mas, lembra uma rotina que vc implementou pra mim, que criava os buttons na toolbar, ficando igual a barra de tarefas do Windows Xp, segue abaixo:
procedure TFrmPrincipal.Cliente1Click(Sender: TObject);
begin
Botao := TToolButton.Create(ToolBar1);
FrmCliente := TFrmCliente.Create(Self);
Botao.Caption := FrmCliente.Caption;
Botao.tag := Integer(FrmCliente);
Botao.Parent := ToolBar1;
Botao.OnClick := DoClick;
ToolBar1.ShowCaptions := True;
FrmCliente.Show;
FrmCliente.btnBotao := Botao;
end;
A linha em vermelha eu não consigo colocar, o delphi não compila, se eu tiro esta linha, ele compila, cria o botão, mas qdo fecho o form e não apaga o botão, se eu clico sobre o botão, ele da a mensagem 'Abstract Error', o que pode ser?
GOSTEI 0
Wesley Yamazack
11/07/2009
Olá meu amigo, td bem por aqui, e por ai ?
me manda ae tua rotina compacta ela e me manda, pois assim não tem muito como saber o erro, pois Abstract Error é quando você ta tentando acessar um metódo definido como "Abastract". Dai fica melhor de analisar.
FIco no aguardo.
Att
Wesley Y
me manda ae tua rotina compacta ela e me manda, pois assim não tem muito como saber o erro, pois Abstract Error é quando você ta tentando acessar um metódo definido como "Abastract". Dai fica melhor de analisar.
FIco no aguardo.
Att
Wesley Y
GOSTEI 0
Rogério Nascimento
11/07/2009
Fala Wesley, te mando pra onde? posso te mandar os fontes? Estou usando o delphi 2009
GOSTEI 0
Devmedia
11/07/2009
Rogério,
vc poe mandar os fontes através do disco virtual, que vc possui na home da consultoria.
No canto esqerdo da home vc encontra o disco virtual, bem como o link do video q vai te ajudar a como utilizá-lo.
Lembrando que os arquivos que vc vai upar para ele devem estar no formato .zip ou .rar.
vc poe mandar os fontes através do disco virtual, que vc possui na home da consultoria.
No canto esqerdo da home vc encontra o disco virtual, bem como o link do video q vai te ajudar a como utilizá-lo.
Lembrando que os arquivos que vc vai upar para ele devem estar no formato .zip ou .rar.
GOSTEI 0
Rogério Nascimento
11/07/2009
Postei lá !!!
GOSTEI 0
Wesley Yamazack
11/07/2009
Olá Meu amigo, me manda o link, do download, para poder baixar aqui. Pois não tenho acesso ao disco virtual, só pelo link, blz ? Fico no aguardo.
Att,
Wesley Y
Att,
Wesley Y
GOSTEI 0
Rogério Nascimento
11/07/2009
Fala ai Wesley, tudo na paz?!!!!
Segue ai o link, se vc puder guardar este fonte com vc, principalmente o banco, vou precisar de mais algumas ajudas e com o banco em mãos fica mais facil de vc entender :D
http://video.devmedia.com.br/discovirtual/211600/Sycomm.rar
Abraços.
Segue ai o link, se vc puder guardar este fonte com vc, principalmente o banco, vou precisar de mais algumas ajudas e com o banco em mãos fica mais facil de vc entender :D
http://video.devmedia.com.br/discovirtual/211600/Sycomm.rar
Abraços.
GOSTEI 0
Wesley Yamazack
11/07/2009
Opa meu amigo, blz então vou guardar ele. Me diz uma coisa, qual banco e qual delphi você ta usando ?
E para adiantar, o abstract erro, acontece em que momento? quando você vai clicar no botão ? Ou fechar o form? Já depurou o mesmo? Qual é o erro orginal ?
Fico no aguardo.
Att,
Wesley Y
E para adiantar, o abstract erro, acontece em que momento? quando você vai clicar no botão ? Ou fechar o form? Já depurou o mesmo? Qual é o erro orginal ?
Fico no aguardo.
Att,
Wesley Y
GOSTEI 0
Rogério Nascimento
11/07/2009
Fala ai grande Wesley, tdo na paz?!!!
Estou usando o Firebird 2.1 e o Delphi 2009.
O erro acontece qdo:
No menu principal, abro o Cad Produtos, fecho ele, o botão na barra de tarefas não é eliminado, pois a rotina q elimina ele é aquela linha vermelha q não deixa compilar o projeto, qdo eu abro ele novamente, ai aparecem dois botões na barra de tarefas, um do form atual e o outro do form q tinha sido fechado, qdo eu clico nestes botões q da o erro.
Imagino que se descobrir-mos o motivo pelo qual o projeto não compila com aquela rotina implementada corretamente, isto para de acontecer, pois eu tinha feito testes em um outro projeto e funcionou perfeito, a unica diferença é que agora eu estou utilizando Herança de formulários.
Você vai notar que é muito simples este projeto, inclusive o seu banco de dados, estou utilizando este para tirar todas as minhas duvidas, em termos de pesquisa, permissões, consultas, relatórios, etc e depois de sanadas a mesa ai sim partirei para um projeto maior, onde a estrutura do banco de dados ja está completa.
Abraços,
Rogério
Se precisar, meu msn é rogerioasnascimento@hotmail.com e meu e-mail arhows@gmail.com
Estou usando o Firebird 2.1 e o Delphi 2009.
O erro acontece qdo:
No menu principal, abro o Cad Produtos, fecho ele, o botão na barra de tarefas não é eliminado, pois a rotina q elimina ele é aquela linha vermelha q não deixa compilar o projeto, qdo eu abro ele novamente, ai aparecem dois botões na barra de tarefas, um do form atual e o outro do form q tinha sido fechado, qdo eu clico nestes botões q da o erro.
Imagino que se descobrir-mos o motivo pelo qual o projeto não compila com aquela rotina implementada corretamente, isto para de acontecer, pois eu tinha feito testes em um outro projeto e funcionou perfeito, a unica diferença é que agora eu estou utilizando Herança de formulários.
Você vai notar que é muito simples este projeto, inclusive o seu banco de dados, estou utilizando este para tirar todas as minhas duvidas, em termos de pesquisa, permissões, consultas, relatórios, etc e depois de sanadas a mesa ai sim partirei para um projeto maior, onde a estrutura do banco de dados ja está completa.
Abraços,
Rogério
Se precisar, meu msn é rogerioasnascimento@hotmail.com e meu e-mail arhows@gmail.com
GOSTEI 0
Wesley Yamazack
11/07/2009
Fala meu amigo, td na paz por aqui ! E por ai ?
Seguinte, você disse que a linha compilava e funcionava em outro projeto certo ?
Se sim, apague todas as DCU's do teu projeto, e de um Build no projeto e teste, pois pode ter alguma coisa agarrada ai nestas DCU's.
Se isso não resolver, crie um outro projeto, e adicione teus forms, e unit's neste novo, projeto, pois o problema não esta no código e sim nestas pendencias por fora, do projeto, sacou ?
Abraço meu amigo, pena que não podemos nos falar no msn, consultoria não visa este tipo de comunicação, só pelo forum.
Att,
Wesley Y
Seguinte, você disse que a linha compilava e funcionava em outro projeto certo ?
Se sim, apague todas as DCU's do teu projeto, e de um Build no projeto e teste, pois pode ter alguma coisa agarrada ai nestas DCU's.
Se isso não resolver, crie um outro projeto, e adicione teus forms, e unit's neste novo, projeto, pois o problema não esta no código e sim nestas pendencias por fora, do projeto, sacou ?
Abraço meu amigo, pena que não podemos nos falar no msn, consultoria não visa este tipo de comunicação, só pelo forum.
Att,
Wesley Y
GOSTEI 0
Rogério Nascimento
11/07/2009
Sem problemas meu amigo, vou fazer o teste aqui !!!
Vou te pedir mais uma coisinha :D
Neste projeto, tem um form para cad produtos e uma tabela no banco com o nome de produtos, eu fiz uma trigger na tabela onde ele me gera uma string contendo o nome do usuario, a operação (Inclusão, Alteração), data e hora, eu disparo isto no before insert e no before update, o campo chama-se AUDWIN, tem como este campo aparecer na tela do sistema no momento em q eu salvo o registro? Hoje ele aparece se eu pesquisar o registro novamente.
Abraços e bom final de semana.
Vou te pedir mais uma coisinha :D
Neste projeto, tem um form para cad produtos e uma tabela no banco com o nome de produtos, eu fiz uma trigger na tabela onde ele me gera uma string contendo o nome do usuario, a operação (Inclusão, Alteração), data e hora, eu disparo isto no before insert e no before update, o campo chama-se AUDWIN, tem como este campo aparecer na tela do sistema no momento em q eu salvo o registro? Hoje ele aparece se eu pesquisar o registro novamente.
Abraços e bom final de semana.
GOSTEI 0
Wesley Yamazack
11/07/2009
Olá Meu amigo, vou te dar uma dica, muito usada, hoje ! Esquece banco de dados! Controle tudo isso pela tua aplicação, amanha ou depois voce quer mudar de banco, vai ter que refazer tudo, sacou ? pois tuas regras estão no bd, e nao na aplicação. Entendeu, nao conheço como pegar o valor da que a trigger disparou nao, nem sei se tem como, pois seria um comando, certo ? Que ele executa. O que você poderia fazer era, pegar e ao incluir, da um select, e retonar o cara, assim que que voce executar a operação, já dispara um SELECT, neste campo.
Sacou ?
Att,
Wesley Y
Sacou ?
Att,
Wesley Y
GOSTEI 0
Rogério Nascimento
11/07/2009
Sim senhor :D
Vc falou a agua parou !!! rsrsrs
Vou abrir um novo chamado e se vc puder pega-lo, agradeço, é sobre uma idéia de integração para o contas a pagar fazendo a rotina pelo deplhi.
Abraços.
Rogério
Vc falou a agua parou !!! rsrsrs
Vou abrir um novo chamado e se vc puder pega-lo, agradeço, é sobre uma idéia de integração para o contas a pagar fazendo a rotina pelo deplhi.
Abraços.
Rogério
GOSTEI 0
Wesley Yamazack
11/07/2009
Haha, esta foi boa.haha.
Pode abrir o chamado, e pede pra passarem para mim. Fico no aguardo meu amigo.
Boa noite, e bom descanço.
PS : Este chamado aqui posso fechar certo ??
Abs,
Wesley Y
Pode abrir o chamado, e pede pra passarem para mim. Fico no aguardo meu amigo.
Boa noite, e bom descanço.
PS : Este chamado aqui posso fechar certo ??
Abs,
Wesley Y
GOSTEI 0
Rogério Nascimento
11/07/2009
sim meu amigo !!!!
GOSTEI 0