А. Григорьев - О чём не пишут в книгах по Delphi

Здесь есть возможность читать онлайн «А. Григорьев - О чём не пишут в книгах по Delphi» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: СПб, Год выпуска: 2008, ISBN: 2008, Издательство: БХВ-Петербург, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

О чём не пишут в книгах по Delphi: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «О чём не пишут в книгах по Delphi»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Рассмотрены малоосвещённые вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные механизмы их работы, особенности для протоколов TCP и UDP и др. Большое внимание уделено разбору ситуаций возникновения ошибок и получения неверных результатов в "простом и правильном" коде. Отдельно рассмотрены особенности работы с целыми, вещественными и строковыми типами данных, а также приведены примеры неверных результатов, связанных с ошибками компилятора, VCL и др. Для каждой из таких ситуаций предложены методы решения проблемы. Подробно рассмотрен синтаксический анализ в Delphi на примере арифметических выражений. Многочисленные примеры составлены с учётом различных версий: от Delphi 3 до Delphi 2007. Прилагаемый компакт-диск содержит примеры из книги.
Для программистов

О чём не пишут в книгах по Delphi — читать онлайн ознакомительный отрывок

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «О чём не пишут в книгах по Delphi», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать
Листинг 1.52. Метод SetRegion, устанавливающий регион окна

procedure TFormHole.SetRegion;

var

Rgn1, Rgn2: HRGN;

R, R2: TRect;

begin

// Создаем регион, соответствующий прямоугольнику окна

Rgn1 := CreateRectRgn(0, 0, Width, Height);

// Нам потребуются координаты панели относительно левого

// верхнего угла окна (а не относительно левого верхнего

// угла клиентской области, как это задается свойствами

// Left и Тор). Функций для получения смещения клиентской

// области относительно левого верхнего угла окна нет.

// Придется воспользоваться сообщением WM_NCCalcRect

R2 := Rect(Left, Top, Left + Width, Top + Height);

Perform(WM_NCCALCSIZE, 0, LParam(@R2));

// Переводим координаты полученного прямоугольника из

// экранных в координаты относительно левого верхнего

// угла окна

OffsetRect(R2, -Left, -Top);

// получаем координаты панели относительно левого

// верхнего угла клиентской области и пересчитываем их

// в координаты относительно верхнего левого угла окна

R := Rect(0, 0, PanelHole.Width, PanelHole.Height);

OffsetRect(R, PanelHole.Left + R2.Left, PanelHole.Top + R2.Top);

// уменьшаем прямоугольник на величину рамки и создаем

// соответствующий регион

InflateRect(R, -HoleBorder, -HoleBorder);

Rgn2 := CreateRectRgnIndirect(R);

// вычитаем один прямоугольный регион из другого, получая

// прямоугольник с дыркой

CombineRgn(Rgn1, Rgn1, Rgn2, RGN_DIFF);

// уничтожаем вспомогательный регион

DeleteObject(Rgn2);

// Назначаем регион с дыркой окну

SetWindowRgn(Handle, Rgn1, True);

// обратите внимание, что регион, назначенный окну, нигде

// не уничтожается. После выполнения функции SetWindowRgn

// регион переходит в собственность системы, и она сама

// уничтожит его при необходимости

end;

Сообщения, поступающие с панели, перехватываются через ее свойство WindowProc(подробно эта технология описана в первой части данной главы, здесь мы ее касаться не будем). Сообщение WM_NCHITTESTбудем обрабатывать так, чтобы при попадании мыши на рамку панели возвращались такие значения, чтобы за эту рамку можно было тянуть. В обработчике сообщения WM_SIZEпанели изменяем регион так, чтобы он соответствовал новому размеру панели. Все, дырка с изменяемыми размерами готова. Теперь нужно научить "дырку" менять размеры при изменении размеров окна, если окно стало слишком маленьким, чтобы вместить в себя дырку. Осталось только немного "навести красоту". "Красота" заключается в том, чтобы пользователь не мог уменьшить размеры дырки до нуля и увеличить так, чтобы она вышла за пределы окна, а также уменьшить окно так. чтобы дырка оказалась за пределами окна. Первая из этих задач решается просто: добавляется обработчик сообщения WM_SIZINGдля дырки таким образом, чтобы ее размеры не могли стать меньше, чем MinHoleSizeна MinHoleSizeпикселов, а границы нельзя было придвинуть к границам окна ближе, чем на HoleDistanceпикселов. Вторая задача решается еще проще: в обработчике WM_SIZEдырки меняем свойство Constraintsформы таким образом, чтобы пользователь не мог слишком сильно уменьшить окно. Теперь окно с дыркой ведет себя корректно при любых действиях пользователя с дыркой. Получившийся в результате код обработчика сообщений панели приведен в листинге 1.53.

Листинг 1.53. Обработчик сообщений панели, образующей "дырку"

procedure TFormHole.PanelWndProc(var Msg: TMessage);

var

Pt: TPoint;

R: TRect;

begin

POldPanelWndProc(Msg);

if Msg.Msg = WM_NCHITTEST then

begin

// Вся хитрость обработки сообщения WM_NCHITTEST

// заключается в правильном переводе экранных координат

// в клиентские и в несколько муторной проверке попадания

// мыши на сторону рамки или в ее угол. Дело упрощается

// тем, что у панели нет неклиентской части, поэтому

// верхний левый угол окна и верхний левый угол клиентской

// части совпадают.

Pt := PanelHole.ScreenToClient(Point(Msg.LParamLo, Msg.LParamHi));

if Pt.X < BorderMouseSensivity then

if Pt.Y < CornerMouseSensivity then Msg.Result := HTTOPLEFT

else

if Pt.Y >= PanelHole.Height - CornerMouseSensivity then

Msg.Result := HTBOTTOMLEFT

else Msg.Result := HTLEFT

else

if Pt.X >= PanelHole.Width - BorderMouseSensivity then

if Pt.Y < CornerMouseSensivity then Msg.Result := HTTOPRIGHT

else

if Pt.Y >= PanelHole.Height - CornerMouseSensivity then

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «О чём не пишут в книгах по Delphi»

Представляем Вашему вниманию похожие книги на «О чём не пишут в книгах по Delphi» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «О чём не пишут в книгах по Delphi»

Обсуждение, отзывы о книге «О чём не пишут в книгах по Delphi» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x