Форум: "Основная";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
ВнизРеестр Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.044 c