o que é Abstract Error??

27/03/2007

0

qando eu clico nmo botão d inserir registro da esse erro...
pq?


Pvitor

Pvitor

Responder

Posts

27/03/2007

Dmenin

depende..poste mais informações ^^


Responder

27/03/2007

Pvitor

pow tipo q eu, tenho 4 edits....
edtregistro ,edtnome, edttelresidencia, edtemail.

e ao clicar no btn qero q seja gravado no meu banco d dados...

procedure TfrmClientes.CmdBtnInserirClick(Sender: TObject);
var
Cli : Cliente;
begin
Cli := Cliente.Create;
Cliente(Cli).setRegistro(edtRegistro.Text);
Cliente(Cli).setNome(edtNome.Text);
Cliente(Cli).setTelResidencia(edtTelResidencia.Text);
Cliente(Cli).setEmail(edtEmail.Text);

Cli.Persistir;
edtRegistro.Clear;
edtNome.Clear;
edtTelResidencia.Clear;
edtEmail.Clear;
end;


Responder

27/03/2007

Massuda

[list:f655505cde][*:f655505cde]Muito provável que sua classe ´Cliente´ herdou um método abstrato (provavelmente em Persistir) que precisa ser implementado por você[*:f655505cde]Não há necessidade de escrever ´cliente(cli)´ pois você já declarou que cli é um objeto da classe Cliente.[*:f655505cde]O objeto cli não está sendo destruído depois de ser utilizado (isso não se aplica se estiver usando Delphi.NET)[/list:u:f655505cde]


Responder

28/03/2007

Dmenin

ahã, pode ser!
mas para ter certeza, em qual linha ocorre o erro?


Responder

28/03/2007

Marco Salles

[b:1a1982e6e3]massuda citou :[/b:1a1982e6e3]
Muito provável que sua classe ´Cliente´ herdou um método abstrato (provavelmente em Persistir) que precisa ser implementado por você Não há necessidade de escrever ´cliente(cli)´ pois você já declarou que cli é um objeto da classe Cliente. O objeto cli não está sendo destruído depois de ser utilizado (isso não se aplica se estiver usando Delphi.NET)


concordo massuda , com a suas colocaçoes.. Pelo menos é assim que esta nos livros.. Mas algo no minimo esquisito ocorre com a classe TStrings

Exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var
 lista:TStrings;
begin
 lista:=TStrings.Create;
 lista.Add(´xii vai dar erro´);
 showmessage(lista.Strings[0]);
 lista.Free;
end;


Obteremos um abstractErro quando executamos o codigo a seguir

Porém a Classe TStringList Herda da Classe Tpersistent que herda da TObject
A classe TstringList com era de se esperar , não implementa o método Create..
Porém este mesmo méotodo não fo idefinido como abstract na classe TPersistent
O mesmo so foi declarado na classe TObject e não esta com abstract

Eu sinceramente apesar de concordar , não consigo nesta situação ver , o mesmo comportamento em relação as classes definidas da vcl ????

e agora jose???


Responder

28/03/2007

Massuda

[quote:97a865d8ef=´Marco Salles´]...Mas algo no minimo esquisito ocorre com a classe TStrings...[/quote:97a865d8ef]TStrings é uma classe base abstrata (isso está na Ajuda do Delphi)... ela serve de base para outras classe que implementam [b:97a865d8ef]de fato[/b:97a865d8ef] uma lista de strings. Ela não deve ser criada e nem utilizada como está no seu exemplo.

Por exemplo... embora TComboBox.Items e TListBox.Items sejam ambos TStrings, internamente eles são implementados de modo diferente, sendo, na verdade, objetos de classes diferentes que tem um ancestral comum, no caso, TStrings.

[quote:97a865d8ef=´Marco Salles´]Porém a Classe TStringList Herda da Classe Tpersistent que herda da TObject
A classe TstringList com era de se esperar , não implementa o método Create..
Porém este mesmo méotodo não fo idefinido como abstract na classe TPersistent
O mesmo so foi declarado na classe TObject e não esta com abstract[/quote:97a865d8ef]Não entendi.


Responder

28/03/2007

Marco Salles

TStrings é uma classe base abstrata (isso está na Ajuda do Delphi)... ela serve de base para outras classe que implementam de fato uma lista de strings. Ela não deve ser criada e nem utilizada como está no seu exemplo.


sim , esta na ajuda... Mas não deveria estar tb na implementação desta classe no Delphi ???

Olhando a definiççao desta classe na Unit CLasses , aonde ela é implementada , [b:60d37ec80a]eu sinceramente não consigo chegar a esta conclusão[/b:60d37ec80a] :cry: :cry: :cry:

TStrings = class(TPersistent) private FDefined: TStringsDefined; FDelimiter: Char; FQuoteChar: Char; FNameValueSeparator: Char; FUpdateCount: Integer; FAdapter: IStringsAdapter; function GetCommaText: string; function GetDelimitedText: string; function GetName(Index: Integer): string; function GetValue(const Name: string): string; procedure ReadData(Reader: TReader); procedure SetCommaText(const Value: string); procedure SetDelimitedText(const Value: string); procedure SetStringsAdapter(const Value: IStringsAdapter); procedure SetValue(const Name, Value: string); procedure WriteData(Writer: TWriter); function GetDelimiter: Char; procedure SetDelimiter(const Value: Char); function GetQuoteChar: Char; procedure SetQuoteChar(const Value: Char); function GetNameValueSeparator: Char; procedure SetNameValueSeparator(const Value: Char); function GetValueFromIndex(Index: Integer): string; procedure SetValueFromIndex(Index: Integer; const Value: string); protected procedure DefineProperties(Filer: TFiler); override; procedure Error(const Msg: string; Data: Integer); overload; procedure Error(Msg: PResStringRec; Data: Integer); overload; function ExtractName(const S: string): string; function Get(Index: Integer): string; virtual; abstract; function GetCapacity: Integer; virtual; function GetCount: Integer; virtual; abstract; function GetObject(Index: Integer): TObject; virtual; function GetTextStr: string; virtual; procedure Put(Index: Integer; const S: string); virtual; procedure PutObject(Index: Integer; AObject: TObject); virtual; procedure SetCapacity(NewCapacity: Integer); virtual; procedure SetTextStr(const Value: string); virtual; procedure SetUpdateState(Updating: Boolean); virtual; property UpdateCount: Integer read FUpdateCount; function CompareStrings(const S1, S2: string): Integer; virtual; public destructor Destroy; override; function Add(const S: string): Integer; virtual; function AddObject(const S: string; AObject: TObject): Integer; virtual; procedure Append(const S: string); procedure AddStrings(Strings: TStrings); virtual; procedure Assign(Source: TPersistent); override; procedure BeginUpdate; procedure Clear; virtual; abstract; procedure Delete(Index: Integer); virtual; abstract; procedure EndUpdate; function Equals(Strings: TStrings): Boolean; procedure Exchange(Index1, Index2: Integer); virtual; function GetText: PChar; virtual; function IndexOf(const S: string): Integer; virtual; function IndexOfName(const Name: string): Integer; virtual; function IndexOfObject(AObject: TObject): Integer; virtual; procedure Insert(Index: Integer; const S: string); virtual; abstract; procedure InsertObject(Index: Integer; const S: string; AObject: TObject); virtual; procedure LoadFromFile(const FileName: string); virtual; procedure LoadFromStream(Stream: TStream); virtual; procedure Move(CurIndex, NewIndex: Integer); virtual; procedure SaveToFile(const FileName: string); virtual; procedure SaveToStream(Stream: TStream); virtual; procedure SetText(Text: PChar); virtual; property Capacity: Integer read GetCapacity write SetCapacity; property CommaText: string read GetCommaText write SetCommaText; property Count: Integer read GetCount; property Delimiter: Char read GetDelimiter write SetDelimiter; property DelimitedText: string read GetDelimitedText write SetDelimitedText; property Names[Index: Integer]: string read GetName; property Objects[Index: Integer]: TObject read GetObject write PutObject; property QuoteChar: Char read GetQuoteChar write SetQuoteChar; property Values[const Name: string]: string read GetValue write SetValue; property ValueFromIndex[Index: Integer]: string read GetValueFromIndex write SetValueFromIndex; property NameValueSeparator: Char read GetNameValueSeparator write SetNameValueSeparator; property Strings[Index: Integer]: string read Get write Put; default; property Text: string read GetTextStr write SetTextStr; property StringsAdapter: IStringsAdapter read FAdapter write SetStringsAdapter; end;


[b:60d37ec80a]marco salles citou[/b:60d37ec80a]
Porém a Classe TStringList Herda da Classe Tpersistent que herda da TObject A classe TstringList com era de se esperar , não implementa o método Create.. Porém este mesmo méotodo não fo idefinido como abstract na classe TPersistent O mesmo so foi declarado na classe TObject e não esta com abstract [b:60d37ec80a]massuda citou[/b:60d37ec80a] [quote:60d37ec80a]Não entendi
.[/quote:60d37ec80a]

:!: :!:
O que eu quis dizer por[u:60d37ec80a][b:60d37ec80a] analoia [/b:60d37ec80a][/u:60d37ec80a]a estas classes abaixo , foi o seguinte

TClassePai = class procedure metodoMensagem;virtual; abstract; end; TClassefilha = class(TClassePai) procedure OutraCoisa; end; implementation {$R *.dfm} { TClassefilha } procedure TClassefilha.OutraCoisa; begin showmessage(´outra mensagem´); end;


[b:60d37ec80a]Ao executar[/b:60d37ec80a] :arrow: :arrow:

procedure TForm1.Button1Click(Sender: TObject); var umObjeto:TClasseFilha; begin umObjeto:=TClasseFilha.Create; umObjeto.metodoMensagem; end;


[color=darkred:60d37ec80a]é claro que obterei um erro Abstarct Error...[/color:60d37ec80a]

Então por analogia eu pensei (sem levar ao pé da letra o que esta escrito no Help do delphi sobre a classe Tstring) que o método create da Classe Tstring , deveria esta presente na classe tpersistente com abstract..
[b:60d37ec80a]Porque estou falando deste método exclusivamente ..[/b:60d37ec80a] :?: :?:

[color=darkblue:60d37ec80a][u:60d37ec80a][b:60d37ec80a]Porque ao executar o código abaixo e ao [b]depurar[/b:60d37ec80a] , verifica-se que da erro no método Cretate[/b][/u:60d37ec80a][/color:60d37ec80a]
procedure TForm1.Button1Click(Sender: TObject); 
var 
 lista:TStrings; 
begin 
 lista:=TStrings.Create; 
 lista.Add(´xii vai dar erro´); 
 showmessage(lista.Strings[0]); 
 lista.Free; 
end;


Enfim , eu não uso diretamente a TStrings , por na prática , ja ter sentido seus efeitos... Porém sinceramente , se fosse olhar a definição desta classe não concluiria que se trata de uma classe puramente abstrata :cry: :cry:


Responder

28/03/2007

Massuda

Ao compilar seu exemplo, o aviso é...
Constructing instance of ´TStrings´ containing abstract methods
...ou seja, o compilador está avisando a você que você criou um objeto que contem métodos abstratos.

Uma classe abstrata não implica em uma classe com todos os métodos abstratos. No caso de TStrings, note que os métodos abstratos dela são basicamente aqueles relacionados com a forma de armazenamento das strings; outros métodos podem ser perfeitamente implementados sem necessidade de se saber como as strings são armazenadas, logo não necessitam ser abstratos.
[quote:5f6c36591f=´Marco Salles´]é claro que obterei um erro Abstarct Error...
[/quote:5f6c36591f]Na verdade você obtem novamente o aviso ao compilar sobre estar criando um objeto com métodos abstratos.
[quote:5f6c36591f=´Marco Salles´]Porém sinceramente , se fosse olhar a definição desta classe não concluiria que se trata de uma classe puramente abstrata[/quote:5f6c36591f]Qualquer classe que tenha pelo menos um método abstrato é uma classe abstrata. Infelizmente, a sintaxe do ObjectPascal não deixa isso claro. Nesse ponto, OP se parece muito com C++, embora a sintaxe de método abstrato em C++ seja pior (você põe um ´= 0´ na definição do método); C# usa uma sintaxe mais clara, obriga a incluir um ´abstract´ na declaração da classe.


Responder

28/03/2007

Marco Salles

é isso mesmo....

a bronca ocorrreu devido a :

procedure TForm1.Button1Click(Sender: TObject);
var
 lista:TStrings;
begin
 lista:=TStrings.Create; //pensei que a exceção estava ocorrendo aqui
 lista.Add(´xii vai dar erro´); //mas não , ela ocorre aqui..
 showmessage(lista.Strings[0]);
 lista.Free;
end;


eu pensei que a exceção lançada fosse no método cretae....Mas a exceção foi levantada método Add
Assim eu verifiquei as definiçoes e pude constatar que:

function TStrings.Add(const S: string): Integer; begin Result := GetCount; Insert(Result, S); end;


e no cabeçalho da classe a função GetCount esta definida com abstract

[b:17212a8d12]
function GetCount: Integer; virtual; abstract;
[/b:17212a8d12]

tirando qualquer dúvida

obrigado...


Responder

29/03/2007

Pvitor

a linha q da erro é essa :

Cli.Persistir;


Responder

Assista grátis a nossa aula inaugural

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