📄 stock_unit.pas
字号:
unit stock_Unit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, STOCKLib_TLB, StdCtrls, Grids;
type
TStock1Form = class(TForm)
BtnSetup: TButton;
BtnReceive: TButton;
memo1: TMemo;
ReportGrid: TStringGrid;
MinGrid: TStringGrid;
HisGrid: TStringGrid;
Base: TMemo;
LBase: TLabel;
News: TMemo;
LNews: TLabel;
Button1: TButton;
Procedure Rece;
procedure stop;
procedure BtnReceiveClick(Sender: TObject);
procedure BtnSetupClick(Sender: TObject);
procedure Stock1Report(ASender: TObject; nPacket, pBuf: Integer);
procedure Stock1MinData(ASender: TObject; nPacket,
pBuf: Integer);
procedure Stock1History(ASender: TObject; nPacketNum,
pBuf: Integer);
procedure Stock1BaseFile(ASender: TObject;
const strFileName: WideString; Market: Smallint; nFileLen,
pBuf: Integer);
procedure Stock1NewsFile(ASender: TObject; NewsType,
SerialNo: Integer; const pFileName: WideString; nFileLen,
pBuf: Integer);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Stock1Form: TStock1Form;
Stock1:TStockDriver; //通视卡组件对象
Stock1Rep:TStockReport; //行情对象
Stock1Min:TStockMinData; //补分时对象
Stock1His:TStockHisData; //补日线数据对象
Stock1Rep2I:Istockreport2; //新格式行情接口
Report:OLE_RCV_REPORT2;
Min:OLE_RCV_MINUTE;
His:OLE_RCV_HISTORY;
err:integer;
stockdll:Thandle;
implementation
{$R *.dfm}
uses about;
procedure TStock1Form.BtnReceiveClick(Sender: TObject);
begin
if BtnReceive.Caption='关闭接收系统' then stop
else if BtnReceive.Caption='启动接收系统' then Rece;
end;
procedure TStock1Form.BtnSetupClick(Sender: TObject);
begin
stock1.Setup(1);//显示设置窗口
memo1.Lines.Append('目前接收到的股票总数:'+inttostr(stock1.TotalNumber));
memo1.Lines.Append('上市的股票总数:'+inttostr(stock1.STKNumInMarket));
end;
procedure TStock1Form.Stock1Report(ASender: TObject; nPacket,pBuf: Integer);
var I:Integer;
begin
//showmessage('收到Report行情数据');
ReportGrid.Cells[5,2]:=inttostr(nPacket);//包数
stock1rep.Attach(nPacket,pBuf);//将数据转存到对象
for I:=0 to nPacket-1 do
begin
report:=Stock1Rep2I.ElementAt[i];
with ReportGrid do
with report do
begin
CASE m_market of //市场
Ole_SH_MarketeX:cells[4,1]:='上海';//=$00004853 (18515)
Ole_SZ_MarketeX:cells[4,1]:='深圳';//=$00005A53 (23125)
Ole_HK_MarketeX:cells[4,1]:='香港';//=$00004B48 (19272)
end;
cells[1,1]:=floattostrF(m_fSellPrice5,ffNumber,8,3); cells[2,1]:=floattostrF(m_fSellVolume5,ffNumber,8,0); cells[4,0]:=TimeToStr(m_Time);
cells[1,2]:=floattostrF(m_fSellPrice4,ffNumber,8,3); cells[2,2]:=floattostrF(m_fSellVolume4,ffNumber,8,0);
cells[1,3]:=floattostrF(m_fSellPrice[2],ffNumber,8,3); cells[2,3]:=floattostrF(m_fSellVolume[2],ffNumber,8,0); cells[4,2]:=m_strLabel;
cells[1,4]:=floattostrF(m_fSellPrice[1],ffNumber,8,3); cells[2,4]:=floattostrF(m_fSellVolume[1],ffNumber,8,0); cells[4,3]:=m_strName;
cells[1,5]:=floattostrF(m_fSellPrice[0],ffNumber,8,3); cells[2,5]:=floattostrF(m_fSellVolume[0],ffNumber,8,0); cells[4,4]:=floattostrF( m_fLastClose,ffNumber,8,3);
cells[1,6]:=floattostrF(m_fBuyPrice[0],ffNumber,8,3); cells[2,6]:=floattostrF(m_fBuyVolume[0],ffNumber,8,0); cells[4,5]:=floattostrF( m_fOpen,ffNumber,8,3);
cells[1,7]:=floattostrF(m_fBuyPrice[1],ffNumber,8,3); cells[2,7]:=floattostrF(m_fBuyVolume[1],ffNumber,8,0); cells[4,6]:=floattostrF(m_fHigh,ffNumber,8,3);
cells[1,8]:=floattostrF(m_fBuyPrice[2],ffNumber,8,3); cells[2,8]:=floattostrF(m_fBuyVolume[2],ffNumber,8,0); cells[4,7]:=floattostrF( m_fLow,ffNumber,8,3);
cells[1,9]:=floattostrF(m_fBuyPrice4,ffNumber,8,3); cells[2,9]:=floattostrF(m_fBuyVolume4,ffNumber,8,0); cells[4,8]:=floattostrF( m_fNewPrice,ffNumber,8,3);
cells[1,10]:=floattostrF(m_fBuyPrice5,ffNumber,8,3); cells[2,10]:=floattostrF(m_fBuyVolume5,ffNumber,8,0); cells[4,9]:=floattostrF( m_fVolume,ffNumber,9,0);
cells[4,10]:=floattostrF(m_fAmount,ffNumber,12,2);
end;
end;
end;
procedure TStock1Form.Stock1MinData(ASender: TObject; nPacket, pBuf: Integer);
var i,nP:integer;
begin
Stock1Min.Attach(nPacket,pBuf);
nP:=Stock1Min.PacketNum;//有效分时包数
MinGrid.Cells[2,2]:=inttostr(nPacket);//信息包数
MinGrid.Cells[2,4]:=inttostr(nP); //有效包数
for I:=0 to nP-1 do
begin
min:=Stock1Min.ElementAt[i];
With MinGrid do
With Min do
begin
CASE m_market of //市场
Ole_SH_MarketeX:cells[1,1]:='上海';//=$00004853
Ole_SZ_MarketeX:cells[1,1]:='深圳';//=$00005A53
Ole_HK_MarketeX:cells[1,1]:='香港';//=$00004B48
end;
cells[1,0]:=TimeToStr(m_Time);cells[1,2]:=m_strLabel;
cells[1,3]:=floattostrF(m_fPrice,ffNumber,8,3);cells[1,4]:=floattostrF( m_fVolume,ffNumber,9,0);cells[1,5]:=floattostrF( m_fAmount,ffNumber,12,2);
end;
end;
end;
procedure TStock1Form.Stock1History(ASender: TObject; nPacketNum, pBuf: Integer);
var i,nP:integer;
begin
Stock1His.Attach(nPacketNum,pBuf);//数据写入缓存
np:=Stock1His.PacketNum;
HisGrid.Cells[2,2]:=inttostr(nPacketNum);//信息包数
HisGrid.Cells[2,4]:=inttostr(nP);//有效包数
for I:=0 to nP-1 do
begin
His:=Stock1His.ElementAt[i];
With HisGrid do
With His do
begin
CASE m_market of //市场
Ole_SH_MarketeX:cells[1,1]:='上海';//=$00004853
Ole_SZ_MarketeX:cells[1,1]:='深圳';//=$00005A53
Ole_HK_MarketeX:cells[1,1]:='香港';//=$00004B48
end;
cells[1,2]:=DateToStr(m_Time);cells[1,0]:=m_strLabel;
cells[1,3]:=floattostrF(m_fOpen,ffNumber,8,3);
cells[1,4]:=floattostrF(m_fHigh,ffNumber,8,3);
cells[1,5]:=floattostrF(m_fLow,ffNumber,8,3);
cells[1,6]:=floattostrF(m_fClose,ffNumber,8,3);
cells[1,7]:=floattostrF( m_fVolume,ffNumber,9,0);
cells[1,8]:=floattostrF( m_fAmount,ffNumber,12,2);
cells[1,9]:=floattostrF( m_nAdvance,ffNumber,9,0);
cells[1,10]:=floattostrF( m_nDecline,ffNumber,9,0);
end;
end;
end;
procedure TStock1Form.Stock1BaseFile(ASender: TObject;const strFileName: WideString; Market: Smallint; nFileLen, pBuf: Integer);
begin
base.Clear;
case market of
18515:Base.Lines.Append('上海');
23125:Base.Lines.Append('深圳');
19272:Base.Lines.Append('香港');
end;
Base.Lines.Append('文件名:'+StrFileName);
Base.Lines.Append('文件长度:'+inttostr(nFileLen));
Base.Lines.Append('缓存指针:'+inttoHex(pBuf,7));
Base.Lines.Append(stock1.ToString(nFileLen,pBuf));
end;
procedure TStock1Form.Stock1NewsFile(ASender: TObject; NewsType,SerialNo: Integer; const pFileName: WideString; nFileLen, pBuf: Integer);
begin
News.Clear;
case NewsType of
2:News.Lines.Append('上交所公告');
4:News.Lines.Append('深交所公告');
6:News.Lines.Append('港交所公告');
8:News.Lines.Append('电视台消息');
end;
News.Lines.Append('序列号:'+inttostr(serialNo));
News.Lines.Append('文件名:'+pFileName);
News.Lines.Append('文件长度:'+inttostr(nFileLen));
News.Lines.Append('缓存区指针:'+inttohex(pBuf,7));
News.Lines.Append(stock1.ToString(nFileLen,pBuf));
end;
procedure TStock1Form.FormCreate(Sender: TObject);
begin
err:=0; BtnReceive.Caption:='启动接收系统';
if fileExists('stock.dll')
then BtnReceive.Enabled:=True
else begin
BtnReceive.Enabled:=False;
showmessage('Stock.dll模块不存在');
end;
with reportGrid do //行情表
begin
colcount:=6;rowcount:=11;
cells[0,0]:='行情';cells[1,0]:='价'; cells[2,0]:='量';cells[3,0]:='时间:'; cells[5,0]:='行情事件';
cells[0,1]:='卖5'; cells[3,1]:='市场:'; cells[5,1]:='信息包数';
cells[0,2]:='卖4'; cells[3,2]:='代码:';
cells[0,3]:='卖3'; cells[3,3]:='名称:';
cells[0,4]:='卖2'; cells[3,4]:='昨收:';
cells[0,5]:='卖1'; cells[3,5]:='今开:';
cells[0,6]:='买1'; cells[3,6]:='最高:';
cells[0,7]:='买2'; cells[3,7]:='最低:';
cells[0,8]:='买3'; cells[3,8]:='最新:';
cells[0,9]:='买4'; cells[3,9]:='成交量:';
cells[0,10]:='买5'; cells[3,10]:='成交金额:';
end;
with minGrid do //补分时表
begin
colcount:=3;rowcount:=6;
cells[0,0]:='时间:';cells[0,1]:='市场:';cells[0,2]:='代码:';
cells[0,3]:='价格:';cells[0,4]:='成交量:';cells[0,5]:='成交金额:';
Cells[2,0]:='补分时事件';Cells[2,1]:='信息包数';Cells[2,3]:='有效包数';
end;
with hisGrid do
begin
colcount:=3;rowcount:=11;
cells[0,0]:='代码';cells[0,1]:='市场';cells[0,2]:='日期';
cells[0,3]:='开盘';cells[0,4]:='最高';cells[0,5]:='最低';
cells[0,6]:='收盘';cells[0,7]:='成交量';cells[0,8]:='成交金额';
cells[0,9]:='涨';cells[0,10]:='跌';
Cells[2,0]:='补日线事件';Cells[2,1]:='信息包数';Cells[2,3]:='有效包数';
end;
end;
procedure TStock1Form.Rece;
begin
//动态建立组件
stock1:=Tstockdriver.Create(Self) ;
try
with stock1 do
begin
stock1.Parent:=self;
stock1.hide; //隐藏
Left:=0;
Top:=0;
Width:=350;
Height:=250;
OnBaseFile:=Stock1BaseFile;//基本资料事件
OnNewsFile:=Stock1NewsFile; //公告新闻事件
(DefaultInterface as istockdriver2).EnableNewFormat:=1; //新格式驱动
end;
except
err:=err+1;
stock1.Free;
end;
Stock1Rep:=Tstockreport.Create(self);
try
stock1.OnReport:=Stock1report;//行情接收事件
Stock1Rep2I:=stock1rep.DefaultInterface as istockreport2;//启用新的接收格式接口
except
err:=err+1;
Stock1Rep.Free;
end;
Stock1Min:=TStockMinData.Create(self);
try
stock1.OnMinData:=Stock1MinData; //补分时事件
except
err:=err+1;
Stock1Min.Free;
end;
Stock1His:=TStockHisData.Create(self); //补日线数据对象
try
stock1.OnHistory:=Stock1History; //补日线数据事件
except
err:=err+1;
stock1his.Free;
end;
if err=0 //
then begin if stock1.ReceiveEx=1
then begin
memo1.Clear;
memo1.Lines.Append('当前的频道,电视台和信道误码率:'+stock1.Channel);
memo1.Lines.Append('驱动程序 ID 字符串:'+stock1.Provider);
memo1.Lines.Append('信息卡卡号:'+stock1.RcvIDCode);
memo1.Lines.Append('驱动程序版本号和编译号:'+stock1.version);
end
else showmessage('不能接收');
BtnSetup.Enabled:=True;
end
else begin
BtnSetup.Enabled:=False;
ShowMessage('不能建立组件或对象,错误码:'+inttostr(err));
end;
BtnReceive.Caption:='关闭接收系统';
end;
procedure TStock1Form.stop;
begin
Stock1.Stop;
BtnSetup.Enabled:=False;
stock1His.Free;
stock1min.Free;
stock1rep.Free;
stock1.Free;
BtnReceive.Caption:='启动接收系统';
end;
procedure TStock1Form.Button1Click(Sender: TObject);
var ab:TaboutBox;
begin
ab:=Taboutbox.Create(self);
ab.ShowModal;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -