o que é Abstract Error??
qando eu clico nmo botão d inserir registro da esse erro...
pq?
pq?
Pvitor
Curtidas 0
Respostas
Dmenin
27/03/2007
depende..poste mais informações ^^
GOSTEI 0
Pvitor
27/03/2007
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;
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;
GOSTEI 0
Massuda
27/03/2007
[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]
GOSTEI 0
Dmenin
27/03/2007
ahã, pode ser!
mas para ter certeza, em qual linha ocorre o erro?
mas para ter certeza, em qual linha ocorre o erro?
GOSTEI 0
Marco Salles
27/03/2007
[b:1a1982e6e3]massuda citou :[/b:1a1982e6e3]
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:
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???
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???
GOSTEI 0
Massuda
27/03/2007
[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.
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.
GOSTEI 0
Marco Salles
27/03/2007
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:
GOSTEI 0
Massuda
27/03/2007
Ao compilar seu exemplo, o aviso é...
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.
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.
GOSTEI 0
Marco Salles
27/03/2007
é isso mesmo....
a bronca ocorrreu devido a :
procedure TForm1.Button1Click(Sender: TObject);
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:
e no cabeçalho da classe a função GetCount esta definida com abstract
[b:17212a8d12]
tirando qualquer dúvida
obrigado...
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...
GOSTEI 0
Pvitor
27/03/2007
a linha q da erro é essa :
Cli.Persistir;
Cli.Persistir;
GOSTEI 0