Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1109572361
1008
2005-02-28 09:32
2005.03.20
Может статься так, что:


14-1109582095
DeadMeat
2005-02-28 12:14
2005.03.20
Еще один дневник...


1-1109259183
George
2005-02-24 18:33
2005.03.20
Помогите с графикой Gerber файла.


1-1109269163
Noctus
2005-02-24 21:19
2005.03.20
стрелка как в Microsoft Visio


1-1109946333
webpauk
2005-03-04 17:25
2005.03.20
Наследники





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский