метод Free
Модератор: Модераторы
метод Free
подскажите как лудше осуществить следующий алгоритм, есть TNoteBook в нем несколько TPage , на каждом TPage есть кнопка, требуется при нажатии на эту кнопку не скрывать TPage а уничтожать всю страницу с всеми находящимися на ней компонентами пробую в обработчике OnClick кнопки выполнить
Notebook1.Page[PageIndex].Free;
происходит ошибка SIGSEGV,
Notebook1.Page[PageIndex].Free;
происходит ошибка SIGSEGV,
Возможно нужно перед уничтожением страницы сначала уничтожить все объекты принадлежащие ей?
Пожалуста весь код процедуры уничтожения страницы в студию. Тяжело догадываться, что у Вас там происходит
Пожалуста весь код процедуры уничтожения страницы в студию. Тяжело догадываться, что у Вас там происходит
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;
Не факт, что поможет, но попробуй так:
Хотя, конечно, лучше просто передизайнить форму, чтобы так не делать.
Код: Выделить всё
procedure TForm1.BitBtn5Click(Sender: TObject);
begin
NoteBook1.Page[NoteBook1.PageIndex].Free;
Abort;
end;Хотя, конечно, лучше просто передизайнить форму, чтобы так не делать.
grigoreo
Пользуйтесь тегом code! Уважайте форумчан!
Добавлено спустя 16 минут:
Добавлено спустя 3 минуты 7 секунд:
Или самы простой способ как в Delphi:
Добавить
Удалить
Пользуйтесь тегом 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 писал(а):УдалитьКод: Выделить всё
NoteBook1.Pages.Delete(Index);
т.е данный способ аналогичен Free он не просто удалит он и вычистит все из памяти?
grigoreo писал(а):Mr.Smart писал(а):УдалитьКод: Выделить всё
NoteBook1.Pages.Delete(Index);
т.е данный способ аналогичен Free он не просто удалит он и вычистит все из памяти?
Да!
п.с. Читайте исходники! Это очень полезно
Вероятно не совсем аналогичная ситуация, но очень похожая:
Есть TFrame следующего вида
Обратите на комент в процедуре DeleteBtnClick, собственно любой объект кроме TForm (собственно только TForm.Close) не удаётся уничтожить изнутри ... ошибка SIGSEGV.
Думаю не стоит обсуждать для чего это нужно, всё прозрачно, любой потомок TControl созданный в процессе выполнения нужно когда-то уничтожить. Нередко по событию самого объекта. Выше предложенный трюк с Abort не прокатывает.
Могу только гадать почему такая несправедливость, обратите внимание Delphi аналогичный код собирает и выполняет.
Помогите "правильно" уничтожить объект "изнутри".
Есть 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 аналогичный код собирает и выполняет.
Помогите "правильно" уничтожить объект "изнутри".
-
Павел Ишенин
- постоялец
- Сообщения: 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
- Откуда: Зеленоград
А еще есть метод TApplication.ReleaseComponent, насколько я понимаю, добавленный специально для того, чтобы избегать таких виндо-специфичных конструкций.
Спасибо !!! 
