Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Реестр


Gek1 ©   (2005-03-04 14:29:00) 

Почему программа вываливаеться с ошибкой:
"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:58:00) [1]

> 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, в котором эти абстрактные методы перекрыты - реализованы.


Anatoly Podgoretsky   (2005-03-04 14:52:00) [2]

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


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


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


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

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


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

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

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

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


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

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


begin...end   (2005-03-04 14:33:00) [6]

> Gek1   (04.03.05 14:29)

> Values := TStrings.Create

Values := TStringList.Create


Наверх

Титульная страница Поиск, карта сайта Написать письмо