Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

 MaxAdvisories = 100;

 NumAdvLoops : Integer = 0;

{ Локальная функция: Процедура обратного вызова для DDEML }

{ Данная функция обратного вызова реагирует на все транзакции, генерируемые DDEML. Объект "target Window" (окно-цель) берется из глобально хранимых, и для реагирования на данную транзакцию, тип которой указан в параметре CallType, используются подходящие методы этих объектов.}

function CallbackProc(CallType, Fmt: Word; Conv: HConv; HSz1, HSz2: HSZ; Data: HDDEData; Data1, Data2: Longint): HDDEData; export;

var

 ItemNum: Integer;

begin

 CallbackProc := 0; {
В противном случае смотрите доказательство }

 case CallType of

 xtyp_WildConnect:

CallbackProc := Form1.WildConnect(HSz1, HSz2, Fmt);

 xtyp_Connect:

if Conv = 0 then begin

if Form1.MatchTopicAndService(HSz1, HSz2) then CallbackProc := 1; { Связь! }

end;

{ После подтверждения установки соединения записываем дескриптор связи как родительское окно.}

 xtyp_Connect_Confirm:

Form1.ConvHdl := Conv;

{ Клиент запрашивает данные, делает прямой запрос или отвечает на уведомление. Возвращаем текущее состояние данных.}

 xtyp_AdvReq, xtyp_Request:

begin

ItemNum := Form1.MatchTopicAndItem(HSz1, HSz2);

if ItemNum > 0 then CallbackProc := Form1.DataRequested(CallType, ItemNum, Fmt);

end;

{ Отвечаем на Poke-запрос ... данная демонстрация допускает только Pokes для DataItem1. Для подтверждения получения запроса возвращаем dde_FAck, в противном случае 0.}

 xtyp_Poke:

begin

if Form1.AcceptPoke(HSz2, Fmt, Data) then CallbackProc := dde_FAck;

end;

{ Клиент сделал запрос для старта цикла-уведомления. Имейте в виду, что мы организуем "горячий" цикл. Устанавливаем флаг Advising для указания открытого цикла, который будет проверять данные на предмет их изменения.}

 xtyp_AdvStart:

begin

ItemNum := Form1.MatchTopicAndItem(HSz1, HSz2);

if ItemNum > 0 then begin

if NumAdvLoops < MaxAdvisories then begin

{ Произвольное число }

Inc(NumAdvLoops);

Form1.Advising[ItemNum] := True;

CallbackProc := 1;

end;

end;

end;

{
Клиент сделал запрос на прерывание цикла-уведомления.}

 xtyp_AdvStop:

begin

ItemNum := Form1.MatchTopicAndItem(HSz1, HSz2);

if ItemNum > 0 then begin

if NumAdvLoops > 0 then begin

Dec(NumAdvLoops);

if NumAdvLoops = 0 then Form1.Advising[ItemNum] := False;

CallbackProc := 1;

end;

end;

end;

 end; { Case CallType }

end;

{ Возращает True, если данные Topic и Service поддерживаются этим приложением. В противном случае возвращается False.}

function TForm1.MatchTopicAndService(Topic, Service: HSz): Boolean;

begin

 Result := False;

 if DdeCmpStringHandles(TopicHSz, Topic) = 0 then

if DdeCmpStringHandles(ServiceHSz, Service) = 0 then Result := True;

end;

{ Определяем, один ли Topic и Item поддерживается этим приложением. Возвращаем номер заданного элемента (Item Number) (в пределах 1..NumValues), если он обнаружен, и ноль в противном случае.}

function TForm1.MatchTopicAndItem(Topic, Item: HSz): Integer;

var I : Integer;

begin

 Result := 0;

 if DdeCmpStringHandles(TopicHSz, Topic) = 0 then

for I := 1 to NumValues do

if DdeCmpStringHandles(ItemHSz[I], Item) = 0 then

Result := I;

end;

{ Отвечаем на запрос wildcard-соединения (дословно - дикая карта, шаблон). Такие запросы возникают всякий раз, когда клиент пытается подключиться к серверу с сервисом или именем топика, установленного в 0. Если сервер обнаруживает использование такого рода шаблона, он возвращает дескриптор массива THSZPair, содержащего найденные по шаблону Service и Topic.}

function TForm1.WildConnect(Topic, Service: HSz; ClipFmt: Word): HDDEData;

Поделиться с друзьями: