Форум: "Начинающим";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];
ВнизВопрос по классам. Вылезает 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c