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

ЖАНРЫ

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

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

Шрифт:

end;

{ Посылка DDE запроса для получения cf_Text данных с сервера. Запрашиваем данные для всех полей DataSample, и обновляем окно для их отображения. Данные с сервера получаем синхронно, используя DdeClientTransaction.}

procedure TForm1.Request(HConversation: HConv);

var

 hDdeTemp : HDDEData;

 DataStr : TDataString;

 Err, I : Integer;

begin

 if HConversation <> 0 then begin

for I := Low(ItemHSz) to High(ItemHSz) do begin

hDdeTemp:= DdeClientTransaction(nil, 0, HConversation, ItemHSz[I], cf_Text, xtyp_Request, 0, nil);

if hDdeTemp <> 0 then begin

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

Val(DataStr, DataSample[I], Err);

end; { if }

end; { for }

Paintbox1.Refresh; {
Обновляем экран }

 end; { if }

end;

procedure TForm1.FormCreate(Sender: TObject);

var I : Integer;

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

begin

 Inst:= 0;

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

 CallBackPtr:= nil;

 { MakeProcInstance вызывается из SetupWindow }

 ConvHdl:= 0;

 ServiceHSz := 0;

 TopicHSz:= 0;

 for I := Low(DataSample) to High(DataSample) do begin

ItemHSz[I]:= 0;

DataSample[I] := 0;

 end;

end;

procedure TForm1.FormDestroy(Sender: TObject);

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

var I : Integer;

begin

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

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

 for I := Low(ItemHSz) to High(ItemHSz) do

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

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

 if CallBackPtr <> nil then FreeProcInstance(CallBackPtr);

end;

procedure TForm1.RequestUpdate1Click(Sender: TObject);

begin

 { Генерируем запрос DDE в ответ на выбор пункта меню DDE | Request.}

 Request(ConvHdl);

end;

procedure TForm1.FormShow(Sender: TObject);

{ Завершаем инициализацию окна сервера DDE. Выполняем те действия, которые требует правильное окно. Инициализируем использование DDEML. }

var

 I: Integer;

 InitOK: Boolean;

begin

 CallBackPtr := MakeProcInstance(@CallBackProc, HInstance);

 { Инициализируем DDE и устанавливаем функцию обратного вызова. Если сервер отсутствует, вызов терпит неудачу. }

 if CallBackPtr <> nil then begin

if DdeInitialize(Inst, TCallback(CallBackPtr), AppCmd_ClientOnly,0) = dmlErr_No_Error then begin

ServiceHSz:= DdeCreateStringHandle(Inst, DataEntryName, cp_WinAnsi);

TopicHSz:= DdeCreateStringHandle(Inst, DataTopicName, cp_WinAnsi);

InitOK := True;

{for I := Low(DataItemNames) to High(DataItemNames) do begin }

for I := 1 to NumValues do begin

ItemHSz[I]:= DdeCreateStringHandle(Inst, DataItemNames[I], cp_WinAnsi);

InitOK := InitOK and (ItemHSz[I] <> 0);

end;

if (ServiceHSz <> 0) and (TopicHSz <> 0) and InitOK then begin

ConvHdl := DdeConnect(Inst, ServiceHSz, TopicHSz, nil);

if ConvHdl = 0 then begin

ShowMessage('Не могу инициализировать диалог!');

Close;

end

end else begin

ShowMessage('Не могу создать строки!');

Close;

end

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