Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.29;
Скачать: CL | DM;

Вниз

Про работу с фреймами   Найти похожие ветки 

 
Alek ©   (2004-08-12 14:02) [0]

Как работать с фреймами во время выполнения программы?
Создавать и удалять?


 
GuAV ©   (2004-08-12 14:06) [1]

Точно так же как работать с другими компонентами во время выполнения программы. Создаёшь, задаеш Parent...


 
Alek ©   (2004-08-12 14:18) [2]

Вот Так я создаю фрейм:

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;

Когда он срабатывает ты вылетает исключение, но фрейм удаляется.
Что я неправильно делаю?


 
jack128 ©   (2004-08-12 14:20) [3]


> procedure TForm1.Sootvetstviya1SpeedButton1Click(Sender:
> TObject);
> begin
> FreeAndNil(Sootvetstviya1);
> end;
так делать нельзя. Посмотри как реализован TCustomForm.Release и сделай так же.


 
GuAV ©   (2004-08-12 14:22) [4]


> Что я неправильно делаю?

RTFM:
Release method (TCustomForm)

Sootvetstviya1.Release
Sootvetstviya1:=nil


 
GuAV ©   (2004-08-12 14:24) [5]


> TCustomForm.Release

TCustomForm(Self).Release; - думаю пойдёт...


 
QQ ©   (2004-08-12 14:28) [6]

У меня ничего не вылетает. Какое исключение?


 
Alek ©   (2004-08-12 14:31) [7]

PostMessage(AddZapchast1.Handle, CM_RELEASE, 0, 0);
AddZapchast1:=nil;

неработает. Первое нажатие кнопки ничего не исчезает, а на второе вылетает ексцептион


 
Alek ©   (2004-08-12 14:32) [8]

FreeAndNil(Sootvetstviya1); - вот если я вешаю это на кнопку которая не принадлежит Sootvetstviya1, то все нормлаьно освободжлдается, а если кнопка пренадлежит Sootvetstviya1 то вылетает исключение и фрейм освобождается


 
GuAV ©   (2004-08-12 14:36) [9]

Мне когда-то нужно было чтоб кнопка убивала себя... выкрутился через postmessage wm_user+x главой форме.


 
QQ ©   (2004-08-12 14:38) [10]

И вообще это неправильный путь. Коли уж создаём фрейм рантайм, то указывайте как овнера форму, где она лежит. Owner это как раз и есть класс, ответственный за освобождение памяти вашего фрейма (или чего-то там еще). Т. е. нужно писать:
If not Assigned(Sootvetstviya1) then
Sootvetstviya1:=TSootvetstviya.Create(Form1);

где вместо Form1 - имя формы, где этот  фрейм лежит. Тогда и освобождать ничего в ручную не придётся.


 
GuAV ©   (2004-08-12 14:42) [11]

GuAV ©   (12.08.04 14:36) [9]
Это в смысле PostMessage надо делать той форме, где обработчик, т.е. в к-рую вставлен Frame. А Sootvetstviya1 - передавать например в lParam


 
QQ ©   (2004-08-12 14:42) [12]

а ты проверь-ка после FreeAndNil(Sootvetstviya1);
у тебя есть какой-нить код в этом обработчике нажатия на кнопку?
;)


 
QQ ©   (2004-08-12 14:46) [13]

И вообще, как Вы так пишите??
должно быть:   FreeAndNil(Self);
если речь об освобождении собственной памяти у фрейма.


 
QQ ©   (2004-08-12 14:55) [14]

а вообще - GuAV прав - требуется написать обработчик сообщения в форме, который будет делать FreeAndNil(Sootvetstviya1);


 
GuAV ©   (2004-08-12 15:05) [15]

Я бы лучше в обработчике делал TObject(Message.lParam).Free; а :=nil после того постмесаге:

procedure TForm1.FreeandNilFrame(var Frame: TFrame);
begin
 PostMessage(Self.Handle,WM_MYFREE,0,LPARAM(Frame));
 Frame:=nil;
end;


 
jack128 ©   (2004-08-12 17:14) [16]


> 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 18:36) [17]


> технически правильный подход, но лудше реализовать эту функциональность
> в самом фрейме.

TForm(Frame).Release; ?

> Я в свое время задовался вопросом - почему метод Release
> ввели только для CustomForm, а не для WinControl"ов..

И почему же ?
<off>
Чем кстати про конструктор как обычный метод закончилось ?
</off>


 
QQ ©   (2004-08-12 18:46) [18]

> GuAV  [17]
> TForm(Frame).Release; ?

не работает


 
GuAV ©   (2004-08-12 19:06) [19]

QQ ©   (12.08.04 18:46) [18]
Так к чему я это:
jack128 ©   (12.08.04 17:14) [16]

> реализовать эту функциональность в самом фрейме.

В данном случае не получается.


 
jack128 ©   (2004-08-12 19:09) [20]


> > GuAV  [17]
> > TForm(Frame).Release; ?
> не работает


> В данном случае не получается


Я имел ввиду вот так:
TMyCoolFrame = class(TFrame)
private
 procedure CmRelease(var Message: TMessage); message CM_RELEASE;
end;

procedure TMyCoolFrame.CmRelease(var Message: TMessage);
begin
 Free;
end;

procedure TMyCoolFrame.Release;
begin
 PostMessage(Handle, CM_RELEASE, 0, 0);
end;
> <off>
> Чем кстати про конструктор как обычный метод закончилось
> </off>
А ничем. Вопрос не вызвал интузиазма среди общественности.. Ну фиг с ним. По большому счету мне все равно - вопрос был риторическим.. Хотя ты, помнится хотел в борланд по этому счету написать ;-)


 
GuAV ©   (2004-08-12 21:07) [21]


>  Хотя ты, помнится хотел в борланд по этому счету написать
> ;-)

Я думал, что выяснили. Ладно, в MS писал, и этим напишу.


 
GuAV ©   (2004-08-12 22:11) [22]


> Я имел ввиду вот так:
> TMyCoolFrame = class(TFrame)
> private
>  procedure CmRelease(var Message: TMessage); message CM_RELEASE;
> end;
>
> procedure TMyCoolFrame.CmRelease(var Message: TMessage);
> begin
>  Free;
> end;

и чем это отличается от TForm(Frame).Release ?
дело как мне предсавляется в том, что обработчик кнопки в форме а не в фрейме и соотв. postmessage надо туда же [15].


 
jack128 ©   (2004-08-12 22:24) [23]


> и чем это отличается от TForm(Frame).Release ?
тем что у TFrame нету метода Release, а TMyCoolFrame есть ;-)


 
GuAV ©   (2004-08-12 22:30) [24]


> TFrame нету метода Release

Блин, я почему то думал, что TCustomFrame наследник TCustomForm...


 
jack128 ©   (2004-08-12 22:31) [25]

попробуй сам - если ты в фрейме обработаешь CM_RELEASE, то твой код
> TForm(Frame).Release
заработает ;-)


 
GuAV ©   (2004-08-13 01:45) [26]


> заработает ;-)

Охотно верю, он для любого TWinControla заработает, полей то нет :)


 
GrayFace ©   (2004-08-13 11:20) [27]

А как убить объект из самого себя, не имея окна?


 
KSergey ©   (2004-08-13 11:26) [28]

Уничтожение объектом самого себя - глупость изначально.
Уничтожать должен тот, кто создал. Только так.
То, что это сделано для форм причем внутри их же - ну просто так вот.
Хотя, метод Release в принципе сделать не трудно для любого компонента, только в нем фактически "просить" уничтожить себя другой объект. Какой - и как не важно, много можно насочинять. При этом реальное уничтожение должно происходить вне какого-либо метода уничтожаемого объекта. Что понятно.


 
GuAV ©   (2004-08-13 14:51) [29]

KSergey ©   (13.08.04 11:26) [28]

> Уничтожение объектом самого себя - глупость изначально.

Free + (Ctrl+Мыша)

>  только в нем фактически "просить" уничтожить себя другой
> объект.

Нифига подобного - в CM_RELEASE Написано Free.

>  Что понятно

Что бред.
GrayFace ©   (13.08.04 11:20) [27]

> А как убить объект из самого себя, не имея окна?

При чём тут окно? Его имеют далеко не все объекты, и даже не все компоненты. Убить из себя - Free.

---
Учите исходники Дельфи, ребята...


 
KSergey ©   (2004-08-13 15:36) [30]

> [29] GuAV ©   (13.08.04 14:51)
> > Уничтожение объектом самого себя - глупость изначально.
> Free + (Ctrl+Мыша)

Блин, ну не совсем корректно написал
Имелось в виду, конечно же - убиение себя (вызов Free) из своего же метода.
Да, да, я понимаю, что есть CM_RELEASE, более того, оно работает.

Но предлагаю считать его все же - исключением! Причем - недостойным подражания.


 
GuAV ©   (2004-08-13 16:25) [31]


> Но предлагаю считать его все же - исключением! Причем -
> недостойным подражания.

Отвергаю это предложение. Автор ветки хотел таки уничтожить объект из себя и он прав.
Объект нельзя уничтожать из себя, когда после уничтожения использованы свойства и методы требующие наличие объекта, а также поля объекта. Например:
1) Когда после уничтожения будут выполнятся события. В событиях ничего не подозревающий кодер может использовать свойства и методы требующие наличие объекта.
2) -//- сообщения. В обработчиках этих сообщений могут использаться свойства и методы требующие наличие объекта, а также поля объекта.
3) Когда присутсвует "непосредственное" обращение к полю/методу/св-ву объекта после его уничтожения, т. е. в одной из процедур, находящейся в "call stack". 1 - частный случай этого.
4) Внутри событий. Если не оговорено, то не гарантируется отсутствие вышеозначенных пунктов.

Однако, если после уничтожения не использованы использованы свойства и методы требующие наличие объекта, а также поля объекта, то уничтожать объект можно.

Автору ветки: не слушай KSergey и GrayFace, слушай jack128 и меня :)


 
KSergey ©   (2004-08-13 21:55) [32]

> GuAV ©   (13.08.04 16:25) [31]

Следуя этому совету имеем:

1.Необходимость каждый раз крепко копать код VCL. Ну, в принципе полезно, конечно.
2.В случае чего- огребаем плавающие баги.

Вам мало проблем без этого? ;)
Хотя, конечно, кому как проще.


 
GuAV ©   (2004-08-13 22:01) [33]


> 1.Необходимость каждый раз крепко копать код VCL. Ну, в
> принципе полезно, конечно.
> 2.В случае чего- огребаем плавающие баги.

Нифига подобного. PostMessage+Free - и никаких проблем. А в VCL заглянули, чтобы эту идею спионерить из release. И только. А вообще это полезно, конечно.


 
KSergey ©   (2004-08-14 08:39) [34]

> [33] GuAV ©   (13.08.04 22:01)
> PostMessage

Хорошо, когда его есть кому запруздырить ;)
Но все равно в кахдом сулчае подход будет индивидуален...

Короче я не спорю, что делать так можно. Речь веду о том - нужно ли?


 
GuAV ©   (2004-08-14 13:52) [35]


> Речь веду о том - нужно ли?

Это самый простой путь решения данной проблемы.
В конце-то концов, ну "попросишь кого-то" прибить объект. Он убъёт и передаст управление вызывавшей процедуре. Т.е. всё равно объект убъёт себя из себя. Без постмессаге тут всё равно не обойтись.

> Но все равно в кахдом сулчае подход будет индивидуален...

Называй другие случаи - разберёмся.


 
KSergey ©   (2004-08-14 14:09) [36]

> [35] GuAV ©   (14.08.04 13:52)
> Это самый простой путь решения данной проблемы.
> В конце-то концов, ну "попросишь кого-то" прибить объект.
> Он убъёт и передаст управление вызывавшей процедуре. Т.е.
> всё равно объект убъёт себя из себя. Без постмессаге тут
> всё равно не обойтись.

Разумеется не обойтись!
Под "попросить" я имел в виду "вежливо", т.е. не буквально сразу ;) Именно что вне какого либо метода уничтожаемого объекта вызвать деструктор.

> Называй другие случаи - разберёмся.

Лень фантазировать. ;)
Разобраться, думаю, можно почти всегда (в смысле найти решение буквально желаемой штуки), однако, по-моему, в этом нет особого смысла.
Впрочем, я просто предостерегаю в том смысле, что в лоб может не получится. Но если хочется - да сколько угодно! ;)


 
GrayFace ©   (2004-08-15 11:05) [37]

GrayFace ©   (13.08.04 11:20) [27]
> Уничтожение объектом самого себя - глупость
>изначально.
> Уничтожать должен тот, кто создал. Только так.

Создает статический метод класса, а сам объект слушает у каогт-то контрола сообщения и на wm_destroy должен убиваться.



Страницы: 1 вся ветка

Текущий архив: 2004.08.29;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.046 c
14-1091636339
Fay
2004-08-04 20:18
2004.08.29
Полный RULEZZ!


1-1092590461
hawkins
2004-08-15 21:21
2004.08.29
У меня проблема с MDI окном...


1-1091895346
Sourse
2004-08-07 20:15
2004.08.29
Как открыть файл с помощью моей программы


6-1086003426
Maxuz
2004-05-31 15:37
2004.08.29
TClientSocket


1-1092570397
mOOx
2004-08-15 15:46
2004.08.29
Выделение цветом в ListView