Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про освобождение объектов в объекте


Девушка ©   (2010-04-05 14:08:00) 

Есть класс, в котором в качестве полей класса нужно объявить 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 15:52:00) [1]


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

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


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


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

Проходит

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

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


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


> Девушка   (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;


icWasya   (2010-04-05 15:25:00) [4]

Девушка   (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;



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


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


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


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

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


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


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

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


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


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


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


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

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

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

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

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


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


> И. Павел ©   (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:27:00) [9]


>     Destructor Destroy; overload;


че за ?

override надо


Anatoly Podgoretsky   (2010-04-05 14:26:00) [10]

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

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


oldman   (2010-04-05 14:19:00) [11]

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


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

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


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

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо