Create -> Free -> Create -> Error

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

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

Ответить
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Create -> Free -> Create -> Error

Сообщение VirtUX »

Собственно вот код:

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

unit Unit1; 

{$mode objfpc}{$H+}

interface

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

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  Pane: TPanel;

implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  ifor: integer;
begin
  if Pane = nil then
  begin
  Pane := TPanel.Create(Form1);
  Pane.Parent := Form1;
  Pane.Width:= 200;
  Pane.Height:= 200;
  Pane.Caption:= 'Ku-ku';
  Pane.Show
  end
  else
  begin
    Pane.Hide;
    Pane.Free;
  end;
end;

initialization
  {$I unit1.lrs}

end.

При первом нажатии на Бутон Панель создается. Второй - уничтожается. Третий - ошибка. Объясните в чем у меня проблема?
sts
энтузиаст
Сообщения: 555
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

после
Pane.Free;
вставить
Pane := nil;
?
или заменить на
FreeAndNil(Pane);
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Мое огромное "мерси"!
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Вот так:

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

while FormDialogs.ControlCount > 0 do FormDialogs.Controls[0].Free;

Ошибок не возникает, но происходит утечка памяти.
Вот так:

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

while FormDialogs.ControlCount > 0 do begin
  FormDialogs.Controls[0].Free;
  FormDialogs.Controls[0] := nil;
end;

и так:

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

while FormDialogs.ControlCount > 0 do FreeAndNil(FormDialogs.Controls[0]);

возникает ошибка о недопустимом аргументе.
И еще вопрос. Как корректно удалить форму созданную вот так:

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

AnyForm := TForm.Create(Application);
yuray
новенький
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Сообщение yuray »

VirtUX писал(а):И еще вопрос. Как корректно удалить форму созданную вот так:

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

AnyForm := TForm.Create(Application);


Я удаляю так

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

if Assigned(AnyForm) then
begin
  AnyForm.free;
  AnyForm := nil;
  // или FreeAndNil(AnyForm);
end;
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

А в первой части вопроса может кто-нибудь помоч?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Вот так:

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

var
 c: TControl;
begin
  while FromDialog.ControlCount > 0 do
   begin
    c:=FromDialog.Controls[0];
    FormDialog.RemoveControl(c);
    c.Free;
   end;
end;
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Есть объект:

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

TAnyObject = class
private
  But: TButton;
  procedure CloseObj(Sender: TObject);
public
  constructor Create(OnObj: TForm);
  destructor Destroy; override;
end;

в конструкторе создается кнопка:

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

constructor TAnyObject.Create(OnObj: TForm);
begin
  inherited Create;
  But := TButton.Create(OnObj);
  ...
  But.OnClick := @CloseObj;
end;

в деструкторе она уничтожается:

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

destructor TAnyObject.Destroy;
begin
  FreeAndNil(But);
  ...
  inherited Destroy;
end;

Уничтожение объекта должно быть произведено по нажатии этой самой кнопки. Пробывал так:

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

procedure TAnyObject.CloseObj;
begin
  self.destroy;
end;

и так:

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

procedure TAnyObject.CloseObj;
begin
  FreeAndNil(self);
end;

Вываливается ошибка Access violation. Как быть?
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Все - разобрался. Собственная невнимательность. Можно удалить пост, так как ошибки в этом примере не возникает.

Добавлено спустя 5 часов 24 минуты 9 секунд:
Интересно, при закрытии приложения, форма будет автоматически удалена, если создана во время выполнения AnyForm := TForm.Create(Application); ?
yuray
новенький
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Сообщение yuray »

VirtUX писал(а):Интересно, при закрытии приложения, форма будет автоматически удалена, если создана во время выполнения AnyForm := TForm.Create(Application); ?

Будет, так-как владельцем формы AnyForm будет Application. Проблемы будут возникать если в качестве хозяина указать NIL.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

yuray писал(а):Будет, так-как владельцем формы AnyForm будет Application.

Следовательно и компоненты принадлежащие форме (Component := TComponent.Create(AnyForm);) тоже будут автоматически, корректно удалены?
yuray
новенький
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Сообщение yuray »

VirtUX писал(а):Следовательно и компоненты принадлежащие форме (Component := TComponent.Create(AnyForm);) тоже будут автоматически, корректно удалены?

Да, будут корректно удалены.
Ответить