Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

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

 
Девушка   (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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.085 c
2-1272958382
Пробегалец
2010-05-04 11:33
2010.08.27
Быстрый вывод графики на канву


15-1272820362
s_t_d
2010-05-02 21:12
2010.08.27
PostgreSQL. Книги для начального изучения.


15-1270326605
Юрий
2010-04-04 00:30
2010.08.27
С днем рождения ! 4 апреля 2010 воскресенье


3-1242645912
Юрий Зотов
2009-05-18 15:25
2010.08.27
Update одной таблицы по условию из другой таблицы


15-1267447734
Empleado
2010-03-01 15:48
2010.08.27
COMODO AV