Форум: "Начинающим";
Текущий архив: 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