Delphi – изучение навыков:
{№ 1}
Предложения для создания модальных форм:
класс PROcedure TMyForm.RunForm(AObj1, AObj2: TObject);
вар
vForm: TMyForm;
начинать
vForm:= TMyForm.Create(приложение);
с vForm сделать
Пытаться
InitForm(AObj1, AObj2);
ПоказатьМодал;
Окончательно
Бесплатно;
конец;
конец;
//*проиллюстрируем:
Функции, объявленные через класс, аналогичны статическим функциям в операторе использования VC: TMyForm.RunForm(vObj1, vObj2);
Для получения другой конкретной информации обратитесь к: описанию класса в справке Delphi.
Целью подчеркивания этой идиомы является:
1. Если эта форма используется в нескольких местах, вы можете гарантировать, что этот код будет вызываться единообразно;
2. Если функция изменена, например: обработка на основе возвращаемого значения ShowModal, то измените только эту функцию.
3. Программа имеет хорошую инкапсуляцию, проста в обслуживании и работе. *//
{№ 2}//Использование тега
Ответ на события кнопки панели инструментов формы
процедура TMyForm.RunOperate(ATag: Integer);
начинать
Случай ATag
1: MyButton.Color := clRed;
2: MyButton.Color := clGreen;
3: MyButton.Color := clBlack;
конец;
конец;
процедура TMyForm.ToolBtnClick(Отправитель: TObject);
начинать
RunOperate(TControl(Sender).Tag);
конец;
Если вы находитесь в раскрывающемся меню и вам необходимо выполнить аналогичные функции,
процедура TMyForm.MenuItemClick(Отправитель: TObject);
начинать
RunOperate(TMenuItem(Sender).Tag);
конец;
//*проиллюстрируем:
1. Четкая структура
2. Соответствующая информация сконцентрирована, что упрощает ее проверку, изменение и обслуживание.
3. Улучшить адаптивность и масштабируемость программы, например, если требование не реализовано в кнопке панели инструментов, а реализовано в других кнопках, его будет легко изменить;
Предложение: за каждой категорией следует только одна строка или несколько строк кода. Если кода много, используйте вместо него функцию процесса.
Еще интереснее то, что я часто пишу следующее:
Случай btnMyButton.Visible из
{показать} Верно: ...
{Не показывать} Ложь: ...
конец; *//
{ № 3 }//Указатель события как параметр
//Используем указатель события для чтения списков и т. д.
тип
TDataSetEvent = процедура (DataSet: TDataSet; AIndex, ACount: Integer) объекта;
//Классы, производные от TADOQuery
процедура TMyADOQuery.EnumRecord(AWhereStr: String; APro: TDataSetEvent);
начинать
Закрывать;
SQL.Очистить;
SQL.Add('Выбрать * из таблицы1');
если AWhereStr <> '' тогда
SQL.Add('Где' + AWhereStr);
Открыть;
Пока не Eof Do
начинать
если назначено(APro), то APro(Self, RecNo, RecordCount);
Следующий;
конец;
Закрывать;
конец;
//*проиллюстрируем:
Этот метод происходит из функции API в Window для перечисления всех текущих дочерних окон, EnumChildWindow.
1. Принцип: Старайтесь отделить чтение данных от их отображения, обработки данных и т. д., например: MVC и т. д. предназначены для этой цели;
2. Повышена масштабируемость программы. Если вы изначально хотели отобразить или обработать определенный столбец информации в списке, но позже перешли на использование ComboBox, то при модификации программы вам не нужно читать часть чтения данных. , вам нужно только изменить отображение информации и т. д. Другой пример: теперь вам необходимо использовать индикатор выполнения для отображения хода чтения при чтении записей.
*//
{ № 4 } //Постоянный массив
{В №2 реализован следующий контент
процедура TMyForm.RunOperate(ATag: Integer);
начинать
Случай ATag
1: MyButton.Color := clRed;
2: MyButton.Color := clGreen;
3: MyButton.Color := clBlack;
конец;
конец;
}
//Тогда было бы идеально реализовать это с помощью массива.
процедура TMyForm.RunOperate(ATag: Integer);
константа
MyButtonColorMax := 3;
MyButtonColor: массив [1..MyButtonColorMax] из TColor = (clRed, clGreen, clBlack);
начинать
Случай ATag
1..MyButtonColorMax: MyButton.Color := MyButtonColor[ATAg];
101:....
конец;
конец;
//*проиллюстрируем:
При использовании в режиме массива просто обратите внимание, что верхний или нижний предел массива реализуется с использованием констант, а затем попробуйте использовать эту константу для чтения цикла массива в будущем.
*//
{No 5}Механизм сообщений сокращает общедоступные функции класса.
//Как минимизировать определение публичных функций в форме;
{Например: если вы хотите реализовать форму списка свойств текущего элемента управления формой, когда вам нужно обновить форму свойства; изменить значение определенного свойства; добавить новые свойства и т. д.; с этим нужно взаимодействовать. Если мы используем публичные функции класса, нам нужно определить множество публичных функций. При этом, если требуется преобразование типа формы, использовать публичные функции можно только после преобразования к целевому типу формы. Поэтому будут ситуации, когда двум юнитам необходимо будет включить друг друга}
//Решение:
TfrmMyForm = класс (TForm)
ФфрмСвойство: ТФорм;
конец;
...
FfrmProperty:= TfrmProperty.MyCreate(Application, Self);
...
//Когда окно свойств необходимо обновить
FfrmProperty.Perform(WD_REFRESHPROPERTYLIST, 0, 0);
TfrmProperty = класс (TForm)
частный
ФМиФорм: ТФорм;
процедура WDREFRESHPROPERTYLIST (сообщение var: TMessage); сообщение WD_REFRESHPROPERTYLIST;
общественный
конструктор MyCreate (Владелец: TComponent; AForm: TForm);
конец;
конструктор TfrmProperty.MyCreate(Владелец: TComponent; AForm: TForm);
начинать
унаследовано Create(Owner);
FMyForm := AForm;
конец;
//* Для способа использования сообщений определение публичных функций формы можно сократить. В то же время это улучшает масштабируемость программы. Если вместо этого вы используете его форму, ее можно легко преобразовать, потому что в лучшем случае это ваша форма и не обрабатывает текущее сообщение *)//
{No 6}Используйте список регистрации для управления возможными модулями расширения.
//Проект: вам необходимо поддерживать несколько методов отображения вывода для набора данных.
...Примеры будут приведены позже
//* иллюстрируем:
1. «Несколько методов вывода» означает, что методы вывода могут часто расширяться в будущих приложениях, поэтому при разработке программы необходимо учитывать возможность легкого масштабирования методов вывода.
2. Обращаясь к механизму регистрации элементов управления (RegisterComponents) в VCL, можно обнаружить, что в VCL используется большое количество механизмов регистрации, более классическим из которых является регистрация редактора свойств элемента управления;
*//
{No.7}Использовать предопределенную версию программы управления.
//Если вы выполняете программу вторичной платформы разработки, вам необходимо включить вопросы контроля версий продукта и контроля версий проекта.
//Обычно управляется с помощью предопределенных методов
//Утверждение относительно простое:
{$DEFINE JOYYUAN97}
{$IFDEF JOYYUAN97} {ELSE} {ENDIF}
{$UNDEF JOYYUAN97}
*проиллюстрировать:
1. Разделите предопределение на несколько отдельных файлов.
2. В начале каждого модуля, но после Unit, используйте {$I ...}, чтобы включить файл в текущий модуль.
3. Управляйте файлами модуля, которые может содержать текущий модуль, на основе заранее определенных условий.
4. Попробуйте выделить для проекта предопределенный файл. После включения всех предопределенных файлов включите в этот файл некоторые предопределенные файлы, которые можно удалить в соответствии с потребностями проекта.
*//
{No 8}Используйте указатели функций, чтобы уменьшить количество включений в проект.
//Я часто думаю, что сокращение количества юнитов — это первый шаг к созданию общедоступных юнитов, поэтому как максимально уменьшить количество юнитов?
//То есть следует приложить больше усилий к тому, чтобы уменьшить связанность программных модулей.
{Описание сценария:
TMyFormManager: класс управления формами.
TMyForm: базовый класс формы данных.
TMyFormaccess: класс сохранения и чтения информации формы. Сохраните информацию о форме в базе данных или в структуре другого типа.
анализировать:
1. Базовый класс формы (TMyForm) и класс управления формами (TMyFormManager) должны быть реализованы в модуле uManagers.
2. Модуль fMyImange класса реализации формы (TMyImageForm) должен включать модуль uManagers для наследования форм и управления формами.
3. Модуль uMyAccess класса чтения данных формы (TMyFormAccess) должен включать модуль uManagers и модуль fMyImange.
вопрос:
Если я хочу сохранить форму, это следует сделать в событии кнопки формы. Что касается модуля формы, он должен содержать модуль класса доступа к данным формы, и если он помещен в базовый класс формы, модуль uManager должен содержать модуль uMyAccess.
Включение ячеек представляет собой опасность, когда доступ к данным, то есть форматы хранения данных, меняются в зависимости от требований и требуют масштабируемости.
Решение: используйте переменные указателя функции.
1. Определите переменную указателя функции в модуле uManagers для сохранения информации о данных.
2. Присвойте значение этой переменной указателя функции при инициализации приложения.
3. Когда необходимо сохранить информацию о форме, определите, не пуст ли указатель, а затем выполните функцию для сохранения информации о форме.
{Нет 9}Константы, понимайте константы, используйте константы.
Есть много книг, в которых рассказывается о важности определения констант, и я часто об этом думаю, но когда я смотрю на исходный код VCL, я понимаю, что игнорировал использование констант другими.
1. Мы часто используем следующее определение сообщения: объявить константу и затем использовать ее в подходящее время.
Обычно определяются и используются:
константа
WD_MyMessage = WM_User + 101;
тип
TMyForm = класс (TForm)
...
процедура WDMyMessage (var message: TMessage message WD_MyMessage {позиция ответного сообщения};
конец;
Однако, если вы перепишете оператор {положение ответного сообщения} как:
процедура WDMyMessage (вар сообщение: сообщение TMessage WM_User + 101);
Аналогично, компиляция может пройти успешно и использование нормально. Поэтому определения констант очень часто используются в обработке и интерфейсах оконной системы.
2. В Delphi мы определили переменные цвета clRed, clGreen и т. д., которые также являются константами для облегчения использования в будущем. Благодаря этому наблюдению я обнаружил, что определения констант должны частично использоваться повторно в проекте. Таким образом, можно определить стандартную константную единицу, чтобы определенные константы можно было повторно использовать в каждом проекте.
{No 10}Обычно используемый массив в Delphi.
В Delphi существует относительно полная реализация определения и использования массивов типа TIdentMapEntryd.
TIdentMapEntry = запись
Значение: целое число;
Имя: Строка;
конец;
1. Определение массива: array[0..ArrMax] из TIdentMapEntry.
См.: Блок управления:
Курсоры: массив [0..21] из TIdentMapEntry = (
...
);
2. Две функции, которые оценивают друг друга: IntToIdent (найти имя по значению) и IdentToInt (найти значение по имени);
Для конкретных приложений см. IdentToCursor и CursorToIdent.
3. Применение: a. Непосредственно примените этот метод определения группы деревьев и функцию манипулирования массивами. b. Узнайте, как получать доступ к массивам и манипулировать ими в этой функции; c. Изучите стандартное определение функции доступа к информации: function IntToIdent(Int: Longint; var Ident: string; const Map: array of TIdentMapEntry): Boolean; Конкретная возвращаемая информация возвращается параметрами. передается через функцию. Оценивается возвращаемое логическое значение.
{№ 11}От частных случаев к обычным открытиям.
Прослеживая функции определения и работы курсоров, я обнаружил:
1. Как указано в {№ 10}, обобщите определение и общие операции курсоров.
2. Предоставьте функции для преобразования между Int и Ident.
3. Предоставляет функцию для циклического чтения информации списка массива: GetCursorValues, среди них метод «указатель события как параметр», представленный в {№ 3}, используется для чтения информации списка.
Дополнение к {№ 6}:
пример:
процедура RegisterComponents(const Page: string;
ComponentClasses: массив TComponentClass);
начинать
если Назначено(RegisterComponentsProc), то
RegisterComponentsProc(Страница, Классы Компонентов)
еще
поднять EComponentError.CreateRes(@SRegisterError);
конец;
Интерпретация:
1. Используйте метод регистрации, чтобы записать типы элементов управления, которые можно использовать, и т. д.
3. Для RegisterComponentsProc метод «использования указателей функций для уменьшения количества проектов модулей» в {№ 8} используется для облегчения будущего расширения программы, обновления версий и т. д.
{Нет 11}Определите только одну общедоступную функцию.
//Описание проекта: Теперь нам нужно реализовать чертеж САПР или систему Visio, которая требует хорошей масштабируемости и простоты обслуживания;
//И для этого требуется низкая связанность, чтобы части системы или расширенной системы можно было упаковать и использовать непосредственно в будущих проектах.
дизайн:
1. Создайте абстрактный класс графического объекта. В этом классе определите абстрактную функцию CadPerform. Параметры функции относятся к функции TControl.Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;
2. В классе управления графикой реализуйте управление списком графических объектов. В списке хранится указатель абстрактного объекта.
3. Если вы хотите управлять определенными объектами класса, вам нужно всего лишь использовать функцию CanPerform, а затем передать Msg в соответствии с категорией текущей операции и передать соответствующую информацию о параметрах.
Реализация: TCad — это класс управления первого уровня, унаследованный от абстрактного класса.
функция TCad.CadPerform(Msg: Cardinal; WParam, LParam: Longint): Longint;
начинать
Сообщение о случае
My_Message1: Результат: = MyMessage1(WParam, LParam);
My_Message2: Результат: = MyMessage2(WParam, LParam);
конец;
конец;
Для TPoint, наследуемого от TCad, функция CadPerform реализована следующим образом.
функция TPoint.CadPerform(Msg: Cardinal; WParam, LParam: Longint): Longint;
начинать
Сообщение о случае
My_Message1: Result := MyMessage1(WParam, LParam); //Обработка этого типа операции в TCad заблокирована.
My_Message3: Результат: = MyMessage3(WParam, LParam);
else Результат: = унаследовано CadPerform(Msg, WParam, LParam);
конец;
конец;
*проиллюстрировать:
Поскольку мы очень часто работаем с графическими объектами, мы определяем общедоступную и открытую функцию интерфейса, чтобы добиться высокой инкапсуляции класса, а также простоты обслуживания и расширения программы.
*//
{№ 12}
Ниже приведены мои требования к программированию: (Некоторая информация не имеет языковых ограничений)
//Почти все следующие решения можно найти в приведенных выше методах.
1. Уменьшите сложность программы. а. Сократите количество функций, используйте методы Case и Tag и научитесь определять вложенность модулей, используйте методы передачи сообщений и уменьшайте взаимное включение модулей формы.
2. Уменьшить
{№ 13} Используйте широковещательную рассылку для реализации уведомлений от классов управления к объектам списка управления.
//Для описания проекта {№12} при изменении свойств или статуса элемента управления чертежной формой часто необходимо оповестить все графические объекты и внести соответствующие изменения.
//Если определена только одна широковещательная функция, можно реализовать уведомление родитель-потомок, что также улучшит возможность повторного использования, масштабируемость, простоту обслуживания и т. д. программы и сделает структуру класса понятной.
//Например: 1. В Visio и MapInfo, если изменяется масштаб (коэффициент масштабирования) текущей формы, все отображаемые в данный момент графические объекты необходимо перерисовать с использованием нового масштаба. 2. При изменении шрифта формы по умолчанию текущей формы, текстовые шрифты графических объектов, использующих шрифт формы по умолчанию для отображения текстовой информации, также должны быть изменены соответствующим образом.
//Решение: обратитесь к механизму обработки в TWinControl, который уведомляет все подэлементы управления при изменении атрибутов или статуса:
процедура TWinControl.NotifyControls(Сообщение: Word);
вар
Сообщение: TMessage;
начинать
Сообщение.Сообщение := Сообщение;
Сообщение.WParam:= 0;
Сообщение.LParam := 0;
Сообщение.Результат:= 0;
Broadcast(Message);//Передача текущего сообщения об изменении
конец;
в:
процедура TWinControl.Broadcast(var Message);
вар
Я: целое число;
начинать
для I := 0 до ControlCount - 1 сделать
начинать
Controls[I].WindowProc(TMessage(Сообщение));
//Изменить на: с помощью TMessage(Message) do Cads[I].CadPerform(msg, WParam, LParam);
если TMessage(Message).Result <> 0, то выйти;
конец;
конец;
Однако, когда мы имеем дело с графическими объектами, мы можем напрямую вызывать общедоступную функцию CanPerform в Cads.
{Нет 14}Создавайте объекты динамически, когда это необходимо.
Например: http://www.delphibbs.com/keylife/iblog_show.asp?xid=824.
//************Вариант 2. При необходимости создайте форму свойства.
использует
...
fСобственность;
тип
TfrmMyMap = класс
...
процедура OnfrmMyMapDestroy (Отправитель: TObject);
процедура OnMapGeoSelected(AGeo: TGeometry);
частный
ФфрмПроперти: ТфрмПроперти;
процедура ShowPropertyForm(aVisible: Boolean);
общественный
конец;
процедура TfrmMyMap.ShowPropertyForm(aVisible: Boolean);
начинать
если не назначено(FfrmProperty), то FfrmProperty := TfrmProperty.Create(Application);
FfrmProperty.Visible := aVisible;
конец;
процедура TfrmMyMap.OnfrmMyMapDestroy (Отправитель: TObject);
начинать
если назначено(FfrmProperty), то FfrmProperty.Free;
конец;
процедура TfrmMyMap.OnMapGeoSelected(AGeo: TGeometry);
начинать
если назначено(FfrmProperty), то FfrmProperty.MyRefresh(AGeo);
конец;
Здесь объясняется:
1. При необходимости динамически создавайте объект FfrmProperty.
2. Когда текущий объект будет выпущен, определите легальность вашего объекта, а затем освободите динамически созданный объект.
{Нет 15}Создайте интерфейс или создайте структуру.
//Описание проекта: Когда я разрабатываю элемент управления «Таблица», если я устанавливаю для ячейки значение Com, если в таблице слишком много информации, скорость загрузки не может быть гарантирована, и существует даже вероятность сбоя. Причина, по которой я использую Com, заключается в том, что обработка и информация каждой ячейки могут быть расширены за пределы контроля в будущем.
Мое решение: создать экземпляр для каждого элемента управления, полученного из Cell, и динамически создать несколько объектов структуры Record для записи информации каждой ячейки. Если вам нужно управлять ячейкой, назначьте указатель объекта структуры компоненту Cell, результаты теста будут такими. очень удовлетворительно.
Поэтому, если вам необходимо использовать большое количество экземпляров Com, старайтесь управлять и поддерживать один экземпляр, при этом данные в нем можно создавать и управлять динамически, что хорошо скажется с точки зрения скорости.
Кроме того, попробуйте объявить указатель интерфейса pMyInterface = ^IMyInterface. При передаче или использовании параметров используйте указатель интерфейса напрямую. Это может уменьшить количество вызовов функции подсчета _AddInft и т. д., а также увеличить скорость. операция обычная.