Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.48 MB
Время: 0.012 c
15-1139492255
Странник
2006-02-09 16:37
2006.03.05
Borland уходит из бизнеса IDE


2-1140262588
Patrick
2006-02-18 14:36
2006.03.05
Web Design с чего начать?


2-1140254580
yurc
2006-02-18 12:23
2006.03.05
конкретный пример


2-1140262804
saintninja
2006-02-18 14:40
2006.03.05
Помогите плизз


2-1140252679
Urvin
2006-02-18 11:51
2006.03.05
Поймать событие зезактивации формы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский