Вниз
Скачать: CL | DM;

Реестр   Найти похожие ветки 

 
Gek1   (2005-03-04 14:29) [0]

Почему программа вываливаеться с ошибкой:
"Project Project1 raised exception class EAbstractError with message "Abstract Error""

Сам код:

var Reg : TRegistry;
   Values : TStrings;
begin
{Открываем нужную ветку в реестре}
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CURRENT_USER;
Values := TStrings.Create;
if REG.OpenKey("Software\Test",false) then Reg.GetValueNames(Values);
Values.Free;
{Закрываем ветку в реестре}
Reg.CloseKey;
Reg.Free;


В реестре ветка существует и для теста кинул туда 1 строковую переменную.
После ошибки компилятор указывает на строку:
if REG.OpenKey("Software\Test",false) then Reg.GetValueNames(Values);


 
begin...end ©   (2005-03-04 14:33) [1]

> Gek1   (04.03.05 14:29)

> Values := TStrings.Create

Values := TStringList.Create


 
Gek1   (2005-03-04 14:42) [2]

Работает, но почему с TStrings неработает?

В справке написано:
procedure GetValueNames(Strings: TStrings);

И в чем разница между Strings и StringList?


 
Игорь Шевченко ©   (2005-03-04 14:42) [3]

Почему help не читаешь ?


 
Gek1   (2005-03-04 14:45) [4]


> Игорь Шевченко


Так там так и написано:
procedure GetValueNames(Strings: TStrings);

Написали бы:
procedure GetValueNames(Strings: StringList);
и вопросов бы небыло!


 
Anatoly Podgoretsky ©   (2005-03-04 14:52) [5]

В справке написано правильно, откуда ты взял что конструктор и формальные параметры это одно и тоже. Снова перечитать справку, в части Create и около.


 
begin...end ©   (2005-03-04 14:58) [6]

> Gek1   (04.03.05 14:42) [2]

> И в чем разница между Strings и StringList?

Разница в том, что TStrings является базовым классом и содержит абстрактные методы, т.е. методы, которые в этом классе объявлены, но НЕ реализованы. Такие методы должны перекрываться в потомках (в потомках должна быть указана их реализация). Вот TStringList является потомком TStrings, в котором эти самые абстрактные методы перекрыты.

Например, вот как объявлен метод TStrings.Clear (см. модуль Classes):

TStrings = class(TPersistent)
public
 procedure Clear; virtual; abstract;
end.


В строке Reg.GetValueNames(Values) Вы передаёте в метод GetValueNames экземпляр абстрактного класса Values: TStrings. Теперь давайте посмотрим, что происходит внутри этого метода (реализацию метода можно найти в модуле Registry):

procedure TRegistry.GetValueNames(Strings: TStrings);
var
 ...
begin
 Strings.Clear;
 ...
end.


В выделенной строке вызывается метод TStrings.Clear, а ведь он как раз является абстрактным, т.е. у него НЕТ реализации! Поэтому и происходит ошибка.

И поэтому в качестве параметра в метод TRegistry.GetValueNames можно передавать любой потомок базового класса TStrings, в котором эти абстрактные методы перекрыты - реализованы.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.026 c
1-1109259183
George
2005-02-24 18:33
2005.03.20
Помогите с графикой Gerber файла.


9-1103645931
Creep
2004-12-21 19:18
2005.03.20
OpenGL и mega1.1


1-1110028625
Mars
2005-03-05 16:17
2005.03.20
Странное поведение панелей


14-1109092744
pusrg
2005-02-22 20:19
2005.03.20
Delphi 2005 & Pocket PC


1-1110134197
delphi-code
2005-03-06 21:36
2005.03.20
Помогите решить проблему с Dll




   Наверх