![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по классам. Вылезает '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