Использование фреймов в Delphi для скрытия информации графического интерфейса

StackOverflow https://stackoverflow.com/questions/1171127

Вопрос

Я изучаю 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 для создания сложных многоразовых битов.По большей части я думаю, что они могут быть действительно чистым способом создания экранов.Однако, как уже упоминалось Хенк Холтерман ваши экраны и фреймы должны содержать только логику, относящуюся к функционированию пользовательского интерфейса, и быть как можно более несведущими в бизнес-логике.

Пара моментов изменение фреймов и информации скрывающейся в пользовательском интерфейсе:

  1. Как обсуждалось в другом вопросе о StackOverflow вам нужно быть осторожным при использовании обработчиков событий в вашем фрейме.
  2. Фреймы по-прежнему имеют множество опубликованных свойств и на самом деле не решают проблему того, что формы могут ненадлежащим образом манипулировать битами друг друга.Даже если вы этого не сделаете, если код разрешает это, кто-нибудь в конечном итоге напишет код, который вмешивается там, где не должен.Я всегда удаляю глобальную переменную формы, с помощью которой 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 обработает бит, показанный в первом списке.Таким образом, вызывающий код никогда не получает указатель формы и не может коснуться каких-либо битов, которые не предоставлены специально классом-оболочкой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top