метод Free

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

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

метод Free

Сообщение grigoreo » 22.06.2009 09:37:54

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

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

Re: метод Free

Сообщение VirtUX » 22.06.2009 12:32:07

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

Re: метод Free

Сообщение grigoreo » 22.06.2009 13:30:51

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;
Аватара пользователя
grigoreo
постоялец
 
Сообщения: 195
Зарегистрирован: 10.03.2009 15:43:43
Откуда: С нашей Раши

Re: метод Free

Сообщение Max Rusov » 22.06.2009 14:31:12

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

Код: Выделить всё
procedure TForm1.BitBtn5Click(Sender: TObject);
begin
  NoteBook1.Page[NoteBook1.PageIndex].Free;
  Abort;
end;


Хотя, конечно, лучше просто передизайнить форму, чтобы так не делать.
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: метод Free

Сообщение Mr.Smart » 22.06.2009 14:39:01

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);
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: метод Free

Сообщение grigoreo » 22.06.2009 15:15:53

Mr.Smart писал(а):Удалить
Код: Выделить всё
NoteBook1.Pages.Delete(Index);


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

Re: метод Free

Сообщение Mr.Smart » 22.06.2009 15:17:42

grigoreo писал(а):
Mr.Smart писал(а):Удалить
Код: Выделить всё
NoteBook1.Pages.Delete(Index);


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

Да!

п.с. Читайте исходники! Это очень полезно :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: метод Free

Сообщение fl@nker » 23.06.2009 15:09:25

Вероятно не совсем аналогичная ситуация, но очень похожая:
Есть 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:
fl@nker
незнакомец
 
Сообщения: 8
Зарегистрирован: 23.06.2009 11:31:12

Re: метод Free

Сообщение Павел Ишенин » 23.06.2009 17:08:21

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

Код: Выделить всё
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;
Павел Ишенин
постоялец
 
Сообщения: 475
Зарегистрирован: 24.03.2007 10:16:52

Re: метод Free

Сообщение Sergei I. Gorelkin » 23.06.2009 17:17:03

А еще есть метод TApplication.ReleaseComponent, насколько я понимаю, добавленный специально для того, чтобы избегать таких виндо-специфичных конструкций.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: метод Free

Сообщение fl@nker » 24.06.2009 00:50:04

Спасибо !!! :D
fl@nker
незнакомец
 
Сообщения: 8
Зарегистрирован: 23.06.2009 11:31:12


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru