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

Тут можно читать онлайн А. Григорьев - О чём не пишут в книгах по Delphi - бесплатно ознакомительный отрывок. Жанр: comp-programming, издательство БХВ-Петербург, год 2008. Здесь Вы можете читать ознакомительный отрывок из книги онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    О чём не пишут в книгах по Delphi
  • Автор:
  • Жанр:
  • Издательство:
    БХВ-Петербург
  • Год:
    2008
  • Город:
    СПб
  • ISBN:
    978-5-9775-019003
  • Рейтинг:
    4.25/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

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

О чём не пишут в книгах по Delphi - описание и краткое содержание, автор А. Григорьев, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

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

Для программистов

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

О чём не пишут в книгах по Delphi - читать книгу онлайн бесплатно (ознакомительный отрывок), автор А. Григорьев
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Теперь можно нарисовать что-то свое. Здесь мы рисуем большой белый круг, а на его фоне — желтый прямоугольник. Для этого используем класс TCanvasспособом, который был продемонстрирован в листинге 1.17 (см. разд. 1.1.11). Если бы мы остановились на этом, то увидели бы интересную картину: нарисованные фигуры лежат поверх текста метки Label1. Объяснение этому очень простое: метка является неоконным визуальным компонентом и рисуется на поверхности своего родительского компонента при обработке его сообщения WM_PAINT. А поскольку стандартный обработчик у нас вызывается до того, как рисуются круг и прямоугольник, любой неоконный компонент будет перекрыт ими. К оконным компонентам это, разумеется, не относится, они лежат над родительской панелью, и то, что мы рисуем на этой панели, не может оказаться над ними.

Мы не можем вставить свой код между рисованием непосредственно поверхности панели и рисованием компонентов на ней. Поэтому после отработки нашего кода приходится рисовать неоконные компоненты еще раз. Проще всего это сделать, вызвав метод PaintControls, который и используется стандартным обработчиком. Конечно, получится, что неоконные компоненты рисуются дважды: в стандартном обработчике и в нашем, и это не очень хорошо. Но повторим еще раз, что программа PanelMsg— не образец для подражания, а что-то вроде зонда для исследования особенностей работы VCL.

Вызов метода PaintControlsзатруднен тем, что он объявлен в разделе protected, а потому не может быть вызван из метода NewPanelWndProc, который относится к классу формы. Чтобы обойти это ограничение, нужно породить наследника от TPanelTFakePanel. Этот наследник ничего не добавляет к классу TPanelи ничего не переопределяет в нем. Но раз он объявлен в нашем модуле, все его protected-члены, в том числе и унаследованный метод PaintControls, становятся доступными в нем. После этого мы можем привести поле, содержащее ссылку на панель, к этому типу и вызвать PaintControls. Так как структуры типов TPanelи TFakePanelидентичны, это приведет к вызову нужного метода.

Для завершения обработки сообщения WM_PAINTосталось только вызвать EndPaint, разумеется, только в том случае, если BeginPaintвызывали мы сами.

И последнее, что мы должны сделать, — это передать все остальные сообщения стандартному обработчику. После этого программа PanelMsg готова.

1.2.5. Пример NumBroadcast

Программа NumBroadcast демонстрирует широковещательную рассылку глобальных сообщений. Окно программы показано на рис. 1.10.

О чём не пишут в книгах по Delphi - изображение 10

Рис 1.10.Окно программы NumBroadcast

Для того чтобы увидеть, как работает программа, нужно запустить несколько ее экземпляров. После ввода числа и нажатия кнопки Разослатьлюбому из экземпляров программы число под кнопкой меняется во всех экземплярах. Чтобы добиться такого эффекта, программа NumBroadcast регистрирует глобальное сообщение с помощью функции RegisterWindowMessage, а в оконной процедуре предусмотрена реакция на это сообщение (число передастся через параметр WParam). Код программы приведен в листинге 1.31.

Листинг 1.31. Модуль главного окна программы NumBroadcast

unit NBMain;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type TForm1 = class(TForm)

EditNumber: TEdit;

BtnBroadcast: TButton;

LabelNumber: TLabel;

procedure BtnBroadcastClick(Sender: TObject);

private

// Здесь будет храниться номер, присвоенный системой

// глобальному сообщению

FSendNumberMessage: Cardinal;

protected

// Так как номер сообщения станет известным только при

// выполнении программы, объявить обработчик сообщения

// с помощью директивы message нельзя. Приходится

// перекрывать метод WndProc и обрабатывать сообщение в

// нем. Можно было бы вместо WndProc перекрыть метод

// DefaultHandler, но при этом зарегистрированное

// сообщение обрабатывалось бы медленнее, потому что

// сначала выполнялся бы метод WndProc, затем Dispatch

// пытался бы найти подходящий обработчик среди методов

// объекта, и лишь затем дело доходило бы до перекрытого

// DefaultHandler. Но, с другой стороны, при перекрытии

// WndProc обработка всех сообщений начинается со

// сравнения их номера с FSendNumberMessage и вызова

// унаследованного WndProc, если это другое сообщение.

// А до DefaultHandler многие сообщения не дойдут, т.к.

// будут обработаны ранее, и накладные расходы на

// сравнение и вызов унаследованного метода будут меньше.

procedure WndProc(var Msg: TMessage); override;

public

constructor Create(AOwner: TComponent); override;

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

constructor TForm1.Create(AOwner: TComponent);

begin

// Регистрируем глобальное сообщение с именем

// WM_DelphiKingdom_APISample_SendNumber. Имя достаточно

// длинное и осмысленное, поэтому можно надеяться, что

// никакое другое приложение не зарегистрирует сообщение с

// таким же именем. Регистрация сообщения выполняется до

// вызова унаследованного конструктора, т.к. при

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

// сообщений, и метод WndProc будет несколько раз вызван.

// Если вызвать унаследованный конструктор до вызова

// RegisterWindowMessage, то поле FSendNumberMessage

// будет иметь присвоенное ему по умолчанию значение 0,

// а это - код сообщения WM_NULL. Таким образом, если в

// это время окно получит сообщение WM_NULL, оно будет

// неправильно обработано. Конечно, вероятность получения

// WM_NULL во время выполнения унаследованного

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

// сделать так, чтобы поле FSendNumberMessage на момент

// первого вызова WndProc уже имело правильное значение.

FSendNumberMessage := RegisterWindowMessage('WM_DelphiKingdom_APISample_SendNumber');

inherited;

// Здесь мы меняем стиль окна поля ввода, добавляя в него

// ES_NUMBER. Стиль ES_NUMBER запрещает полю ввода

// вводить какие-либо символы, кроме цифр. Это уменьшает

// риск ошибки ввода в тех случаях, когда требуется целое

// неотрицательное число.

SetWindowLong(EditNumber.Handle, GWL_STYLE, GetWindowLong(EditNumber.Handle, GWL_STYLE) or ES_NUMBER);

end;

procedure TForm1.BtnBroadcastClick(Sender: TObject);

var

Num: Integer;

Recipients: DWORD;

begin

try

Num := StrToInt(EditNumber.Text);

// Для широковещательной рассылки сообщения служит

// функция BroadcastSystemMessage. В литературе обычно

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

Интервал:

Закладка:

Сделать


А. Григорьев читать все книги автора по порядку

А. Григорьев - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге О чём не пишут в книгах по Delphi, автор: А. Григорьев. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x