procedureexit1Click(Sender: TObject);
procedurePaintBox1Paint(Sender: TObject);
private
{ Private declarations }
public
Inst: Longint;
CallBackPtr: ^TCallback;
ServiceHSz : HSz;
TopicHSz : HSz;
ItemHSz : array[1..NumValues] ofHSz;
ConvHdl : HConv;
DataSample : TDataSample;
end;
varForm1: TForm1;
implementation
const
DataEntryName : PChar = 'DataEntry';
DataTopicName : PChar = 'SampledData';
DataItemNames : array[1..NumValues] ofpChar = ('DataItem1', 'DataItem2', 'DataItem3');
{$R *.DFM}
{ Локальная функция: Процедура обратного вызова для DDEML }
functionCallbackProc(CallType, Fmt: Word; Conv: HConv; hsz1, hsz2: HSZ; Data: HDDEData; Data1, Data2: Longint): HDDEData; export;
begin
CallbackProc := 0; { В противном случае смотрите доказательство }
caseCallType of
xtyp_Register:
begin
{ Ничего ... Просто возвращаем 0 }
end;
xtyp_Unregister:
begin
{ Ничего ... Просто возвращаем 0 }
end;
xtyp_xAct_Complete:
begin
{ Ничего ... Просто возвращаем 0 }
end;
xtyp_Request, Xtyp_AdvData:
begin
Form1.Request(Conv);
CallbackProc := dde_FAck;
end;
xtyp_Disconnect:
begin
ShowMessage('Соединение разорвано!');
Form1.Close;
end;
end;
end;
{ Посылка DDE запроса для получения cf_Text данных с сервера. Запрашиваем данные для всех полей DataSample, и обновляем окно для их отображения. Данные с сервера получаем синхронно, используя DdeClientTransaction.}
procedureTForm1.Request(HConversation: HConv);
var
hDdeTemp : HDDEData;
DataStr : TDataString;
Err, I : Integer;
begin
ifHConversation <> 0 then begin
forI := Low(ItemHSz) toHigh(ItemHSz) do begin
hDdeTemp:= DdeClientTransaction( nil, 0, HConversation, ItemHSz[I], cf_Text, xtyp_Request, 0, nil);
ifhDdeTemp <> 0 then begin
DdeGetData(hDdeTemp, @DataStr, SizeOf(DataStr), 0);
Val(DataStr, DataSample[I], Err);
end; { if }
end; { for }
Paintbox1.Refresh; { Обновляем экран }
end; { if }
end;
procedureTForm1.FormCreate(Sender: TObject);
varI : Integer;
{ Создаем экземпляр окна DDE-клиента. Создаем окно, используя унаследованный конструктор, инициализируем экземпляр данных.}
begin
Inst:= 0;
{ Должен быть нулем для первого вызова DdeInitialize }
CallBackPtr:= nil;
{ MakeProcInstance вызывается из SetupWindow }
ConvHdl:= 0;
ServiceHSz := 0;
TopicHSz:= 0;
forI := Low(DataSample) toHigh(DataSample) do begin
ItemHSz[I]:= 0;
DataSample[I] := 0;
end;
end;
procedureTForm1.FormDestroy(Sender: TObject);
{ Уничтожаем экземпляр клиентского окна. Освобождаем дескрипторы DDE строк, и освобождаем экземпляр функции обратного вызова, если она существует. Также, для завершения диалога, вызовите DdeUninitialize. Затем, для завершения работы, вызовите разрушителя предка. }
varI : Integer;
begin
ifServiceHSz <> 0 thenDdeFreeStringHandle(Inst, ServiceHSz);
ifTopicHSz <> 0 thenDdeFreeStringHandle(Inst, TopicHSz);
forI := Low(ItemHSz) toHigh(ItemHSz) do
ifItemHSz[I] <> 0 thenDdeFreeStringHandle(Inst, ItemHSz[I]);
ifInst <> 0 thenDdeUninitialize(Inst); { Игнорируем возвращаемое значение }
ifCallBackPtr <> nil thenFreeProcInstance(CallBackPtr);
end;
procedureTForm1.RequestUpdate1Click(Sender: TObject);
begin
{ Генерируем запрос DDE в ответ на выбор пункта меню DDE | Request.}
Request(ConvHdl);
end;
procedureTForm1.FormShow(Sender: TObject);
{ Завершаем инициализацию окна сервера DDE. Выполняем те действия, которые требует правильное окно. Инициализируем использование DDEML. }
var
I: Integer;
InitOK: Boolean;
begin
CallBackPtr := MakeProcInstance(@CallBackProc, HInstance);
{ Инициализируем DDE и устанавливаем функцию обратного вызова. Если сервер отсутствует, вызов терпит неудачу. }
ifCallBackPtr <> nil then begin
ifDdeInitialize(Inst, TCallback(CallBackPtr), AppCmd_ClientOnly,0) = dmlErr_No_Error then begin
Читать дальше