Показать сообщение отдельно
  #2  
Старый 25.06.2006, 01:24
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
Стрелка ->

1] Фреймы в Delphi

'Frames' - на мой взгляд чрезвычайно полезная компонента. Если откинуть условности, то это форма в форме. Грубо говоря, можно наделать таких форм и менять, например, функциональность и вид Вашей программы в зависимости от определенных условий(Это не то-же, что менять кожу - не перепутайте.).

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

Вообщем так. Через меню 'File/New/Frame' создаем фрейм - появляется до боли знакомое окно форы, с разве что немного другими свойствами. Далее можно делать на нем все, что угодно. Однако, не забываем, что пока создан всего сам фрейм и он у нас ни к чему не привязан. И тут нужен второй шаг - теперь берем компоненту и ложем ее на форму Вашего основного проекта. Сразу появляется окно выбора фрейма- 'Select frame to insert'. Причем, если Вы наделали, несколько фреймов, то, соответственно, Вам их все и предложат.

Итак, из всего вышесказанного можно подчеркнуть лишь одно - прежде чем пользоваться компонентой Frame нужно создать сам фрейм.

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

Еще одна полезность этой компонеты в том, что она позволяет организовать скролл(как вертикальный, так и горизонтальный) для целого набора инструментов. Т.е. если Вам необходимо разместить на форме очень много всего, а места не хватает, то фрейм - идеальное решение. Примером может служить настройка сортировщика писем в известной почтовой программе 'TheBat'.



2]Object Inspector. Потеря обработчиков событий компонентов фрейма

Создаем фрейм, содержащий контролы, которые имеют собственные обработчики событий. При помещении на форму таких фреймов нужно быть с ними очень осторожными в design-time. Достаточно случайно "войти" в процедуру обработки такого события для компонента фрейма, чтобы IDE автоматически сформировала обработчик этого события для формы, а не для фрейма. После этого, при удалении этого обработчика, обработчик "задетого" события во фрейме полностью игнорируется.

"Камушек" кроется в том, что IDE при удалении обработчика из ObjectInspector не вытирает упоминание о нем из файла *.dfm, а просто присваивает ему там nil!

Для иллюстрации "камня" приводится тестовый проект. На форме лежат два совершенно одинаковых фрейма, исходный код и OI показывают, что эти фреймы абсолютно идентичны, но(!) один из них отрабатывает нажатие на кнопку, а второй полностью его игнорирует.

Источник беды виден в файле формы *.dfm (View as text) :

....
inline frClick1: TfrClick
Left = 5
Top = 32
end
inline frClick2: TfrClick
Left = 6
Top = 128
TabOrder = 1
inherited BitBtn1: TBitBtn
OnClick = nil
end
end
....

ТИПОВЫЕ РЕШЕНИЯ


Стараться не щелкать без надобности по OI;
Если такое случилось, проверить и откорректировать файл *.dfm , удаляя ненужное описание обработчика (в тестовом примере это строка "OnClick = nil")
Скачать тест http://delphi.mtu-net.ru/zip/stonetest_26.zip (1.8K)

КОММЕНТАРИЙ:

Еще один метод борьбы заключается в правильном способе удаления ненужного обработчика. Ведь нам нужно вообще удалить нечаянно созданный обработчик события с формы, не так ли? Очистка события в OI только отключает процедуру от компонента, не удаляя ее из кода модуля. И правильно делает - она могла быть задействована где-то еще.

Если действовать "по всем правилам искусства", как рекомендуют классики, то надо очистить тело процедуры обработчика от кода между begin и end, а затем просто сохранить файл (F2 в классической раскладке). IDE Delphi при сохранении файла очищает форму от пустых обработчиков, и делает это корректно (все в точности возвращается назад).

Так что, может быть, это не глюк, а фича такая: "OnClick = nil" - способ отключить унаследованный от фрейма обработчик, не прибегая к коду.


Взято с DelphiWorld. : http://www.delphiworld.narod.ru



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


P>S> По себе знаю - обычно пишут вопрос не полностью потому, что боятся что стырят идею.... Если это так то можно и абстрактно..
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.
Ответить с цитированием