📄 kxianmain.pas
字号:
unit KXianMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Menus;
type
TFormKXianMain = class(TForm)
PaintBoxMain: TPaintBox;
PanelMain: TPanel;
EditCode: TEdit;
MainFormMenu: TMainMenu;
NXiTongGongJu: TMenuItem;
NShuJuYuanSheZhi: TMenuItem;
NTuiChu: TMenuItem;
LabelCode: TLabel;
procedure FormShow(Sender: TObject);
procedure ReadData(Sender: Tobject);
Procedure DrawLineInIt(Sender: Tobject);
Procedure DrawLine(Sender: Tobject);
Procedure MoveLineLeft(Sender: Tobject);
Procedure MoveLineRight(Sender: Tobject);
Procedure MoveLineHome(Sender: Tobject);
Procedure MoveLineEnd(Sender: Tobject);
Procedure DrawNowLine(Sender: Tobject);
procedure EditCodeKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure PaintBoxMainPaint(Sender: TObject);
procedure NTuiChuClick(Sender: TObject);
procedure NShuJuYuanSheZhiClick(Sender: TObject);
procedure PaintBoxMainMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormKXianMain: TFormKXianMain;
CurrentX,MouseX,MouseY:Integer;
PaintHeight,PaintWidth,TopY,BottomY,LeftX,RightX:Integer;
MaxJg,MinJg,DefaultWidth,DayCount:Integer;
HeightXiShu:Double;
CurrentCode:String;
BeginDate,EndDate,LeftDate,RightDate,CurrentDate:Integer;
PageTopY,PageMidY,PageLowY:Integer;
DayPathName:String;
//证券信息数据
ZqdmData,ZqjcData,ZqkjmData:Array of String;
ZqzgbData,ZqltgbData:Array of Integer;
ZqRecordNo,ZqRecordCount:Integer;
//日线数据定义
DayData:Array of Array of Integer;
implementation
uses UnitShuJuYuan;
{$R *.DFM}
Function ZqdmFind(Zqdm:String):Integer;
Var I:Integer;
Begin
ZqdmFind:=-1;
I:=0;
While (I<ZqRecordCount) Do
Begin
If Trim(UpperCase(ZqdmData[I]))<>Trim(UpperCase(Zqdm)) Then
I:=I+1
Else
Begin
ZqdmFind:=I;
ZqRecordNo:=I;
Exit;
End;
End;
End;
Function ZqkjmFind(Zqkjm:String):Integer;
Var I:Integer;
Begin
ZqkjmFind:=-1;
I:=0;
While (I<ZqRecordCount) Do
Begin
If Trim(UpperCase(ZqkjmData[I]))<>Trim(UpperCase(Zqkjm)) Then
I:=I+1
Else
Begin
ZqkjmFind:=I;
ZqRecordNo:=I;
Exit;
End;
End;
End;
procedure TFormKXianMain.FormShow(Sender: TObject);
Var ShuJuYuanFile,ZqxxFile:TextFile;
Var TempString:String;
Var I:integer;
begin
Try
PaintHeight:=PaintBoxMain.Height;
PaintWidth:=PaintBoxMain.Width;
DefaultWidth:=9;
LeftX:=100;
RightX:=120;
TopY:=20;
BottomY:=20;
DayPathName:='';
DayCount:=-1;
CurrentCode:='';
BeginDate:=0;
EndDate:=0;
LeftDate:=0;
RightDate:=0;
If FileExists('ShuJu.Txt') Then
Begin
AssignFile(ShuJuYuanFile, 'ShuJu.Txt');
FileMode:=0; //Set file access to read only
Reset(ShuJuYuanFile);
Readln(ShuJuYuanFile,TempString);
DayPathName:=TempString;
CloseFile(ShuJuYuanFile);
End;
If FileExists('Zqxx.Txt') Then
Begin
AssignFile(ZqxxFile, 'Zqxx.Txt');
FileMode := 0; //Set file access to read only
Reset(ZqxxFile);
ZqRecordCount:=0;
while not Eof(ZqxxFile) do
Begin
Readln(ZqxxFile,TempString);
Readln(ZqxxFile,TempString);
Readln(ZqxxFile,TempString);
Readln(ZqxxFile,TempString);
Readln(ZqxxFile,TempString);
ZqRecordCount:=ZqRecordCount+1;
End;
SetLength(ZqdmData,ZqRecordCount);
SetLength(ZqjcData,ZqRecordCount);
SetLength(ZqkjmData,ZqRecordCount);
SetLength(ZqzgbData,ZqRecordCount);
SetLength(ZqltgbData,ZqRecordCount);
Reset(ZqxxFile);
I:=0;
while not Eof(ZqxxFile) do
Begin
Readln(ZqxxFile,TempString);
ZqdmData[I]:=TempString;
Readln(ZqxxFile,TempString);
ZqjcData[I]:=TempString;
Readln(ZqxxFile,TempString);
ZqkjmData[I]:=TempString;
Readln(ZqxxFile,TempString);
ZqzgbData[I]:=StrToInt(TempString);
Readln(ZqxxFile,TempString);
ZqltgbData[I]:=StrToInt(TempString);
I:=I+1;
End;
End;
EditCode.Left:=PaintWidth-EditCode.Width-5;
LabelCode.Left:=EditCode.Left-LabelCode.Width-2;
Canvas.Brush.Color:=clblack;
Canvas.Brush.style:=bsSolid;
Canvas.FillRect(Rect(0,0,PaintWidth,PaintHeight));
ActiveControl:=EditCode;
Except
MessageDlg('初始化失败,程序退出!', mtInformation,[mbOk], 0);
End;
end;
Procedure TFormKXianMain.ReadData(Sender: Tobject);
Var I:Integer;
Var FileName:String;
Var DataFile:File;
Var DataDate: LongWord;
Var DataOpen: LongWord;
Var DataHigh: LongWord;
Var DataLow: LongWord;
Var DataClose: LongWord;
Var DataShuLiang: LongWord;
Var DataJinE: LongWord;
Var DataNoOne: LongWord;
Var DataNoTwo: LongWord;
Var DataNoThree: LongWord;
Begin
Try
DayCount:=0;
FileName:=DayPathName+'\'+CurrentCode+'.day';
If FileExists(FileName) Then
Begin
AssignFile(DataFile, Filename);
Reset(DataFile,1);
DayCount:=Round(FileSize(DataFile)/40);
//基本数据
SetLength(DayData,7);
For I := Low(DayData) to High(DayData) do
SetLength(DayData[I],DayCount);
I:=0;
while not Eof(DataFile) do
Begin
BlockRead(DataFile, DataDate, SizeOf(DataDate));
DayData[0][I]:=Not DataDate;
BlockRead(DataFile, DataOpen, SizeOf(DataOpen));
DayData[1][I]:=Not DataOpen; //Open
BlockRead(DataFile, DataClose, SizeOf(DataHigh));
DayData[4][I]:=Not DataClose; //Close
BlockRead(DataFile, DataHigh, SizeOf(DataLow));
DayData[2][I]:=Not DataHigh; //High
BlockRead(DataFile, DataLow, SizeOf(DataClose));
DayData[3][I]:=Not DataLow; //Low
BlockRead(DataFile, DataJinE, SizeOf(DataShuLiang));
DayData[5][I]:=Not DataJinE;//Jin E
BlockRead(DataFile, DataShuLiang, SizeOf(DataJinE));
DayData[6][I]:=Not DataShuLiang;//Shu Liang
BlockRead(DataFile, DataNoOne, SizeOf(DataNoOne));
BlockRead(DataFile, DataNoTwo, SizeOf(DataNoTwo));
BlockRead(DataFile, DataNoThree, SizeOf(DataNoThree));
I:=I+1;
End;
CloseFile(DataFile);
End//数据文件存在
Else
MessageDlg('数据文件不存在,请重试!', mtInformation,[mbOk], 0);
Except
MessageDlg('文件读写错误,请重试!', mtInformation,[mbOk], 0);
End;
End;
Procedure TFormKXianMain.DrawLineInIt(Sender: Tobject);
Var I,FlagExit,x1:Integer;
Begin
If DayCount>0 Then
Begin
BeginDate:=0;
EndDate:=DayCount-1;
x1:=LeftX;
FlagExit:=0;
I:=DayCount-1;
While (I>-1) And (FlagExit=0) Do
Begin
x1:=x1+DefaultWidth;
If (x1+DefaultWidth)>(PaintWidth-RightX) Then
FlagExit:=1
Else
I:=I-1;
End;
If (I=-1) Then
LeftDate:=0
Else
LeftDate:=I;
RightDate:=DayCount-1;
CurrentDate:=DayCount-1;
CurrentX:=x1-Round((DefaultWidth+1)/2);
End;
End;
Procedure TFormKXianMain.DrawLine(Sender: Tobject);
Var kpjg,spjg,zgjg,zdjg:Integer;
Var x1,x2,y1,y2,x3,y3,x4,y4:Integer;
Var I,Kheight:Integer;
Var TempString,OutStr:String;
Var TempLen,StrLen:Integer;
Begin
If DayCount>0 Then
Begin
//清空屏幕
Canvas.Brush.Color:=clblack;
Canvas.Brush.style:=bsSolid;
Canvas.FillRect(Rect(0,0,PaintWidth,PaintHeight));
//左边竖直线
Canvas.Pen.Color:=clRed;
Canvas.MoveTo(LeftX-1,0);
Canvas.LineTo(LeftX-1,PaintHeight);
//上边水平线
Canvas.MoveTo(0,TopY);
Canvas.LineTo(PaintWidth,TopY);
//右边竖直线
Canvas.MoveTo(PaintWidth-RightX,TopY);
Canvas.LineTo(PaintWidth-RightX,PaintHeight);
//下边水平线
Canvas.MoveTo(0,PaintHeight-BottomY);
Canvas.LineTo(PaintWidth-RightX,PaintHeight-BottomY);
PageTopY:=PaintHeight-BottomY;
Canvas.Pen.Style:=psDot;
Canvas.Pen.Color:=clMaroon;
Canvas.MoveTo(LeftX-1,Round(PageTopY/3));
Canvas.LineTo(PaintWidth-RightX,Round(PageTopY/3));
Canvas.MoveTo(LeftX-1,Round(2*PageTopY/3));
Canvas.LineTo(PaintWidth-RightX,Round(2*PageTopY/3));
Canvas.Pen.style:=psSolid;
//求价格的最大、最小值
Maxjg:=DayData[2][LeftDate];
MinJg:=DayData[3][LeftDate];
I:=LeftDate;
While (I<RightDate) Or (I=RightDate) Do
Begin
If DayData[2][I]>MaxJg Then
MaxJg:=DayData[2][I];
If DayData[3][I]<MinJg Then
MinJg:=DayData[3][I];
I:=I+1;
End;
//画右侧成交价格坐标数值
OutStr:='.';
Canvas.Font.Color := clRed;
Canvas.Brush.Color:=clBlack;
Canvas.Font.Size:=11;
Canvas.Font.name:='宋体';
Canvas.Brush.style:=bsSolid;
Canvas.Pen.color:=clred;
TempString:=IntToStr(Round(MinJg+(MaxJg-MinJg)*2/3));
TempLen:=Length(TempString);
Insert(OutStr,TempString,TempLen-2);
StrLen:=Length(TempString);
If TempString[StrLen]='0' Then
TempString[StrLen]:=' ';
Canvas.TextOut(PaintWidth-RightX+2,Round(PageTopY/3)-9,TempString);
TempString:=IntToStr(Round(MinJg+(MaxJg-MinJg)/3));
TempLen:=Length(TempString);
Insert(OutStr,TempString,TempLen-2);
StrLen:=Length(TempString);
If TempString[StrLen]='0' Then
TempString[StrLen]:=' ';
Canvas.TextOut(PaintWidth-RightX+2,Round(PageTopY*2/3)-9,TempString);
//画K线图
Kheight:=PageTopY-TopY-10;
HeightXiShu:=(MaxJg-MinJg)/Kheight;
x1:=LeftX-DefaultWidth;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -