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

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

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

Прежде всего, установим ReportMemoryLeaksOnShutdown := True в 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

Oracle. not in и null

Если в колонке внутри подзапроса not in возможно появление null то это может привести к неверному поведению.

Рассмотрим пример, сделаем две таблицы:

Запрос с in возвращает то что ожидается

1
3

А вот запрос с not in не возвращает вообще ничего

И так будет всегда если в результате подзапроса присутствует null. Таким образом, если делается запрос с not in, всегда нужно проверить что колонка в подзапросе является not null. Или заменить условие, например на not exists.

Подробная статья про поведение null в Oracle, в том числе разобрана ситуация с not in.

PL/SQL developer. 4. Отладка

Простой пример использования отладки в Pl/Sql developer. Предположим, нам нужно отладить функцию test.sya_hello.

Открываем TestWindow и заполняем в нём код для проверки функции.

Читать далее PL/SQL developer. 4. Отладка

PL/SQL Developer. 3. Просмотр сессий, компиляция инвалидных объектов

Просмотр и закрытие сессий

Чтобы просмотреть список открытых сессий в базе данных Oracle нужно подключится под пользователем который имеет доступ на просмотр системных представлений и выбрать пункт меню Tools -> Sessions...

После этого появится форма со списком сессий.

Читать далее PL/SQL Developer. 3. Просмотр сессий, компиляция инвалидных объектов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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