Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.032 c
8-1086155323
Vitas2
2004-06-02 09:48
2004.08.29
mp3


1-1092401649
Nata
2004-08-13 16:54
2004.08.29
Файлы


14-1092203014
peypivo
2004-08-11 09:43
2004.08.29
И как после такого руки не отсыхают?


14-1092315003
Кириешки
2004-08-12 16:50
2004.08.29
У кого Opera стоит?


3-1091623615
stud
2004-08-04 16:46
2004.08.29
преобразования типов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский