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

Вниз

Не уничтожается класс с 0 индексом   Найти похожие ветки 

 
Алексей2010   (2010-02-06 19:56) [0]

Вываливается ошибка при попытки освободить экземплары класса Class2 и Class3 с индексом 0. Подскажите что я делаю неправильно?

interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TClass3 = class
           private
             FParam3 : string;
           public
             property Param3 : string read FParam3 write FParam3;
             constructor Create;
             destructor  Destroy;
           end;

 TClass2 = class
           private
             FParam2 : string;
             FSize3  : word;
             FClass3 : array of TClass3;
             procedure SetClass3 (Index : word; AClass3 : TClass3);
             function  GetClass3 (Index: word) : TClass3;
             procedure SetSize3 (ASize3 : word);
           public
             property Param2 : string read FParam2 write FParam2;
             property Class3 [Index : word] : TClass3 read GetClass3 write SetClass3;
             property Size3 : word read FSize3 write SetSize3;
             constructor Create;
             destructor  Destroy;
          end;

 TClass1 = class
           private
             FSize2  : word;
             FClass2 : array of TClass2;
             procedure SetClass2 (Index : word; AClass2 : TClass2);
             function  GetClass2 (Index: word) : TClass2;
             procedure SetSize2 (ASize2 : word);
           public
             property Class2 [Index : word] : TClass2 read GetClass2 write SetClass2;
             property Size2 : word read FSize2 write SetSize2;
             constructor Create;
             destructor  Destroy;
          end;

implementation
////////////////////////////////////////////////////////
//TClass1
////////////////////////////////////////////////////////
procedure TClass1.SetClass2 (Index : word; AClass2 : TClass2);
begin
 FClass2 [Index] := AClass2;
end;

//-----------------------------------------------------
function TClass1.GetClass2 (Index: word) : TClass2;
begin
 Result := FClass2 [Index];
end;

//-----------------------------------------------------
procedure TClass1.SetSize2 (ASize2 : word);
var
 I : word;
begin

 if FSize2 <> 0 then    // &#229;&#241;&#235;&#232; &#237;&#229; &#239;&#229;&#240;&#226;&#251;&#233; &#226;&#251;&#231;&#238;&#226;
 for I := 0 to Size2 do // &#238;&#241;&#226;&#238;&#225;&#238;&#230;&#228;&#224;&#229;&#236; &#239;&#224;&#236;&#255;&#242;&#252;
   FreeAndNil (FClass2 [I]); // ERROR EROOR &#206;&#216;&#200;&#193;&#202;&#192;, &#237;&#229; &#238;&#241;&#226;&#238;&#225;&#238;&#230;&#228;&#224;&#229;&#242;&#241;&#255; &#238;&#225;&#250;&#229;&#234;&#242; &#241; &#232;&#237;&#228;&#229;&#234;&#241;&#238;&#236; 0

// &#241;&#238;&#231;&#228;&#224;&#229;&#236; &#236;&#224;&#241;&#241;&#232;&#226; &#232; &#238;&#225;&#250;&#229;&#234;&#242;&#251; Class2
 FSize2 := ASize2;
 SetLength (FClass2, Size2);
 for I := 0 to Size2 do
   FClass2 [I] := TClass2.Create;

end;

//-----------------------------------------------------
constructor TClass1.Create;
begin
end;

//-----------------------------------------------------
destructor  TClass1.Destroy;
var
 I : word;
begin
 for I := 0 to Size2 do
   FreeAndNil (FClass2 [I]);
end;

////////////////////////////////////////////////////////
//TC2
////////////////////////////////////////////////////////
procedure TClass2.SetClass3 (Index : word; AClass3 : TClass3);
begin
 FClass3 [Index] := AClass3;
end;

//-----------------------------------------------------
function TClass2.GetClass3 (Index: word) : TClass3;
begin
 Result := FClass3 [Index];
end;

//-----------------------------------------------------
procedure TClass2.SetSize3 (ASize3 : word);
var
 I : word;
begin

 if FSize3 <> 0 then    // &#229;&#241;&#235;&#232; &#237;&#229; &#239;&#229;&#240;&#226;&#251;&#233; &#226;&#251;&#231;&#238;&#226;
 for I := 0 to Size3 do // &#238;&#241;&#226;&#238;&#225;&#238;&#230;&#228;&#224;&#229;&#236; &#239;&#224;&#236;&#255;&#242;&#252;
   FreeAndNil (FClass3 [I]); // ERROR EROOR &#206;&#216;&#200;&#193;&#202;&#192;, &#237;&#229; &#238;&#241;&#226;&#238;&#225;&#238;&#230;&#228;&#224;&#229;&#242;&#241;&#255; &#238;&#225;&#250;&#229;&#234;&#242; &#241; &#232;&#237;&#228;&#229;&#234;&#241;&#238;&#236; 0

// &#241;&#238;&#231;&#228;&#224;&#229;&#236; &#236;&#224;&#241;&#241;&#232;&#226; &#232; &#238;&#225;&#250;&#229;&#234;&#242;&#251; Class2
 FSize3 := ASize3;
 SetLength (FClass3, Size3);
 for I := 0 to Size3 do
   FClass3 [I] := TClass3.Create;

end;

//-----------------------------------------------------
constructor TClass2.Create;
begin
end;

//-----------------------------------------------------
destructor  TClass2.Destroy;
begin
end;

////////////////////////////////////////////////////////
//TC3
////////////////////////////////////////////////////////
constructor TClass3.Create;
begin
end;

//-----------------------------------------------------
destructor  TClass3.Destroy;
begin
end;


 
oldman ©   (2010-02-06 20:03) [1]

Кажется ты вываливаешься за границы массива.
Если FSize равно, предположим, шести, у тебя в массиве шесть элементов?
А For i: to FSize подразумевает 7.


 
oldman ©   (2010-02-06 20:07) [2]

И что-то у меня сомнения насчет FretAndNil массива поэлементно с головы...


 
KilkennyCat ©   (2010-02-06 21:23) [3]


> oldman ©   (06.02.10 20:07) [2]

он же не элементы массива грохает, а содержимое, так что без разницы откуда.


 
Anatoly Podgoretsky ©   (2010-02-06 22:50) [4]

downto
А что за бардак с пустыми Create и Destroy


 
Демо ©   (2010-02-06 23:46) [5]


> Алексей2010   (06.02.10 19:56) 


А где пример использования?


 
Игорь Шевченко ©   (2010-02-06 23:47) [6]


> Подскажите что я делаю неправильно?


Все.

По пунктам:
не говоришь, что за ошибка.
вываливаешь огромный код с комментариями на непонятном языке
просишь незнакомых людей поработать визуальными отладчиками

читай и воздастся тебе:
http://ln.com.ua/~openxs/articles/smart-questions-ru.html


 
Алексей2010   (2010-02-07 10:01) [7]

Удалено модератором


 
oldman ©   (2010-02-07 10:24) [8]

Из текста программы неясно, что хранится в переменных Size2, Size3 и Index при вызове функций.

А вот это:

> procedure TClass1.SetClass2 (Index : word; AClass2 : TClass2);
> begin
>  FClass2 [Index] := AClass2;
> end;

Зачем было оформлять процедурой?
Посылать два параметра, чтоб один присвоить другому...


 
sniknik ©   (2010-02-07 10:29) [9]

> а нафига тогда вообще эта конференция?
ну явно не для дебага дурного кода... или отгадывания места ошибки и что за ошибка...

одна из целей в наставлении начинающих... на то чтоб им начать думать самим, на то чтоб обдумывать вопрос, а не просто "бухать как есть, не пойми что,  и ждать конкретного ответа" (это фантастика сынок...), но то чтобы вопрос действительно был вопросом, а не кодом для дебагера (который на куске работать как раз и не будет...), но то чтобы вопросы были грамотными (см ссылку)...
вообще, как кто то сказал, вопрос должен содержать половину ответа иначе это не вопрос (ну или что то типа, не дословно в общем). и если бы ты хотя бы попытался составить правильный вопрос. то возможно сам нашел бы ответ...

> спасибо за помощь
пожалуйста. и что бы ты там не думал это действительно помощь. (чувствуется сарказм в твоем спасибо...)



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.073 c
2-1268982904
M@G30
2010-03-19 10:15
2010.08.27
Как хранить данные в TreeNode?


2-1266751523
Fr
2010-02-21 14:25
2010.08.27
TRichEdit, вставка текста


15-1273123334
oldman
2010-05-06 09:22
2010.08.27
картинка, потрясающая воображение...


15-1275924128
bss
2010-06-07 19:22
2010.08.27
Регулярные выражения: как проверить вхождение числа в диапазон


15-1275008062
CuBiC
2010-05-28 04:54
2010.08.27
Выборка файлов