📄 statcurve360_f.pas
字号:
unit StatCurve360_F;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls, DB, ADODB, ComObj, StrUtils;
type
TTrackBarRePaintType = (
mNoPaintBar, //未画线
mRePaintBar); //重画
TRePaintType = (
mNoPaint, //未画线
mRePaint, //重画
mPaintNext); //画新的线
rPoint = record //定义坐标上的点
x,y:single;
end;
rLine=array[0..59] of rPoint; //定义由100个点的连成的曲线
TfrmStatCurve360 = class(TForm)
panMain: TPanel;
GroupBox1: TGroupBox;
StatusBar1: TStatusBar;
Label1: TLabel;
edtCarLicense: TEdit;
Label9: TLabel;
edtLicenseColor: TEdit;
btnSelect: TButton;
btnOK: TButton;
GroupBox3: TGroupBox;
btnClose: TButton;
Label2: TLabel;
imgCanvas: TImage;
pbCanvas: TPaintBox;
ADOConnection: TADOConnection;
ADOQuery: TADOQuery;
lab_X: TLabel;
lab_Y: TLabel;
lab_Z: TLabel;
btnPrint: TButton;
btnDataList: TButton;
lbCarLicList: TListBox;
labCarType: TLabel;
labStartTime: TLabel; //点击时间轴后画标记线
procedure OriginAndScale(Sender: TObject); //确定坐标原点位置和刻度长度
procedure EstablishXYWorld(imgCanvas: TImage); //画坐标系
procedure XYWorldToScreen(x, y: single; var xx, yy: integer); //把xy坐标转换成屏幕坐标
procedure pMoveTo(x, y: single; pbCanvas: TPaintBox); //移动画笔到(x,y)点
procedure pLineTo(x, y: single; pbCanvas: TPaintBox); //从当前点画线到(x,y)点
procedure pPolyline(rl: rLine; pbCanvas: TPaintBox); //连接所有点
procedure SetPaintBoxPosition(imgCanvas: TImage; pbCanvas: TPaintBox);
procedure DrawLine;
procedure btnCloseClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure pbCanvasMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
function getData(strRealTime:String):Boolean;
procedure btnOKClick(Sender: TObject);
procedure pbCanvasPaint(Sender: TObject);
procedure btnPrintClick(Sender: TObject);
procedure btnSelectClick(Sender: TObject);
procedure btnDataListClick(Sender: TObject);
procedure edtCarLicenseDblClick(Sender: TObject);
procedure lbCarLicListClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure edtCarLicenseKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmStatCurve360: TfrmStatCurve360;
intPerHourScale: integer;
intDayScale:integer;
intSelected_x: integer;
x_min,y_min,x_max,y_max:integer; //在坐标系中的xy的最值相对于paintbox容器的实际位置
x_scale,y_scale:integer; //x和y轴1刻度的实际象素值
px_min,py_min,px_max,py_max:integer;
tmpLine: rLine;
rePaintType:TRePaintType;
old_x,old_y:integer;
DotNum:integer;
intStartTime: integer;
implementation
uses
StatCurve360_IMP, StatCurve360_DataList_F;
{$R *.dfm}
procedure TfrmStatCurve360.btnCloseClick(Sender: TObject);
begin
frmDataList.Close;
Close;
end;
procedure TfrmStatCurve360.FormCreate(Sender: TObject);
var
i: Integer;
strSql: String;
begin
ADOConnection.ConnectionString := DataString;
ADOConnection.Connected := True;
rePaintType:=mNoPaint;
pbCanvas.Refresh;
SetPaintBoxPosition(imgCanvas,pbCanvas);
OriginAndScale(Sender);
EstablishXYWorld(imgCanvas);
old_x:=-1;
old_y:=-1;
//DrawLine;
DotNum:=60;//length(tmpLine);
strSql:='select Car_PRovince_Type from List_Car_Province';
ADOQuery.Close;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add(strSql);
ADOQuery.Open;
for i:=0 to ADOQuery.RecordCount-1 do
begin
lbCarLicList.Items.Add(ADOQuery.FieldByName('Car_PRovince_Type').AsString+'-');
ADOQuery.Next;
end;
end;
procedure TfrmStatCurve360.OriginAndScale(Sender: TObject);
begin
x_min:=30;
y_min:=imgCanvas.Height-30;
x_max:=imgCanvas.Width-30;
y_max:=30;
x_scale:=trunc((x_max-x_min-5)/60); //x轴1刻度的象素
y_scale:=trunc((y_min-y_max-5)/180); //y轴1刻度的象素
end;
procedure TfrmStatCurve360.EstablishXYWorld(imgCanvas: TImage);
var
i,j:integer;
begin
imgCanvas.Canvas.Pen.Color:=clBlack; //黑色画笔
imgCanvas.Canvas.MoveTo(0,0);
imgCanvas.Canvas.LineTo(imgCanvas.Width-1,0);
imgCanvas.Canvas.LineTo(imgCanvas.Width-1,imgCanvas.Height-1);
imgCanvas.Canvas.LineTo(0,imgCanvas.Height-1);
imgCanvas.Canvas.LineTo(0,0); //画四周边框
imgCanvas.Canvas.MoveTo(x_min,y_min);
imgCanvas.Canvas.LineTo(x_max,y_min);
imgCanvas.Canvas.LineTo(x_max-7,y_min-7);
imgCanvas.Canvas.MoveTo(x_max,y_min);
imgCanvas.Canvas.LineTo(x_max-7,y_min+7);
imgCanvas.Canvas.Font.Size:=8;
imgCanvas.Canvas.TextOut(x_max+3,y_min-8,'时间'); //画x轴
imgCanvas.Canvas.TextOut(x_max+3,y_min+6,'(min)');
imgCanvas.Canvas.MoveTo(x_min,y_min);
imgCanvas.Canvas.LineTo(x_min,y_max);
imgCanvas.Canvas.LineTo(x_min,y_max);
imgCanvas.Canvas.LineTo(x_min-5,y_max+10);
imgCanvas.Canvas.MoveTo(x_min,y_max);
imgCanvas.Canvas.LineTo(x_min+5,y_max+10);
imgCanvas.Canvas.Font.Size:=4;
//imgCanvas.Canvas.TextOut(x_min-25,y_max-20,'v(km/h)'); //画y轴
imgCanvas.Canvas.TextOut(x_min-30,y_max+15,'速度'); //画y轴
imgCanvas.Canvas.TextOut(x_min-30,y_max+30,'(km/h)');
imgCanvas.Canvas.Font.Size:=8;
imgCanvas.Canvas.TextOut(x_min-16,y_min+5,'0'); //坐标原点
//imgCanvas.Canvas.TextOut(x_min-40,y_max+18,'开关量');
i:=y_min;
j:=0;
while (i>y_max+20) and (j<180) do
begin
i:=i-10*y_scale;
j:=j+10;
imgCanvas.Canvas.MoveTo(x_min,i);
imgCanvas.Canvas.LineTo(x_min+4,i);
imgCanvas.Canvas.TextOut(x_min-22,i,intToStr(j));
end; //画y轴刻度
x_scale:=trunc((x_max-x_min-5)/60); //x轴1刻度的象素
i:=x_min;
j:=0;
while (i<x_max-5) and (j<60) do
begin
i:=i+x_scale*10;
j:=j+10;
if j mod 10=0 then
begin
imgCanvas.Canvas.MoveTo(i,y_min);
imgCanvas.Canvas.LineTo(i,y_min-7);
imgCanvas.Canvas.TextOut(i,y_min+5,intToStr(j div 10)+'0');
end
else
begin
imgCanvas.Canvas.MoveTo(i,y_min);
imgCanvas.Canvas.LineTo(i,y_min-4);
end;
end; //画x轴刻度
end;
procedure TfrmStatCurve360.XYWorldToScreen(x, y: single; var xx, yy: integer);
begin
xx:=trunc(x*x_scale);
yy:=trunc(py_min-y*y_scale);
end;
procedure TfrmStatCurve360.pMoveTo(x, y: single; pbCanvas: TPaintBox);
var
sx, sy: integer;
begin
XYWorldToScreen(x, y, sx, sy); //把XY系坐标转换为实际坐标
pbCanvas.Canvas.MoveTo(sx, sy); //移动刷子到要画的点
end;
procedure TfrmStatCurve360.pLineTo(x, y: single; pbCanvas: TPaintBox);
var
sx, sy: integer;
begin
XYWorldToScreen(x, y, sx, sy); //把XY系坐标转换为实际坐标
pbCanvas.Canvas.LineTo(sx, sy); //连接两点
end;
procedure TfrmStatCurve360.pPolyline(rl: rLine; pbCanvas: TPaintBox);
var
i: integer;
begin
pbCanvas.Canvas.Pen.Color:=clRed;
pMoveto(rl[0].x, rl[0].y, pbCanvas);
for i := 1 to DotNum-1 do
begin
if rl[i].x-rl[i-1].x<>1 then
begin
pLineto(rl[i-1].x+1, rl[i-1].y, pbCanvas);
pMoveto(rl[i].x, rl[i].y, pbCanvas);
Continue;
end;
pLineto(rl[i].x, rl[i].y, pbCanvas);
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -