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