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; { В случае если у нас все нули }
withTPaintBox(Sender).Canvas do begin
{ Рисуем задний фон }
Brush.color:= clWhite;
FillRect(ClipRect);
{ Рисуем ось }
MoveTo(0, ClipRect.Bottom div2);
LineTo(ClipRect.Right, ClipRect.Bottom div2);
MoveTo(LMarg, 0);
LineTo(LMarg, ClipRect.Bottom);
{ Печатаем текст левого поля }
TextOut(0, 0, IntToStr(Norm));
TextOut(0, ClipRect.Bottom div2, '0');
TextOut(0, ClipRect.Bottom + Font.Height, IntToStr(-Norm));
TextOut(0, ClipRect.Bottom div2, '0');
TextOut(0, ClipRect.Bottom div2, '0');
TextOut(0, ClipRect.Bottom div2, '0');
{ Печатаем текст оси X }
{ Теперь рисуем бары на основе нормализованного значения. Вычисляем ширину баров (чтобы они все вместились в окне) и ширину пробела между ними, который приблизительно равен 20% от их ширины. }
{ SelectObject(PaintDC, CreateSolidBrush(RGB(255, 0, 0)));
SetBkMode(PaintDC, Transparent);}
ARect := ClipRect;
Wd := (ARect.Right - LMarg) divNumValues;
Step := Wd div5;
Wd := Wd - Step;
withARect do begin
Left := LMarg + (Step div2);
Top := ClipRect.Bottom div2;
end; { with }
{ Выводим бары и текст для оси X }
Fori := Low(DataSample) toHigh(DataSample) do begin
withARect do begin
Right := Left + Wd;
Bottom:= Top - Round((Top-5) * (DataSample[I] / Norm));
end; { with }
{ Заполняем бар }
Brush.color:= clFuchsia;
FillRect(ARect);
{ Выводим текст для горизонтальной оси }
Читать дальше