Create -> Free -> Create -> Error

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

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

Create -> Free -> Create -> Error

Сообщение VirtUX » 11.07.2008 10:02:44

Собственно вот код:
Код: Выделить всё
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.

При первом нажатии на Бутон Панель создается. Второй - уничтожается. Третий - ошибка. Объясните в чем у меня проблема?
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Create -> Free -> Create -> Error

Сообщение sts » 11.07.2008 10:15:05

после
Pane.Free;
вставить
Pane := nil;
?
или заменить на
FreeAndNil(Pane);
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Create -> Free -> Create -> Error

Сообщение VirtUX » 11.07.2008 10:25:01

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

Re: Create -> Free -> Create -> Error

Сообщение VirtUX » 05.09.2009 15:53:26

Вот так:
Код: Выделить всё
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);
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Create -> Free -> Create -> Error

Сообщение yuray » 05.09.2009 16:16:26

VirtUX писал(а):И еще вопрос. Как корректно удалить форму созданную вот так:
Код: Выделить всё
AnyForm := TForm.Create(Application);


Я удаляю так
Код: Выделить всё
if Assigned(AnyForm) then
begin
  AnyForm.free;
  AnyForm := nil;
  // или FreeAndNil(AnyForm);
end;
yuray
новенький
 
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Re: Create -> Free -> Create -> Error

Сообщение VirtUX » 07.09.2009 10:56:30

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

Re: Create -> Free -> Create -> Error

Сообщение Mr.Smart » 07.09.2009 11:18:44

Вот так:
Код: Выделить всё
var
c: TControl;
begin
  while FromDialog.ControlCount > 0 do
   begin
    c:=FromDialog.Controls[0];
    FormDialog.RemoveControl(c);
    c.Free;
   end;
end;
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Create -> Free -> Create -> Error

Сообщение VirtUX » 08.09.2009 17:53:59

Есть объект:
Код: Выделить всё
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 10:52:19
Откуда: Крым, Алушта

Re: Create -> Free -> Create -> Error

Сообщение VirtUX » 10.09.2009 09:47:53

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

Добавлено спустя 5 часов 24 минуты 9 секунд:
Интересно, при закрытии приложения, форма будет автоматически удалена, если создана во время выполнения AnyForm := TForm.Create(Application); ?
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Create -> Free -> Create -> Error

Сообщение yuray » 10.09.2009 16:45:57

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

Будет, так-как владельцем формы AnyForm будет Application. Проблемы будут возникать если в качестве хозяина указать NIL.
yuray
новенький
 
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Re: Create -> Free -> Create -> Error

Сообщение VirtUX » 11.09.2009 12:05:32

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

Следовательно и компоненты принадлежащие форме (Component := TComponent.Create(AnyForm);) тоже будут автоматически, корректно удалены?
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Create -> Free -> Create -> Error

Сообщение yuray » 14.09.2009 13:57:34

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

Да, будут корректно удалены.
yuray
новенький
 
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru