⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 statcurve360_f.pas

📁 汽车行驶记录仪360小时的全程速度时间曲线图的组件。
💻 PAS
📖 第 1 页 / 共 2 页
字号:
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 + -