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

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

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

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

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

Сообщение qivi »

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

Фрейм натягиваю на окно вот так:

Код: Выделить всё

Form02.Caption:='Заголовок окна';
fr01:=Tds.Create(self);
fr01.Align:=alClient;
fr01.Parent:=self;


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

Код: Выделить всё

FreeAndNil(Form02.fr01); // Уничтожаем фрейм
Form02.FrameAktiv2(Sender); // Активируем фрейм2


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

Код: Выделить всё

FreeAndNil(Form02.fr01);

не пойдёт, точнее обращение должно быть либо к той либо к другой форме, но по какому признаку ставить условие?
Аватара пользователя
AbakAngelSoft
постоялец
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар
Контактная информация:

Сообщение AbakAngelSoft »

Приведите Ваш код подробнее - не видно в чем проблема.
Если fr01 - поле формы тогда у каждой формы свой фрейм

Код: Выделить всё

Form01.fr1
Form02.fr1
Аватара пользователя
FedeX
постоялец
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение FedeX »

Немного не понятно в чём именно проблема... Не понятна фраза "общему для двух форм фрейму". Это как? Это же два абсолютно разных экземпляра одного класса? Или у вас это один объект, который скачет между двумя формами? 0_о Если есть два экземпляра класса фрейма Tds, то и уничтожать их (и вообще обращаться к ним) надо по соответствующим ссылкам. Кстати по этой причине в коде модулей с фреймами не стоит использовать глобальных переменных (их вообще лучше не использовать).
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

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

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

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

Сообщение FedeX »

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

Сообщение qivi »

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


Да, я вроде это самое и делаю... но команда уничтожения фрейма находится в модуле самого фрейма и выглядит:

Код: Выделить всё

FreeAndNil(Form02.fr01);

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

Код: Выделить всё

FreeAndNil(Form03.fr11);

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

Не знаю как лучще объяснить... после работы, дома, навояю пример выложу...
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

Команда на уничтожение фрейма должна быть внутри метода формы. Примерно так:

Код: Выделить всё

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

Добавлено спустя 5 минут 18 секунд:
Если команда на уничтожение исходит из фрейма, то используй свойство Parent - это ссылка на родительскую форму.
Типа такого:

Код: Выделить всё

FreeAndNil(Parent.MyFrame);
Тогда, даже не зная, в какой форме все происходит, ты гарантированно убьешь фрейм именно там. Соответственно, у фрейма парент может быть nil, это надо проверять в коде.
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

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

Что это значит? Как и зачем это проверять?
Аватара пользователя
FedeX
постоялец
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение FedeX »

Вообще будет очень идеологически правильно если комманды уничтожения соответствующих фреймов будут находиться в коде классов форм создавших их. Чтобы сделать так как предлагает Climber надо чтобы формы были унаследованы от одного класса с полем MyFrame.
qivi почитай про ООП :wink:
пс: немного не та тема форума
Аватара пользователя
AbakAngelSoft
постоялец
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар
Контактная информация:

Сообщение AbakAngelSoft »

qivi
Заведи тему - я кажется понял твою проблему, но здесь отвечать не буду - захламим интересное обсуждение.
Ответить