Правильная обработка освобождения ресурсов через try…finally в Delphi

Есть много разных вариантов как можно использовать конструкцию try...finally для освобождения ресурсов. Но многие из них работают неверно в особых ситуациях. Рассмотрим несколько вариантов подробнее.

Все рассматриваемые случаи относятся к коду внутри методов, когда переменные объектов являются локальными переменными метода. Для примера рассматривается выделение о освобождение памяти для объектов, но тоже самое может быть применено к другим типам ресурсов.

Прежде всего, для того чтобы отслеживать утечки памяти, установим ReportMemoryLeaksOnShutdown в dpr файле.

Читать далее Правильная обработка освобождения ресурсов через try…finally в Delphi

Автоматическая инициализация переменных в Delphi

Переменные в Delphi можно разделить на три типа

  • Глобальные
  • Локальные
  • Поля объектов

Разные типы имеют свои особенности инициализация по умолчанию. Глобальные переменные — переменные которые объявлены в теле модуля всегда инициализируются автоматически. Например, числовые типы всегда будут равны нулю.

Читать далее Автоматическая инициализация переменных в Delphi

Преобразование типов значений Null и Unassigned типа Variant в Delphi

Конвертация Unassigned

Если переменная с типом Variant не инициализирована то она имеет значение Unassigned, даже если это поле класса:

При преобразовании Unassigned в другие типы возможны следующие случаи:

Читать далее Преобразование типов значений Null и Unassigned типа Variant в Delphi

Примеры порождающих паттернов из Банды четырёх (GoF) на Delphi

Вольный перевод статьи Gang-of-Four Creational Design Pattern Examples in Delphi

Специализированная для Delphi версия Порождающих паттернов из книги “Design Patterns: Elements of Reusable Object-Oriented Software”.

Абстрактная фабрика (Abstract Factory)

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

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

Читать далее Примеры порождающих паттернов из Банды четырёх (GoF) на Delphi

Копирование c помощью Ctrl+C текстов из сообщений

Когда в программе появилось сообщение об ошибке или просто сообщение коллеги часто скидывают скриншот. Это не удобно, кроме случаев когда на скриншоте есть дополнительная информация кроме самого сообщения. Часто требуется какой-то текст из сообщения, например, для поиска по исходному коду. Если прислан скришот, то приходится перепечатывать этот текст.

Не все знают, но вместо скриншота можно проще и быстрее скопировать сообщение. По умолчанию в windows текст из сообщений в диалоговых окнах можно скопировать с помощью Ctrl+C. Например, вот в таком окне

копируется такой текст

---------------------------
Восстановление сетевых подключений
---------------------------
Ошибка при восстановлении подключения Z: к
xxx
Microsoft Windows Network: Множественное подключение к серверу или к общим ресурсам одним пользователем с использованием более одного имени пользователя не разрешено. Отключите все предыдущие подключения к серверу или общим ресурсам и повторите попытку.

Подключение не восстановлено.
---------------------------
ОК
---------------------------

Читать далее Копирование c помощью Ctrl+C текстов из сообщений

Delphi IDE. CnPack. Поиск компонента на форме по названию или заголовку

На большой форме, где много компонентов сложно найти отдельный компонент. Особенно если есть только название компонента или только текстовое описание, что-то вроде "Кнопка Выписка".

ChPack добавляет в редактор формы несколько кнопок, одна из которых предназначена для поиска компонентов на форме. После нажатия кнопки появляется форма с таблицей компонентов на форме и строкой поиска. Поиск можно делать как по названию компонента (TComponent.Name) так и по заголовку (Caption).

GExpert. Удобный поиск по dfm в Delphi IDE

Часто бывает нужен поиск по всем файлам включая dmf. Например

  • Поиск компонента по названию
  • Поиск запросов в которых используется таблица

Есть разные способы сделать такой такой поиск, но удобнее всего сделать это через Grep Search из набора GExpert. Диалог поиска похож на стандартный, но включает в себя дополнительные возможности.

Читать далее GExpert. Удобный поиск по dfm в Delphi IDE

Преобразование типов объектов в Delphi

Хочу рассмотреть один дискуссионный вопрос связанный с преобразованием типов. Сначала краткое введение. В Delphi существует два оператора is и as, связанных с преобразованием типов, и способ преобразования типа с помощью функции с именем типа (класса).

Оператор is используется для проверки типа, если объект соответствует указанному типу или является его наследником, то оператор возвращает True. В случае если в переменной nil то оператор возвращает False.

Оператор as используется для преобразования типа. Если объект соответствует типу или наследнику, то он преобразуется, если нет то выдаётся исключение EInvalidCast. В случае если в переменной nil, то исключение не произойдёт, но, конечно, обратится к полям объекта не получится - будет другое исключение.

Читать далее Преобразование типов объектов в Delphi

Паттерн MVVM в Delphi

Часто программы написанные на Delphi не следуют какаой-то заданной архитектуре, что приводит к проблемам с сопровождением и расширением во многолетних проектах. Примеров архитектуры и реализации паттернов, в сравнении с другими языками мало. Существует группа паттернов для разделения визуальной части приложения и логики. Один из таких паттернов MVVM, он делит приложение на

  • Model
  • ViewModel
  • View

Схема MVVM

Модули с моделями могут ссылаться только на модули своей категории. Модули с ViewModel могут ссылаться на модули своей категории и на Model. А View могут ссылаться как на другие View, так и на ViewModel и Model. Передача данных между слоями, в основном, происходит посредством байндигов.

Представленный подход позволяет, в теории, сделать два разных представления приложения на VCL и FMX, и использовать для них одни и те же модули логики. В реальности, насколько это может быть осуществимо в крупном проекте, вопрос открытый, буду благодарен за любые ссылки и замечания по этой теме.

Ссылки на более подробное описание предоставлены ниже.

Настройка Delphi для работы с системой контроля версий

Отключаем History

По умолчанию IDE сохраняет историю изменения в проекте в каталоге "_history" рядом с главным файлом проекта.

При использовании системы контроля версий эта история лишняя отключим её через настройки:

Tools -> Options -> Editor Options -> Create backup files

Непроизвольные изменения в файле dproj

Читать далее Настройка Delphi для работы с системой контроля версий