Home
Top.Mail.Ru Yandeks.Metrika
Forum: "Beginners";
Current archive: 2010.08.27;
Download: [xml.tar.bz2];

Down

Question about releasing objects in an object Find similar branches


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

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

It looks something like this
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;

:)
You need this:
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]


> I. Pavel © (05.04.10 14: 11) [2]

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


> Sergey M. © (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 - спецификатор для перекрытия одноименных virtual методов предка,

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

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

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



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


> Sergey M. © (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;
and function
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;



Find ten differences



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;

was
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;

Passes by

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

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



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


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

Здесь был правильный ответ  ))
Thank you all.



Pages: 1 whole branch

Forum: "Beginners";
Current archive: 2010.08.27;
Download: [xml.tar.bz2];

Top









Memory: 0.62 MB
Time: 0.109 c
15 - 1264902636
Tuk
2010-01-31 04:50
2010.08.27
How to reduce this design?


3 - 1241781897
romanln
2009-05-08 15:24
2010.08.27
Delphi 7 and Oracle 10g how to tie?


2 - 1273233990
Rolls
2010-05-07 16:06
2010.08.27
ListView output icons


15 - 1265361958
Ghost
2010-02-05 12:25
2010.08.27
Nokia 3110c передача *.txt по синезубу


15 - 1270905676
Hermann
2010-04-10 17:21
2010.08.27
Free football returns to the Russians through the Internet.





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
English French German Italian Portuguese Russian Spanish