Мой DELPHI – Программирование

Всё для программера

Как сделать возможным передвижение формы, если пользователь щелкнул

Как сделать возможным передвижение формы, если пользователь щелкнул
в форму вне пространства заголовка?

В следующем примере показано как можно передвигать форму если пользователь
“захватил” Client-пространство. Наиболее простое решение – “обмануть” Windows
и Client-пространство выдать за заголовок окна.

unit DragMain;
interface

uses

  SysUtils, WinTypes, WinProcs,  Messages,

  Classes, Graphics, Controls, Forms, Dialogs, StdCrtls; Прочитать остальную часть записи »

Как закрыть окно подсказки если пользователь закончил приложение?

Как закрыть окно подсказки если пользователь закончил приложение?

В следующем примере показано как закрыть окно помощи, если пользователь
закончил приложение.


procedure TMainForm.FormClose(Sender: TObject;
          var Action: TCloseAction);
 

begin
  Winhelp(Handle, 'WINHELP.HLP', HELP_QUIT, 0);
  Action := caFree;
end;

Урок 21: Объект TQuery

Урок 21: Объект TQuery

  1. Краткий Обзор

В этой главе Вы узнаете некоторые
основные понятия о запросах (queries) и транзакциях. Это достаточно широкие
понятия, поэтому обсуждение разбито на следующие основные части:

  • Объект TQuery.
  • Использование SQL с локальным
    и удаленным серверами (Select, Update, Delete и Insert).
  • Использование SQL для создания
    объединения (joins), связанных курсоров (linked cursors) и программ, которые
    ведут поиск заданных записей.

Сокращение SQL означает Structured
Query Language – Язык Структурированных Запросов, и обычно произноситься
либо как “Sequel” либо ” Ess Qu El”. Однако, как бы Вы его ни произносили,
SQL – это мощный язык БД, который легко доступен из Delphi, но который
отличается от родного языка Delphi. Delphi может использовать утверждения
SQL для просмотра таблиц, выполнять объединение таблиц, создавать отношения
один-ко-многим, или исполнить почти любое действие, которое могут сделать
ваши основные инструменты БД. Delphi поставляется с Local
SQL, так что Вы можете выполнять запросы SQL при работе с локальными таблицами,
без доступа к SQL серверу.

Delphi обеспечивает поддержку
“pass through SQL”, это означает то, что Вы можете составлять предложения
SQL и посылать их непосредственно серверам Oracle, Sybase, Inrterbase и
другим. “Pass through SQL” – это мощный механизм по двум причинам:

  1. Большинство серверов могут обрабатывать
    SQL запросы очень быстро, а это означает, что используя SQL для удаленных
    данных, Вы получите ответ очень быстро.
  2. Есть возможность составлять
    SQL запросы, которые заставят сервер исполнить специализированные задачи,
    недоступные через родной язык Delphi.

Перед чтением этой статьи Вы
должны иметь, по крайней мере, элементарное понятие о серверах и различиях
между локальными и удаленными (remote) данными. Прочитать остальную часть записи »

Урок 14: Использование DLL в Delphi

Урок 14: Использование DLL в Delphi

  1. Понятие DLL
  2. Вспомним процесс программирования в DOS. Преобразование исходного
    текста программы в машинный код включал в себя два процесса – компиляцию
    и линковку. В процессе линковки, редактор связей, компоновавший отдельные
    модули программы, помещал в код программы не только объявления функций
    и процедур, но и их полный код. Вы готовили таким образом одну программу,
    другую, третью … И везде код одних и тех же функций помещался в программу
    полностью.

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

    Но, чем же отличаются Dynamic
    Link Library (DLL) от обычных приложений? Для понимания этого требуется
    уточнить понятия задачи (task), экземпляра (копии) приложения (instance)
    и модуля (module).

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

    DLL – библиотека, в отличие
    от приложения не имеет ни стека, ни очереди сообщений. Функции, помещенные
    в DLL, выполняются в контексте вызвавшего приложения, пользуясь его стеком.
    Но эти же функции используют сегмент данных, принадлежащий библиотеке,
    а не копии приложения.

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

    Часто, в виде DLL создаются
    отдельные наборы функций, объединенные по тем или иным логическим признакам,
    аналогично тому, как концептуально происходит планирование модулей ( в
    смысле unit ) в Pascal. Отличие заключается в том, что функции из модулей
    Pascal компонуются статически – на этапе линковки, а функции из DLL компонуются
    динамически, то есть в run-time. Прочитать остальную часть записи »

Урок 9 : Обработка исключительных ситуаций в Delphi

Урок 9 : Обработка исключительных ситуаций в Delphi

  1. Обзор
  2. С целью поддержки структурной
    обработки исключительных ситуаций (exception)
    в Delphi введены новые расширения языка
    Pascal. В данной статье будет дано
    описание того, что из себя представляет такая обработка, почему она полезна,
    будут приведены соответствующий синтаксис Object Pascal и
    примеры использования исключительных ситуаций в Delphi.

  3. Структурная обработка исключительных
    ситуаций
  4. Структурная
    обработка исключительных ситуаций -
    это система, позволяющая программисту при возникновении ошибки (исключительной
    ситуации) связаться с кодом программы, подготовленным для обработки такой
    ошибки
    . Это выполняется
    с помощью языковых конструкций, которые как бы “охраняют”
    фрагмент кода программы и определяют обработчики ошибок, которые будут
    вызываться, если что-то пойдет не так в “охраняемом”
    участке кода. В данном случае понятие исключительной ситуации относится
    к языку и не нужно его путать с системными исключительными ситуациями (hardware
    exceptions), такими как General Protection
    Fault. Эти исключительные ситуации обычно
    используют прерывания и особые состояния “железа”
    для обработки критичной системной ошибки;
    исключительные ситуации в Delphi же
    независимы от “железа”,
    не используют прерываний и используются для обработки ошибочных состояний,
    с которыми подпрограмма не готова иметь дело. Системные исключительные
    ситуации, конечно, могут быть перехвачены и преобразованы в языковые исключительные
    ситуации, но это только одно из применений языковых исключительных ситуаций.

    При традиционной обработке
    ошибок, ошибки, обнаруженные в процедуре обычно передаются наружу (в вызывавшую
    процедуру) в виде возвращаемого значения функции, параметров или глобальных
    переменных (флажков). Каждая вызывающая процедура должна проверять результат
    вызова на наличие ошибки и выполнять соответствующие действия. Часто, это
    просто выход еще выше, в более верхнюю вызывающую процедуру и т.д. :
    функция A вызывает
    B, B вызывает C, C обнаруживает
    ошибку и возвращает код ошибки в B, B проверяет
    возвращаемый код, видит, что возникла ошибка и возвращает код ошибки в
    A, A проверяет возвращаемый код
    и выдает сообщение об ошибке либо решает сделать
    что-нибудь еще, раз первая попытка не удалась.

    Такая “пожарная
    бригада” для обработки ошибок трудоемка,
    требует написания большого количества кода в котором можно легко ошибиться
    и который трудно отлаживать.

    Одна ошибка в коде программы
    или переприсвоение в цепочке возвращаемых значений может привести к тому,
    что нельзя будет связать ошибочное состояние с положением дел во внешнем
    мире. Результатом будет ненормальное поведение программы, потеря данных
    или ресурсов, или крах системы.

    Структурная обработка исключительной
    ситуации замещает ручную обработку ошибок автоматической, сгенерированной
    компилятором системой уведомления. В приведенном выше примере, процедура
    A установила бы “охрану”
    со связанным обработчиком ошибки на фрагмент кода, в котором вызывается
    B. B просто вызывает C.
    Когда C обнаруживает ошибку, то создает
    (raise) исключительную ситуацию.
    Специальный код, сгенерированный компилятором и встроенный в Run-Time
    Library (RTL) начинает поиск обработчика данной
    исключительной ситуации. При поиске
    “защищенного”
    участка кода используется информация, сохраненная в стеке. В процедурах
    C и B нет
    такого участка, а в A – есть. Если
    один из обработчиков ошибок, которые используются в A,
    подходит по типу для возникшей в C исключительной
    ситуации, то программа переходит на его выполнение. При этом, область стека,
    используемая в B и C,
    очищается; выполнение этих процедур
    прекращается.

    Если в A нет
    подходящего обработчика, то поиск продолжается в более верхнем уровне,
    и так может идти, пока поиск не достигнет подходящего обработчика ошибок
    среди используемых по умолчанию обработчиков в RTL.
    Обработчики ошибок из RTL только показывают
    сообщение об ошибке и форсированно прекращают выполнение программы. Любая
    исключительная ситуация, которая осталась необработанной, приведет к прекращению
    выполнения приложения.

    Без проверки возвращаемого
    кода после каждого вызова подпрограммы, код программы должен быть более
    простым, а скомпилированный код – более быстрым. При наличии исключительных
    ситуаций подпрограмма B не должна содержать
    дополнительный код для проверки возвращаемого результата и передачи его
    в A. B ничего не должна делать для
    передачи исключительной ситуации, возникшей в C,
    в процедуру A – встроенная система
    обработки исключительных ситуаций делает всю работу.

    Данная система называется
    структурной, поскольку обработка ошибок определяется областью “защищенного”
    кода; такие области могут быть вложенными.
    Выполнение программы не может перейти на произвольный участок кода;
    выполнение программы может перейти только на обработчик исключительной
    ситуации активной программы. Прочитать остальную часть записи »