использование фреймов

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

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

использование фреймов

Сообщение qivi » 08.02.2010 01:45:25

А вот такая ситуация... (пытаюсь не использовать модальость окон)
Использую формы, а на них натягиваю фреймы (так чтоб не открывать новое окно а всё делать в одном).

Фрейм натягиваю на окно вот так:
Код: Выделить всё
Form02.Caption:='Заголовок окна';
fr01:=Tds.Create(self);
fr01.Align:=alClient;
fr01.Parent:=self;


Открытие следующего фрейма на эту же форму будет выглядеть допустим так:

Код: Выделить всё
FreeAndNil(Form02.fr01); // Уничтожаем фрейм
Form02.FrameAktiv2(Sender); // Активируем фрейм2


То есть сперва уничтожаю текущий фрейм на Form02, а потом запускаю процедуру из модуля той же Form02 для активации второго фрейма. Всё бы ничего но при отказе от модальности необходимо (для других функций) завести другое окно (ещё одну не модальную форму) и на неё аналогичным образом натягивать фреймы, однако среди них есть общие (тока надписи меняются)... и тут у меня возникает проблема (не могу придумать реализацию):
как общему для двух форм фрейму, "объяснить" на какой форме он должен себя уничтожить?!! Ведь если окна не модальные они могут быть открыты оба одновременно и тогда прямое обращение к форме типа:
Код: Выделить всё
FreeAndNil(Form02.fr01);

не пойдёт, точнее обращение должно быть либо к той либо к другой форме, но по какому признаку ставить условие?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Пользовательский интерфейс. Обмен опытом.

Сообщение AbakAngelSoft » 08.02.2010 10:24:10

Приведите Ваш код подробнее - не видно в чем проблема.
Если fr01 - поле формы тогда у каждой формы свой фрейм
Код: Выделить всё
Form01.fr1
Form02.fr1
Аватара пользователя
AbakAngelSoft
постоялец
 
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар

Re: Пользовательский интерфейс. Обмен опытом.

Сообщение FedeX » 08.02.2010 10:26:46

Немного не понятно в чём именно проблема... Не понятна фраза "общему для двух форм фрейму". Это как? Это же два абсолютно разных экземпляра одного класса? Или у вас это один объект, который скачет между двумя формами? 0_о Если есть два экземпляра класса фрейма Tds, то и уничтожать их (и вообще обращаться к ним) надо по соответствующим ссылкам. Кстати по этой причине в коде модулей с фреймами не стоит использовать глобальных переменных (их вообще лучше не использовать).
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Пользовательский интерфейс. Обмен опытом.

Сообщение qivi » 08.02.2010 14:11:34

FedeX, я собственно по твоим научениям вояю, может пока ещё чего не знаю...

Я создал набор фреймов и пустые окна, на эти пустые окна натягиваю фреймы... есть фрейм который используется для 4 функций 2 на одном окне 2 на другом (меняются только надписи и процедура обработки подтверждения действия с кучей условий). Теперь ситуация, я подтверждаю действие, либо отменяю, следовательно фрейм должен уничтожить себя на этом окне (не перепутать со вторым окном и не уничтожить на обоих) и вызвать процедуру открытия предшествующего фрейма, которая, в моём случае, находится в модуле окна. Если абстрагироваться от моего кода, как это можно реализовать?

Если я не отказываюсь от модальности, то у меня одно окно убирается, все фреймы натягиваются на одно оставшееся окно, таким образом вероятность того, что один и тот же фрейм единовременно открыт на 2 формах то же исчезает... всё просто и лаконично.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Пользовательский интерфейс. Обмен опытом.

Сообщение FedeX » 08.02.2010 16:34:16

Не совсем понятно что ты там делаешь с фреймами, но похоже что-то страшное. В любом случае тебе надо создавать два экземпляра одного фрейма, ложить их на разные формы в разные переменные и отдельно с ними работать.
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Пользовательский интерфейс. Обмен опытом.

Сообщение qivi » 08.02.2010 17:03:29

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


Да, я вроде это самое и делаю... но команда уничтожения фрейма находится в модуле самого фрейма и выглядит:
Код: Выделить всё
FreeAndNil(Form02.fr01);

то есть обращается через модуль формы, ведь именно там была объявлена fr01.
Допустим команда для уничтожения фрейма на второй форме будет иметь вид:
Код: Выделить всё
FreeAndNil(Form03.fr11);

но она будет так же находится в модуле этого же фрейма... как определить какую из них выполнить...

Не знаю как лучще объяснить... после работы, дома, навояю пример выложу...
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Пользовательский интерфейс. Обмен опытом.

Сообщение Climber » 08.02.2010 17:58:14

Команда на уничтожение фрейма должна быть внутри метода формы. Примерно так:
Код: Выделить всё
procedure MyForm.DestroyFrame;
begin
  FreeAndNil(MyFrame);
end;
Тогда точно не перепутаешь. Тогда каждая форма сама будет уничтожать свой фрейм.

Добавлено спустя 5 минут 18 секунд:
Если команда на уничтожение исходит из фрейма, то используй свойство Parent - это ссылка на родительскую форму.
Типа такого:
Код: Выделить всё
FreeAndNil(Parent.MyFrame);
Тогда, даже не зная, в какой форме все происходит, ты гарантированно убьешь фрейм именно там. Соответственно, у фрейма парент может быть nil, это надо проверять в коде.
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Пользовательский интерфейс. Обмен опытом.

Сообщение qivi » 08.02.2010 18:38:56

Соответственно, у фрейма парент может быть nil, это надо проверять в коде.

Что это значит? Как и зачем это проверять?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Пользовательский интерфейс. Обмен опытом.

Сообщение FedeX » 08.02.2010 19:00:57

Вообще будет очень идеологически правильно если комманды уничтожения соответствующих фреймов будут находиться в коде классов форм создавших их. Чтобы сделать так как предлагает Climber надо чтобы формы были унаследованы от одного класса с полем MyFrame.
qivi почитай про ООП :wink:
пс: немного не та тема форума
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Пользовательский интерфейс. Обмен опытом.

Сообщение AbakAngelSoft » 09.02.2010 10:44:08

qivi
Заведи тему - я кажется понял твою проблему, но здесь отвечать не буду - захламим интересное обсуждение.
Аватара пользователя
AbakAngelSoft
постоялец
 
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар


Вернуться в Lazarus

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

Сейчас этот форум просматривают: MailRu[bot] и гости: 45

Рейтинг@Mail.ru