Диструктор динамического массива объектов

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Диструктор динамического массива объектов

Сообщение dilloYa » 20.03.2013 20:08:42

почему не получается убить объекты?
массив oArrSHP объявляю в секции глобальных переменных как oArrSHP: array of TShape;
Код: Выделить всё
procedure TfrmMain.WorkM2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
CountX,CountY: integer;
begin
inc(DynaLen);//глобальная переменная для установки размера массива объектов (каждый раз событие увеличивает размер на 1)
SetLength(oArrSHP, DynaLen);
oArrSHP[DynaLen]:=TShape.Create(Self);
oArrSHP[DynaLen].Parent:=pnlFingerBoard;
with oArrSHP[DynaLen] do //Устанавливаем свойства объекта
     begin
       Width:=19;
       Height:=19;
       Visible:=true;
       Pen.Color:=clBlack;
       Shape:=stCircle;
       Visible:=true;
       Brush.Color:=clRed;
       Font.Color:=clBlack;
       Font.Bold:=true;
       parent.DoubleBuffered:=true;
     end;
{     определяю положение указателя мыши и задаю координаты положения объекта    }
For CountX := 1 to 6 DO
  begin
     If (Y>=(ArrStrPos[CountX]-9)) AND (Y<=(ArrStrPos[CountX]+9)) Then
        For CountY := 1 to 24 DO begin
            oArrSHP[DynaLen].Top:=ArrStrPos[CountX]+1;
            If (X>=ArrFrtPos[CountY]) AND (X<ArrFrtPos[CountY+1]) Then
               begin
                 oArrSHP[DynaLen].Left:=ArrFrtLong[CountY]+1;
               end;
        end;
  end;
end;


процедура дает ожидаемый результат, все работает. Затем мне требуется убить все созданные в этой процедуре объекты.

вешаю на событие Click:
Код: Выделить всё
  for CountX:=1 to DynaLen do
   begin
    oArrSHP[CountX].Free;
    oArrSHP[CountX]:=nil;
   end


Но объекты не пропадают.

И еще, после работы вышеприведенной процедуры создания шейпов, при выходе из приложения вылетает ошибка
Изображение
Последний раз редактировалось dilloYa 20.03.2013 20:51:31, всего редактировалось 1 раз.
Аватара пользователя
dilloYa
новенький
 
Сообщения: 15
Зарегистрирован: 21.01.2013 17:55:50

Re: Диструктор динамического массива объектов

Сообщение Maxizar » 20.03.2013 20:27:11

К сожалению не практиковал free pascal уже 2 года. Но меня напрягает вот это:

1. DynaLen:=DynaLen+1;
Почему не inc ? или сишный вариант DynaLen += 1;

2. for CountX:=1 to DynaLen do
я бы заменил на for CountX:=0 to DynaLen-1 do или я что-то путаю?
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Диструктор динамического массива объектов

Сообщение dilloYa » 20.03.2013 20:38:26

Maxizar писал(а):Почему не inc ? или сишный вариант DynaLen += 1;

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

Добавлено спустя 23 минуты 24 секунды:
dilloYa писал(а):for CountX:=0 to DynaLen-1

ну конечно же, в этом и была ошибка! создавая объект мне не следовало задавать в качестве индекса размер массива, нужно было просто отнимать единицу от размера, ведь индксация же с 0 начинается, а размер с 1! Получается что я создавала объект выходящий за пределы массива. В этом и причина ошибки после выхода приложения. Почему только во время создания он не выкидывал ее. Все проблемы решены, спасибо вам Maxizar , и учту все ваши замечания
Аватара пользователя
dilloYa
новенький
 
Сообщения: 15
Зарегистрирован: 21.01.2013 17:55:50

Re: Диструктор динамического массива объектов

Сообщение Maxizar » 20.03.2013 21:08:06

Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  oArrSHP: array of TShape;
  DynaLen: integer;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  DynaLen := 0;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  for i:=0 to DynaLen-1 do
   begin
     FreeAndNil(oArrSHP[i]);
   end
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
CountX,CountY: integer;
begin
inc(DynaLen);//глобальная переменная для установки размера массива объектов (каждый раз событие увеличивает размер на 1)
SetLength(oArrSHP, DynaLen);
oArrSHP[DynaLen-1]:=TShape.Create(Self);
oArrSHP[DynaLen-1].Parent:=Form1;
with oArrSHP[DynaLen-1] do //Устанавливаем свойства объекта
     begin
       Width:=19;
       Height:=19;
       Visible:=true;
       Pen.Color:=clBlack;
       Shape:=stCircle;
       Visible:=true;
       Brush.Color:=clRed;
       Font.Color:=clBlack;
       Font.Bold:=true;
       parent.DoubleBuffered:=true;
     end;
{     определяю положение указателя мыши и задаю координаты положения объекта    }
//For CountX := 1 to 6 DO
//  begin
//     If (Y>=(ArrStrPos[CountX]-9)) AND (Y<=(ArrStrPos[CountX]+9)) Then
//        For CountY := 1 to 24 DO begin
//            oArrSHP[DynaLen].Top:=ArrStrPos[CountX]+1;
//            If (X>=ArrFrtPos[CountY]) AND (X<ArrFrtPos[CountY+1]) Then
//               begin
//                 oArrSHP[DynaLen].Left:=ArrFrtLong[CountY]+1;
//               end;
//        end;
//  end;

end;

end.



Закоментил часть, с координатами (косяг разбираться)

IMHO напутано с индексацией.

Если мой вариант вылетает, отключите отладчки., либо подружите его с файрволом или антитварью, что у вас там стоит.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Диструктор динамического массива объектов

Сообщение dilloYa » 20.03.2013 21:11:47

Maxizar писал(а):FreeAndNil(oArrSHP[i]);

и за етот кусочек тоже спасибо :)
Аватара пользователя
dilloYa
новенький
 
Сообщения: 15
Зарегистрирован: 21.01.2013 17:55:50


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 229

Рейтинг@Mail.ru