Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.05;
Скачать: CL | DM;

Вниз

Вопрос по классам. Вылезает Abstract Error    Найти похожие ветки 

 
LordOfRock ©   (2006-02-12 22:03) [0]

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

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

Имеется код:


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 в данный момент нету - другу почитать отдал :)


 
begin...end ©   (2006-02-12 22:13) [1]

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


 
LordOfRock ©   (2006-02-12 22:20) [2]

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

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


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


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

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


 
begin...end ©   (2006-02-12 22:26) [4]

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

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

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


 
evvcom ©   (2006-02-13 08:48) [5]


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

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


 
Amoeba ©   (2006-02-13 18:02) [6]

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


 
LordOfRock ©   (2006-02-13 23:03) [7]

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

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

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


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

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


Ругается.


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

Вот так правильнее будет (с точки зрения надёжности работы с памятью). Вообще, если возникают подобные вопросы, сильно может помочь анализ исходников стандартных подобных классов, конкректно в этом случае можно посмотреть на ТМ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;


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

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


 
LordOfRock ©   (2006-02-14 01:26) [10]

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

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



Страницы: 1 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.057 c
2-1139950387
Kot_
2006-02-14 23:53
2006.03.05
Составление индекса по символьному и цифровому полю


1-1138383597
guitarist
2006-01-27 20:39
2006.03.05
Компонент за пределами формы


2-1139992967
MIXER
2006-02-15 11:42
2006.03.05
печать формы


2-1140282291
delphi-oracle
2006-02-18 20:04
2006.03.05
Как получать информацию от EM_GETTEXT и т. д.


1-1138790667
ALS
2006-02-01 13:44
2006.03.05
XPManifest + LoadCursor = глюк