метод Free

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

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

Ответить
Аватара пользователя
grigoreo
постоялец
Сообщения: 195
Зарегистрирован: 10.03.2009 14:43:43
Откуда: С нашей Раши

метод Free

Сообщение grigoreo »

подскажите как лудше осуществить следующий алгоритм, есть TNoteBook в нем несколько TPage , на каждом TPage есть кнопка, требуется при нажатии на эту кнопку не скрывать TPage а уничтожать всю страницу с всеми находящимися на ней компонентами пробую в обработчике OnClick кнопки выполнить
Notebook1.Page[PageIndex].Free;

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

Сообщение VirtUX »

Возможно нужно перед уничтожением страницы сначала уничтожить все объекты принадлежащие ей?
Пожалуста весь код процедуры уничтожения страницы в студию. Тяжело догадываться, что у Вас там происходит ;)
Аватара пользователя
grigoreo
постоялец
Сообщения: 195
Зарегистрирован: 10.03.2009 14:43:43
Откуда: С нашей Раши

Сообщение grigoreo »

VirtUX писал(а):Возможно нужно перед уничтожением страницы сначала уничтожить все объекты принадлежащие ей?
Пожалуста весь код процедуры уничтожения страницы в студию. Тяжело догадываться, что у Вас там происходит ;)


ну вот такой кусок кода (подправьте где я ошибся плиз)
.....
type

{ TForm1 }

TForm1 = class(TForm)
Notebook1: TNotebook;
procedure BitBtn5Click(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;

var
Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.BitBtn5Click(Sender: TObject);
begin
NoteBook1.Page[NoteBook1.PageIndex].Free; (сдесь ошибка)
end;

procedure TForm1.FormShow(Sender: TObject);
var i:Integer;
p:TPage;
begin
for i:=1 to 5 do
begin
p:=TPage.Create(Self);p.Parent:=NoteBook1;p.Caption:=IntToStr(i);
with TBitBtn.Create(p) do
begin
Parent:=p;Name:='bt'+IntToStr(i);OnClick:=@BitBtn5Click;
end;
end;
end;
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Не факт, что поможет, но попробуй так:

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

procedure TForm1.BitBtn5Click(Sender: TObject);
begin
  NoteBook1.Page[NoteBook1.PageIndex].Free;
  Abort;
end;


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

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

grigoreo
Пользуйтесь тегом code! Уважайте форумчан!

Добавлено спустя 16 минут:

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

var
 p: TPage;
begin
  p:=NoteBook1.Page[NoteBook1.PageIndex];
  NoteBook1.PageIndex:=NoteBook1.PageIndex-1;
  NoteBook1.PageList.Remove(p);
  p.free;
end;


Добавлено спустя 3 минуты 7 секунд:
Или самы простой способ как в Delphi:
Добавить

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

NoteBook1.Pages.Add('Page1');

Удалить

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

NoteBook1.Pages.Delete(Index);
Аватара пользователя
grigoreo
постоялец
Сообщения: 195
Зарегистрирован: 10.03.2009 14:43:43
Откуда: С нашей Раши

Сообщение grigoreo »

Mr.Smart писал(а):Удалить

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

NoteBook1.Pages.Delete(Index);


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

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

grigoreo писал(а):
Mr.Smart писал(а):Удалить

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

NoteBook1.Pages.Delete(Index);


т.е данный способ аналогичен Free он не просто удалит он и вычистит все из памяти?

Да!

п.с. Читайте исходники! Это очень полезно :wink:
fl@nker
незнакомец
Сообщения: 8
Зарегистрирован: 23.06.2009 11:31:12

Сообщение fl@nker »

Вероятно не совсем аналогичная ситуация, но очень похожая:
Есть TFrame следующего вида

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

  TAnyTermFrame = class(TFrame)
     // собственно его наполние .. к сути дела не имеет отношения .. важнее следующее:
    DeleteBtn: TButton;
    procedure DeleteBtnClick(Sender: TObject);
  private
    // Естественно и тут не пусто
    FOnDestroy: TDestroyEvent;
  public
    // И тут тоже что-то есть + следующее
    property OnDestroy: TDestroyEvent read FOnDestroy write FOnDestroy;
  end;

procedure TAnyTermFrame.DeleteBtnClick(Sender: TObject);
begin
  if Assigned(FOnDestroy) then FOnDestroy(Self);
  Free;// в FreePascal вызывает ошибку SIGSEGV а вот Delphi благополучно съедает
end;


Обратите на комент в процедуре DeleteBtnClick, собственно любой объект кроме TForm (собственно только TForm.Close) не удаётся уничтожить изнутри ... ошибка SIGSEGV.

Думаю не стоит обсуждать для чего это нужно, всё прозрачно, любой потомок TControl созданный в процессе выполнения нужно когда-то уничтожить. Нередко по событию самого объекта. Выше предложенный трюк с Abort не прокатывает. :(

Могу только гадать почему такая несправедливость, обратите внимание Delphi аналогичный код собирает и выполняет.
Помогите "правильно" уничтожить объект "изнутри". :oops:
Павел Ишенин
постоялец
Сообщения: 475
Зарегистрирован: 24.03.2007 09:16:52

Сообщение Павел Ишенин »

Изнутри уничтожить не сложно. Сложно уничтожить когда происходит некоторое событие.

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

interface
const
  UM_RELEASE_BTN = LM_USER + 1;
type
  TMyForm = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  protected
     procedure UMReleaseBtn(var Message: TLMessage); message UM_RELEASE_BTN;
  end;
implementation

procedure TMyForm.Button1Click(Sender: TObject);
begin
  PostMessage(Handle, UM_RELEASE_BTN, 0, 0);
end;

procedure TMyForm.UMReleaseBtn(var Message: TLMessage);
begin
  Button1.Free;
end;
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

А еще есть метод TApplication.ReleaseComponent, насколько я понимаю, добавленный специально для того, чтобы избегать таких виндо-специфичных конструкций.
fl@nker
незнакомец
Сообщения: 8
Зарегистрирован: 23.06.2009 11:31:12

Сообщение fl@nker »

Спасибо !!! :D
Ответить