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

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

Вопрос по классам. Вылезает 'Abstract Error'


LordOfRock ©   (2006-02-12 22:03:00) 

Здравствуйте, мастера.

Сразу оговорюсь, что я ламер в создании классов, и это мой первый класс, который я пытаюсь написать. такчто сильно не бейте, всему же надо когда-то учиться :)

Имеется код:


interface
uses
  Classes;
type
  TFolder = class
     private
        myItems: array of array of string;
        SubFolders : TList; <=Здесь хранятся объекты TFolder. Вообще такое возможно?
     protected

     public
        constructor Create;
        destructor Destroy;
     published
        function AddSubFolder (Name:String) : Integer;
  end;

implementation

  constructor TFolder.Create;
     begin
        SubFolders := TList.Create;
     end;

  destructor TFolder.Destroy;
     begin
        SubFolders.Free;
     end;

  function TFolder.AddSubFolder;
     var
        NewFolder : TFolder;
        PNewFolder : ^TFolder;
     begin
        try
           NewFolder := TFolder.Create;
           PNewFolder^ := NewFolder;
           New(PNewFolder);
           Result := SubFolders.Add(PNewFolder);
        finally
           Free;
        end;
     end;


Вообщем, я пытаюь реализовать хранение древовидной структуры в памяти. Но при вызове функции AddSubFolder('NewFolder');Выходит ошибка 'Abstract Error'. При пошаговой отладке я так и не смог понять где именно она возникает. Компилятор проходит все строчки кода и на выходе из процедуре лезет сообщение. Причёмпосле закрытия окна курсор останавливается на сточке end.в самом конце проекта.

Подскажите, пожалуйста, что я неправильно делаю.

P.S. И книги по Delphi в данный момент нету - другу почитать отдал :)


LordOfRock   (2006-02-14 01:26:00) [1]

Жуков Олег   (14.02.06 0:01) [8]

Спасибо. Учтём. Это я свою БД разрабатываю. Жлкое такое подобе получается, но СВОЁ!


Жуков Олег   (2006-02-14 00:13:00) [2]

Прошу прощения за ошибки, в методах GetSubFolder и AddSubFolder вместо Subfolders следует читать FSubFolders.


Жуков Олег   (2006-02-14 00:01:00) [3]

Вот так правильнее будет (с точки зрения надёжности работы с памятью). Вообще, если возникают подобные вопросы, сильно может помочь анализ исходников стандартных подобных классов, конкректно в этом случае можно посмотреть на ТМenu (TMenuItem), TСustomTreeView (можно найти в папке Delphi/Source/Vcl). Ну, и инструкцию почитать обязательно.

private
 FSubfolders: TList
 function GetSubFolder(Index: Integer): TFolder;
 function GetSubFolderCount: Integer;
public
 constructor Create;
 destructor Destroy; override;
 function AddSubFolder: Integer;
 procedure DeleteSubfolder(Index: Integer);
 property SubFolders[Index: Integer]: TFolder read GetSubFolder;
 property SubfolderCount read GetSubFolderCount;
end;

constructor Create;
begin
 inherited;
 FSubFolders := TList.Create();
end;

destructor TFolder.Destroy;
begin
 Clear();
 FSubFolders.Free();
 inherited;
end;

function TFolder.AddSubFolder;
begin
 Result := SubFolders.Add(TFolder.Create)
end;

procedure TFolder.DeleteSubfolder(Index: Integer);
begin
 GetSubFolder(Index).Free();
 FSubFolders.Delete(Index);
end;

procedure TFolder.Clear;
begin
 while GetSuFolderCount > 0 do
   DeleteSubdolder(0);
end;

function TFolder.GetSubFolder(Index: Integer): TFolder;
begin
 Result := SubFolders[Index];
end;


LordOfRock   (2006-02-13 23:03:00) [4]

begin...end ©   (12.02.06 22:26) [4]

Огромное вам спасибо.

evvcom ©   (13.02.06 8:48) [5]
А что, кнопку F1 мыши съели?


А вы сами попробуйте вопроизвести мой код и пошарить в хэлпе. там всё про директиивы всякие. Ничего не понял.

Amoeba ©   (13.02.06 18:02) [6]
Да и к деструктору надо не забывать добавлять директивку override.


Ругается.


Amoeba   (2006-02-13 18:02:00) [5]

Да и к деструктору надо не забывать добавлять директивку override.


evvcom   (2006-02-13 08:48:00) [6]


> P.S. И книги по Delphi в данный момент нету - другу почитать
> отдал :)

Более уместным был бы смайлик :(
А что, кнопку F1 мыши съели?


begin...end   (2006-02-12 22:26:00) [7]

> LordOfRock ©   (12.02.06 22:20) [2]

Да, переменная классового типа (и результат, возвращаемый конструктором) -- это указатель на экземпляр класса.

Далее, вероятно, потребуется обращаться к элементам списка SubFolders как к экземплярам класса TFolder. Для этого потребуется приведение типа:
TFolder(SubFolders[индекс]).


Плохиш   (2006-02-12 22:22:00) [8]


> Видимо, результат TFolder.Create уже и есть сразу указатель?

Пора наконец прочитать инструкцию.


LordOfRock   (2006-02-12 22:20:00) [9]

begin...end ©   (12.02.06 22:13) [1]

Совершенно неожиданное решение... и правильное.
Всегда думал, что в TList хранятя указатели на переменные, и собственно так и сделал по привычке. Видимо, результат TFolder.Create уже и есть сразу указатель?


begin...end   (2006-02-12 22:13:00) [10]

function TFolder.AddSubFolder;
begin
 Result := SubFolders.Add(TFolder.Create)
end


Наверх

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