Использование фреймов в Delphi для скрытия информации графического интерфейса
-
19-09-2019 - |
Вопрос
Я изучаю Delphi в течение последних 3 лет на уровне хобби / профессии.Я рад сказать, что сейчас я продвинулся до такой степени, что могу оглядываться на свой ранний код с ужасом и смущением.Итак, сейчас я просматриваю некоторые из моих ранних приложений и переписываю / рефакторирую их.
Одна из вредных привычек, от которой я пытаюсь избавиться, - это доступ к компонентам одной формы из другого модуля.Пытаясь добиться этого, я экспериментировал с использованием фреймов как метода сокрытия информации.Таким образом, вместо того, чтобы иметь форму с компонентами в ней, я создаю фрейм для хранения всех компонентов формы, затем помещаю фрейм в форму, перемещая объявление фрейма в частные объявления,
type
TMyForm = class(TForm)
private
MyFrame: TMyFrame;
procedure SetTimeDate(const Value: TMyItem);
function ReadTimeDate:TMyItem ;
затем регистрируем фрейм в разделе инициализации формы
initialization
begin
RegisterClasses([TMyFrame])
Затем я объявляю нужные мне свойства в общедоступном разделе блока формы, который имеет доступ к фрейму и его компонентам.
public
property TimeDate: TOverlayItem read ReadTimeDate write SetTimeDate;
Я также использую фреймы для консолидации часто повторяющихся групп компонентов.
Кажется, это работает для тех целей, которые я хочу (скрывая Myframe и его компоненты), но есть ли у кого-нибудь еще опыт использования этого метода?
Есть ли какие-либо недостатки при использовании фреймов?Получаю ли я на самом деле какую-либо выгоду от этого?Есть ли какие-либо проблемы с использованием вложенных фреймов внутри фреймов?Существуют ли какие-либо практические руководства по использованию фреймов в Delphi?Существуют ли лучшие / более простые способы достижения того же эффекта в отношении скрытия информации GUI в Delphi?
HMcG
Решение
Похоже, у вас все еще много логики в вашем пользовательском интерфейсе.Формы / панели не должны иметь такого большого значения свойств (за исключением, возможно, диалоговых окон).
Если вам нужно больше структуры, чем читайте о шаблоне MVC.
Сказав все это, фреймы могут быть хорошим способом организации графического интерфейса.Как и во всем остальном, не злоупотребляйте.
Другие советы
Мне вообще нравится frame для создания сложных многоразовых битов.По большей части я думаю, что они могут быть действительно чистым способом создания экранов.Однако, как уже упоминалось Хенк Холтерман ваши экраны и фреймы должны содержать только логику, относящуюся к функционированию пользовательского интерфейса, и быть как можно более несведущими в бизнес-логике.
Пара моментов изменение фреймов и информации скрывающейся в пользовательском интерфейсе:
- Как обсуждалось в другом вопросе о StackOverflow вам нужно быть осторожным при использовании обработчиков событий в вашем фрейме.
- Фреймы по-прежнему имеют множество опубликованных свойств и на самом деле не решают проблему того, что формы могут ненадлежащим образом манипулировать битами друг друга.Даже если вы этого не сделаете, если код разрешает это, кто-нибудь в конечном итоге напишет код, который вмешивается там, где не должен.Я всегда удаляю глобальную переменную формы, с помощью которой Delphi загрязняет код, и часто пишу объекты-оболочки или реализую интерфейсы, которые обеспечивают контролируемый доступ к пользовательскому интерфейсу.
Итак, вместо того, чтобы иметь такой код, как этот:
ClientForm := TClientViewForm.Create(Self);
try
ClientForm.Client := MyClient;
ClientForm.ShowModal;
finally
ClientForm.Free;
end;
Обычно я заставляю людей писать что-то в этом роде:
ClientViewer := TClientViewer.Create(MyClient);
try
ClientViewer.Show;
finally
ClientViewer.Free;
end;
или даже
TClientViewer.ShowClient(MyClient);
и пусть метод класса ShowClient обработает бит, показанный в первом списке.Таким образом, вызывающий код никогда не получает указатель формы и не может коснуться каких-либо битов, которые не предоставлены специально классом-оболочкой.