Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.20;
Скачать: 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 вся ветка

Текущий архив: 2005.03.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.043 c
4-1107955685
snake_r
2005-02-09 16:28
2005.03.20
stFileSystem в TService


1-1110095064
Checist [root]
2005-03-06 10:44
2005.03.20
TreeNode


6-1105772012
tester666
2005-01-15 09:53
2005.03.20
CGI приложения


1-1110381021
Peter_cc
2005-03-09 18:10
2005.03.20
Закрытие др.приложение


14-1109306288
begin...end
2005-02-25 07:38
2005.03.20
С Днём рождения! 25 февраля