![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Про работу с фреймами [D5]
Alek © (2004-08-12 14:02:00)Как работать с фреймами во время выполнения программы?
Создавать и удалять?
GuAV (2004-08-12 18:36:00) [21]
> технически правильный подход, но лудше реализовать эту функциональность
> в самом фрейме.
TForm(Frame).Release; ?
> Я в свое время задовался вопросом - почему метод Release
> ввели только для CustomForm, а не для WinControl'ов..
И почему же ?
<off>
Чем кстати про конструктор как обычный метод закончилось ?
</off>
jack128 (2004-08-12 17:14:00) [22]
> procedure TForm1.FreeandNilFrame(var Frame: TFrame);
> begin
> PostMessage(Self.Handle,WM_MYFREE,0,LPARAM(Frame));
> Frame:=nil;
> end;
технически правильный подход, но лудше реализовать эту функциональность в самом фрейме.
Я в свое время задовался вопросом - почему метод Release ввели только для CustomForm, а не для WinControl'ов..
GuAV (2004-08-12 15:05:00) [23]Я бы лучше в обработчике делал TObject(Message.lParam).Free; а :=nil после того постмесаге:
procedure TForm1.FreeandNilFrame(var Frame: TFrame);
begin
PostMessage(Self.Handle,WM_MYFREE,0,LPARAM(Frame));
Frame:=nil;
end;
QQ (2004-08-12 14:55:00) [24]а вообще - GuAV прав - требуется написать обработчик сообщения в форме, который будет делать
FreeAndNil(Sootvetstviya1);
QQ (2004-08-12 14:46:00) [25]И вообще, как Вы так пишите??
должно быть:FreeAndNil(Self);
если речь об освобождении собственной памяти у фрейма.
QQ (2004-08-12 14:42:00) [26]а ты проверь-ка после
FreeAndNil(Sootvetstviya1);
у тебя есть какой-нить код в этом обработчике нажатия на кнопку?
;)
GuAV (2004-08-12 14:42:00) [27]GuAV © (12.08.04 14:36) [9]
Это в смысле PostMessage надо делать той форме, где обработчик, т.е. в к-рую вставлен Frame. А Sootvetstviya1 - передавать например в lParam
QQ (2004-08-12 14:38:00) [28]И вообще это неправильный путь. Коли уж создаём фрейм рантайм, то указывайте как овнера форму, где она лежит. Owner это как раз и есть класс, ответственный за освобождение памяти вашего фрейма (или чего-то там еще). Т. е. нужно писать:
If not Assigned(Sootvetstviya1) then
Sootvetstviya1:=TSootvetstviya.Create(Form1);
где вместо Form1 - имя формы, где этот фрейм лежит. Тогда и освобождать ничего в ручную не придётся.
GuAV (2004-08-12 14:36:00) [29]Мне когда-то нужно было чтоб кнопка убивала себя... выкрутился через postmessage wm_user+x главой форме.
Alek (2004-08-12 14:32:00) [30]FreeAndNil(Sootvetstviya1); - вот если я вешаю это на кнопку которая не принадлежит Sootvetstviya1, то все нормлаьно освободжлдается, а если кнопка пренадлежит Sootvetstviya1 то вылетает исключение и фрейм освобождается
Alek (2004-08-12 14:31:00) [31]PostMessage(AddZapchast1.Handle, CM_RELEASE, 0, 0);
AddZapchast1:=nil;
неработает. Первое нажатие кнопки ничего не исчезает, а на второе вылетает ексцептион
QQ (2004-08-12 14:28:00) [32]У меня ничего не вылетает. Какое исключение?
GuAV (2004-08-12 14:24:00) [33]
> TCustomForm.Release
TCustomForm(Self).Release; - думаю пойдёт...
GuAV (2004-08-12 14:22:00) [34]
> Что я неправильно делаю?
RTFM:
Release method (TCustomForm)
Sootvetstviya1.Release
Sootvetstviya1:=nil
jack128 (2004-08-12 14:20:00) [35]
> procedure TForm1.Sootvetstviya1SpeedButton1Click(Sender:
> TObject);
> begin
> FreeAndNil(Sootvetstviya1);
> end;
так делать нельзя. Посмотри как реализован TCustomForm.Release и сделай так же.
Alek (2004-08-12 14:18:00) [36]Вот Так я создаю фрейм:
If not Assigned(Sootvetstviya1) then Sootvetstviya1:=TSootvetstviya.Create(Application);
Sootvetstviya1.Parent:=Panel2;
Sootvetstviya1.Left:=8;
Sootvetstviya1.Top:=8;
Вешаю ему обработчик нажатия на кнопку
Sootvetstviya1.SpeedButton1.OnClick:=Sootvetstviya1SpeedButton1Click;
Вот сам обработчик:
procedure TForm1.Sootvetstviya1SpeedButton1Click(Sender: TObject);
begin
FreeAndNil(Sootvetstviya1);
end;
Когда он срабатывает ты вылетает исключение, но фрейм удаляется.
Что я неправильно делаю?
GuAV (2004-08-12 14:06:00) [37]Точно так же как работать с другими компонентами во время выполнения программы. Создаёшь, задаеш Parent...