Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про освобождение объектов в объекте   Найти похожие ветки 

 
Девушка   (2010-04-05 14:08) [0]

Есть класс, в котором в качестве полей класса нужно объявить TStringList.

Выглядит примерно так
TRecordExtractor=class (TObject)

  private
    NowString:longint;
    Function GetInStr:TStringList;
    Procedure SetInStr(InStrP:TStringList);
    Procedure SetOutStr(OutStrP:TStringList);
    Function GetOutStr:TStringList;

  public
    Property InStr:TStringList read GetInStr write SetInStr; //входной стринглист
    Property OutStr:TstringList read GetOutStr write SetOutStr;//выходной стринглист (3 строчки или сколько получится)
    Constructor Create; overload;
    Destructor Destroy; overload;
  end;

Constructor TRecordExtractor.Create;
Begin
 Inherited;
 InStr:=TStringList.Create;
 OutStr:=TStringList.Create;
 NowString:=0;
End;

Destructor TRecordExtractor.Destroy;
Begin
 InStr:=TStringList.Free;
 OutStr:=TStringList.Free;
 Inherited;
End;

Function TRecordExtractor.GetInStr:TStringList;
Begin
GetInStr:=InStr;
End;

Function TRecordExtractor.GetOutStr:TStringList;
Begin
GetOutStr:=OutStr;
End;

Procedure TRecordExtractor.SetInStr(InStrP:TStringList);
Begin
InStr:=InStrP;
End;

Procedure TRecordExtractor.SetInStr(OutStrP:TStringList);
Begin
OutStr:=OutStrP;
End;

Вопрос: при вызове RecordExtractor.free описанный деструктор же выполняться не будет? Как правильно описать что бы выполнялось и TStringList-ы освобождались?


 
Сергей М. ©   (2010-04-05 14:11) [1]

Прежде всего следует раз и навсегда осмыслить разницу между overload и override.
Это две разные разницы, и overload тут абсолютно не к месту, чего нельзя сказать про override.


 
И. Павел ©   (2010-04-05 14:11) [2]

InStr:=TStringList.Free;
OutStr:=TStringList.Free;

:)
Нужно так:
InStr.Free;
OutStr.Free;


 
oldman ©   (2010-04-05 14:19) [3]

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


 
Anatoly Podgoretsky ©   (2010-04-05 14:26) [4]

> oldman  (05.04.2010 14:19:03)  [3]

В консерватории пришла пора лабораторных и прочих работ.
ДМ это бесплатный их испольнитель.


 
Игорь Шевченко ©   (2010-04-05 14:27) [5]


>     Destructor Destroy; overload;


че за ?

override надо


 
Девушка   (2010-04-05 14:43) [6]


> И. Павел ©   (05.04.10 14:11) [2]

точно... но суть то не в этом...


> Сергей М. ©   (05.04.10 14:11) [1]
> Прежде всего следует раз и навсегда осмыслить разницу между
> overload и override.
> Это две разные разницы, и overload тут абсолютно не к месту,
>  чего нельзя сказать про override.

Взято отсюда http://www.delphisources.ru/pages/faq/faq_delphi_basics/Constructor.php.html
но ошибка понята

Но при попытке указать override пишет Cannot ovveride a static method...
Компилирует вот так

 TRecordExtractor=class
  private
    NowString:longint;
    Function GetInStr:TStringList;
    Procedure SetInStr(InStrP:TStringList);
    Procedure SetOutStr(OutStrP:TStringList);
    Function GetOutStr:TStringList;

  public
    Property InStr:TStringList read GetInStr write SetInStr; //входной стринглист
    Property OutStr:TstringList read GetOutStr write SetOutStr;//выходной стринглист (3 строчки или сколько получится)
    Constructor Create;
    Destructor Destroy;
  end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

Constructor TRecordExtractor.Create;
Begin
 Inherited;
 InStr:=TStringList.Create;
 OutStr:=TStringList.Create;
 NowString:=0;
End;

Destructor TRecordExtractor.Destroy;
Begin
 InStr.free;
 OutStr.free;
 Inherited;
End;

Function TRecordExtractor.GetInStr:TStringList;
Begin
GetInStr:=InStr;
End;

Function TRecordExtractor.GetOutStr:TStringList;
Begin
GetOutStr:=OutStr;
End;

Procedure TRecordExtractor.SetInStr(InStrP:TStringList);
Begin
InStr:=InStrP;
End;

Procedure TRecordExtractor.SetOutStr(OutStrP:TStringList);
Begin
OutStr:=OutStrP;
End;


Но пишет Method "Destroy" hides virtual method of base type "TObject"
Это, я так понимаю -нормально. Мы его все равно через inherited вызываем.

Но вопрос остался. Будут ли освобождаться
 InStr.free;
 OutStr.free;

И еще проблемка
var
RecordExtractor:TRecordExtractor;
...
RecordExtractor:=TRecordExtractor.Create;
зависает (((


 
Сергей М. ©   (2010-04-05 14:53) [7]


> ошибка понята


Судя по очередным танцам с бубном  нишиша она тебе не понятна.

override - спецификатор для перекрытия одноименных виртуальных методов предка,

Предок твоего класса - класс TObject (он же прародитель ВСЕХ дельфийских классов без исключения).

Деструктор TObject.Destroy как раз и есть виртуальный метод, его и следует перекрывать, о чем тебе намекают грабли "Method "Destroy" hides virtual method of base type "TObject""

Конструктор же TObject.Create не является виртуальным - это статический метод класса, его нельзя перекрывать, о чем тебе недвусмысленно говорят грабли "Cannot ovveride a static method"


 
Девушка   (2010-04-05 15:14) [8]


> Сергей М. ©   (05.04.10 14:53) [7]

Еще б понять почему зависает....
Зависать начинает, если в конструкторе объявить
 InStr:=TStringList.Create;
 OutStr:=TStringList.Create;


Если не объявлять - не виснет...


 
Сергей М. ©   (2010-04-05 15:17) [9]


> Девушка   (05.04.10 15:14) [8]


> Еще б понять почему зависает

Для этого как раз и существует встроенный в Делфи отладчик


 
icWasya ©   (2010-04-05 15:25) [10]

Девушка   (05.04.10 15:14) [8]

Еще б понять почему зависает....

патамушто -
InStr - объявлена как property
Property InStr:TStringList read GetInStr write SetInStr;
а функция
Function TRecordExtractor.GetInStr:TStringList;
Begin
GetInStr:=InStr;//здеся опять обращаемся к property
End;
и врезультате бесконечная рекурсия
InStr->GetInStr->InStr->GetInStr->InStr->GetInStr->InStr->GetInStr->

Показываю

TRecordExtractor=class
 private
   NowString:longint;
// здесть лучше использовать абстрактный класс
   FInStr:TStrings;  
   FOutStr:TStrings;
   Procedure SetInStr(InStrP:TStrings);
   Procedure SetOutStr(OutStrP:TStrings);
 public
   Property InStr:TStrings read FInStr write SetInStr; //входной стринглист
   Property OutStr:Tstrings read FOutStr write SetOutStr;//выходной стринглист (3 строчки или сколько получится)
   Constructor Create;
   Destructor Destroy;
 end;

var
Form1: TForm1;

implementation

{$R *.dfm}

Constructor TRecordExtractor.Create;
Begin
Inherited;
// а вот здесь нужно использовать уже реальный StringList
FInStr:=TStringList.Create;
FOutStr:=TStringList.Create;
NowString:=0;
End;

Destructor TRecordExtractor.Destroy;
Begin
FInStr.free;
FOutStr.free;
Inherited;
End;

// в методах сеттерах лучше использовать assign
Procedure TRecordExtractor.SetInStr(InStrP:TStrings);
Begin
 FInStr.Assign(InStrP);
End;

Procedure TRecordExtractor.SetOutStr(OutStrP:TStringList);
Begin
 FOutStr.Assign(OutStrP);
End;



Найдите десять отличий


 
cyber-pilot   (2010-04-05 15:31) [11]


> Девушка   (05.04.10 15:14) [8]
> Еще б понять почему зависает....
> Зависать начинает, если в конструкторе объявить
>  InStr:=TStringList.Create;
>  OutStr:=TStringList.Create;
>
> Если не объявлять - не виснет...


Рекурсия получается. Надо бы писать как-то так.

TRecordExtractor=class
 private
   FInStr: TStringList;
   FOutStr: TStringList;
   NowString:longint;
   Function GetInStr:TStringList;
   Procedure SetInStr(InStrP:TStringList);
   Procedure SetOutStr(OutStrP:TStringList);
   Function GetOutStr:TStringList;

 public
   Property InStr:TStringList read GetInStr write SetInStr; //входной стринглист
   Property OutStr:TstringList read GetOutStr write SetOutStr;//выходной стринглист (3 строчки или сколько получится)
   Constructor Create;
   Destructor Destroy; override;
 end;

var
Form1: TForm1;

implementation

{$R *.dfm}

Constructor TRecordExtractor.Create;
Begin
FInStr:=TStringList.Create;
FOutStr:=TStringList.Create;
NowString:=0;
End;

Destructor TRecordExtractor.Destroy;
Begin
FInStr.free;
FOutStr.free;
Inherited;
End;

Function TRecordExtractor.GetInStr:TStringList;
Begin
 Result := FInStr;
End;

Function TRecordExtractor.GetOutStr:TStringList;
Begin
 Result := FOutStr;
End;

Procedure TRecordExtractor.SetInStr(InStrP:TStringList);
Begin
 FInStr := InStrP;
End;

Procedure TRecordExtractor.SetOutStr(OutStrP:TStringList);
Begin
FOutStr := OutStrP;
End;


 
Девушка   (2010-04-05 15:37) [12]


Procedure TRecordExtractor.SetInStr(InStrP:TStringList);
Begin
FInStr.Assign(InStrP);
End;

Проходит

Function TRecordExtractor.GetInStr:TStringList;
Begin
Result:=FInStr;
End;

Рекурсирует ((


 
Девушка   (2010-04-05 15:52) [13]


> icWasya ©   (05.04.10 15:25) [10]

Здесь был правильный ответ  ))
Всем спасибо.



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

Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.056 c
15-1271881805
Юрий
2010-04-22 00:30
2010.08.27
С днем рождения ! 22 апреля 2010 четверг


15-1272952103
Phoenix
2010-05-04 09:48
2010.08.27
Как подерживать себя в работоспособном состоянии.


13-1125381370
Cherrex
2005-08-30 09:56
2010.08.27
CodeDom


2-1272987071
User
2010-05-04 19:31
2010.08.27
Удаление тегов в MP3-файле


15-1266419494
12
2010-02-17 18:11
2010.08.27
mssql. Пожелание о SPID





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