Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Название:Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 краткое содержание
…начиная с 1001. Смотрите другие файлы…
Советы по Delphi. Версия 1.4.3 от 1.1.2001 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
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
ServiceHSz:= DdeCreateStringHandle(Inst, DataEntryName, cp_WinAnsi);
TopicHSz:= DdeCreateStringHandle(Inst, DataTopicName, cp_WinAnsi);
InitOK := True;
{for I := Low(DataItemNames) to High(DataItemNames) do begin }
forI := 1 toNumValues do begin
ItemHSz[I]:= DdeCreateStringHandle(Inst, DataItemNames[I], cp_WinAnsi);
InitOK := InitOK and(ItemHSz[I] <> 0);
end;
if(ServiceHSz <> 0) and(TopicHSz <> 0) andInitOK then begin
ConvHdl := DdeConnect(Inst, ServiceHSz, TopicHSz, nil);
ifConvHdl = 0 then begin
ShowMessage('Не могу инициализировать диалог!');
Close;
end
end else begin
ShowMessage('Не могу создать строки!');
Close;
end
end else begin
ShowMessage('Не могу осуществить инициализацию!');
Close;
end;
end;
end;
procedureTForm1.AdviseofChanges1Click(Sender: TObject);
{ Переключаемся на режим DDE Advise с помощью пункта меню DDE | Advise (уведомление). При выборе этого пункта меню все три элемента переключаются на уведомление. }
var
I: Integer;
TransType: Word;
TempResult: Longint;
begin
withTMenuITem(Sender) do begin
Checked := notChecked;
ifChecked thenTransType:= (xtyp_AdvStart orxtypf_AckReq)
elseTransType:= xtyp_AdvStop;
end; { with }
forI := Low(ItemHSz) toHigh(ItemHSz) do
ifDdeClientTransaction( nil, 0, ConvHdl, ItemHSz[I], cf_Text,TransType, 1000, @TempResult) = 0 thenShowMessage('Не могу выполнить транзакцию-уведомление');
ifTransType andxtyp_AdvStart <> 0 thenRequest(ConvHdl);
end;
procedureTForm1.PokeSomeDataClick(Sender: TObject);
{ Генерируем DDE-Poke транзакцию в ответ на выбор пункта меню DDE | Poke. Запрашиваем значение у пользователя, которое будем "проталкивать" в DataItem1 в качестве иллюстрации Poke-функции.}
var
DataStr: pChar;
S: String;
begin
S := '0';
ifInputQuery('PokeData', 'Задайте проталкиваемую (Poke) величину', S) then begin
S := S + #0;
DataStr := @S[1];
DdeClientTransaction(DataStr, StrLen(DataStr) + 1, ConvHdl, ItemHSz[1], cf_Text, xtyp_Poke, 1000, nil);
Request(ConvHdl);
end;
end;
procedureTForm1.exit1Click(Sender: TObject);
begin
close;
end;
procedureTForm1.PaintBox1Paint(Sender: TObject);
{ После запроса обновляем окно. Рисуем график объема текущих продаж.}
const
LMarg = 30; { Левое поле графика }
var
I,Norm: Integer;
Wd: Integer;
Step : Integer;
ARect: TRect;
begin
Norm := 0;
forI := Low(DataSample) toHigh(DataSample) do begin
ifabs(DataSample[I]) > Norm thenNorm := abs(DataSample[I]);
end; { for }
ifNorm = 0 thenNorm := 1; { В случае если у нас все нули }
Интервал:
Закладка: