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

ЖАНРЫ

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

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

Шрифт:

var

 TempPairs: array [0..1] of THSZPair;

 Matched : Boolean;

begin

 TempPairs[0].hszSvc:= ServiceHSz;

 TempPairs[0].hszTopic:= TopicHSz;

 TempPairs[1].hszSvc:= 0; { 0-завершает список }

 TempPairs[1].hszTopic:= 0;

 Matched := False;

 if (Topic= 0) and (Service = 0) then Matched := True {
Шаблон обработан, элементов не найдено }

 else

if (Topic = 0) and (DdeCmpStringHandles(Service, ServiceHSz) = 0) then Matched := True

else if (DdeCmpStringHandles(Topic, TopicHSz) = 0) and (Service = 0) then Matched := True;

 if Matched then

WildConnect := DdeCreateDataHandle(Inst, @TempPairs, SizeOf(TempPairs), 0, 0, ClipFmt, 0)

 else WildConnect := 0;

end;

{ Принимаем и проталкиваем данные по просьбе клиента. Для демонстрации этого способа используем только значение DataItem1, изменяемое Poke.}

function TForm1.AcceptPoke(Item: HSz; ClipFmt: Word; Data: HDDEData): Boolean;

var

 DataStr: TDataString;

 Err: Integer;

 TempSample: Integer;

begin

 if (DdeCmpStringHandles(Item, ItemHSz[1]) = 0) and (ClipFmt = cf_Text) then begin

DdeGetData(Data, @DataStr, SizeOf(DataStr), 0);

Val(DataStr, TempSample, Err);

if IntToStr(TempSample) <> Label6.Caption then begin

Label6.Caption:= IntToStr(TempSample);

DataSample[1] := TempSample;

if Advising[1] then DdePostAdvise(Inst, TopicHSz, ItemHSz[1]);

end;

AcceptPoke := True;

 end else AcceptPoke := False;

end;

{ Возвращаем данные, запрашиваемые значениями TransType и ClipFmt. Такое может произойти в ответ на просьбу xtyp_Request или xtyp_AdvReq. Параметр ItemNum указывает на поддерживаемый (в диапазоне 1..NumValues) и требуемый элемент (обратите внимание на то, что данный метод подразумевает, что вызывающий оператор уже установил достоверность и ID требуемого пункта с помощью MatchTopicAndItem). Соответствующие данные из переменной экземпляра DataSample преобразуются в текст и возвращаются клиенту.}

function TForm1.DataRequested(TransType: Word; ItemNum: Integer; ClipFmt: Word): HDDEData;

var ItemStr: TDataString; { Определено в DataEntry.TPU }

begin

 if ClipFmt = cf_Text then begin

Str(DataSample[ItemNum], ItemStr);

DataRequested := DdeCreateDataHandle(Inst, @ItemStr, StrLen(ItemStr) + 1, 0, ItemHSz[ItemNum], ClipFmt, 0);

 end else DataRequested := 0;

end;

{
Создаем экземпляр окна DDE сервера. Вызываем унаследованный конструктор, затем устанавливаем эти объекты родителями экземпляров данных. }

procedure TForm1.FormCreate(Sender: TObject);

var I : Integer;

begin

 Inst:= 0; { Должен быть нулем для первого вызова DdeInitialize }

 @CallBack := nil; { MakeProcInstance вызывается из SetupWindow }

 for I := 1 to NumValues do begin

DataSample[I] := 0;

Advising[I] := False;

 end; { for }

end;

{ Разрушаем экземпляр окна DDE сервера. Проверяем, был ли создан экземпляр процедуры обратного вызова, если он существует. Также, для завершения диалога, вызовите DdeUninitialize. Затем, для завершения работы, вызовите разрушителя предка.}

procedure TForm1.FormDestroy(Sender: TObject);

var I : Integer;

begin

 if ServiceHSz <> 0 then DdeFreeStringHandle(Inst, ServiceHSz);

 if TopicHSz <> 0 then DdeFreeStringHandle(Inst, TopicHSz);

 for I := 1 to NumValues do

if ItemHSz[I] <> 0 then DdeFreeStringHandle(Inst, ItemHSz[I]);

 if Inst <> 0 then DdeUninitialize(Inst); { Игнорируем возвращаемое значение }

 if @CallBack <> nil then FreeProcInstance(@CallBack);

end;

procedure TForm1.FormShow(Sender: TObject);

var

 I : Integer;

{ Завершаем инициализацию окна DDE сервера. Процедура инициализации использует DDEML для регистрации сервисов, предусмотренных данным приложением. Помните о том, что реальные имена, использованные в регистрах, определены в отдельном модуле (DataEntry), поэтому они могут быть использованы и клиентом. }

begin

 @CallBack:= MakeProcInstance(@CallBackProc, HInstance);

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