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

📄 unit1.pas

📁 介绍了如何用delphi来制作数据库报表系统
💻 PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, Grids, DBGrids, DBTables, ExtCtrls, ComCtrls, TeEngine,
  Series, TeeProcs, Chart, DbChart, StdCtrls, Menus;

type
  //定义一个记录类型,用于表示各薪酬段的区间及名字
  TSalary=record
    Min,Max:single;  //薪酬段按薪酬划分,现定义其上下限
    count:integer;   //该区间段的雇员数目
    Title:string;    //该区间段的名称
  end;
  //定义一个记录类型,用于表示各工作资历段的区间及名字
  TZili=record
    Min,Max:TDatetime;  //工作资历段按签约时间划分,现定义其上下限
    count:integer;      //该区间段的雇员数目
    Title:string;       //该区间段的名称
  end;
type
  TForm1 = class(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    DBChart1: TDBChart;
    Series1: TBarSeries;
    RadioGroup1: TRadioGroup;
    Series2: TLineSeries;
    Series3: TPieSeries;
    PopupMenu1: TPopupMenu;
    N3D1: TMenuItem;
    N1: TMenuItem;
    N2: TMenuItem;
    Timer1: TTimer;
    RadioGroup2: TRadioGroup;
    DBChart2: TDBChart;
    Series4: TBarSeries;
    Series5: TLineSeries;
    Series6: TPieSeries;
    procedure FormShow(Sender: TObject);
    procedure RadioGroup1Click(Sender: TObject);
    procedure PageControl1Change(Sender: TObject);
    procedure N3D1Click(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure RadioGroup2Click(Sender: TObject);
    procedure PopupMenu1Popup(Sender: TObject);
  private
    //显示折线图
    procedure ShowLine(index:integer);
    //显示直方图
    procedure ShowBar(index:integer);
    //显示饼图
    procedure ShowPie(index:integer);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  //定义了5个薪酬段
  ASalary:array[0..4] of TSalary;
  //定义了3个工作资历段
  AZili:array[0..2] of TZili;

implementation

uses Unit2;

{$R *.dfm}

//窗口显示
procedure TForm1.FormShow(Sender: TObject);
begin
  //打开数据库的表
  DM.table1.Open;
  //初始化5个薪酬段
  ASalary[0].Min:=0;
  ASalary[0].Max:=10000;
  ASalary[0].count:=0;
  ASalary[0].Title:='低收入';
  ASalary[1].Min:=10000;
  ASalary[1].Max:=20000;
  ASalary[1].count:=0;
  ASalary[1].Title:='中低收入';
  ASalary[2].Min:=20000;
  ASalary[2].Max:=30000;
  ASalary[2].count:=0;
  ASalary[2].Title:='中收入';
  ASalary[3].Min:=30000;
  ASalary[3].Max:=40000;
  ASalary[3].count:=0;
  ASalary[3].Title:='中高收入';
  ASalary[4].Min:=40000;
  ASalary[4].Max:=100000;
  ASalary[4].count:=0;
  ASalary[4].Title:='高收入';
  //初始化3个资历段
  AZili[0].Min:=strtodatetime('1992-1-1');
  AZili[0].Max:=date;
  AZili[0].count:=0;
  Azili[0].Title:='资历较浅';
  AZili[1].Min:=strtodatetime('1990-1-1');
  AZili[1].Max:=strtodatetime('1992-1-1');
  AZili[1].count:=0;
  Azili[1].Title:='资历一般';
  AZili[2].Min:=strtodatetime('1980-1-1');
  AZili[2].Max:=strtodatetime('1990-1-1');
  AZili[2].count:=0;
  Azili[2].Title:='资历较深';
end;

//选择薪酬分布图的图表样式
procedure TForm1.RadioGroup1Click(Sender: TObject);
var
  i:integer;
begin
  //先将各个区间段的数目清零
  for i:=0 to 4 do
  begin
    ASalary[i].count:=0;
  end;
  //判断选择的是哪种样式
  case RadioGroup1.ItemIndex of
    0:
    begin
      //选择直方图
      ShowBar(1);
    end;
    1:
    begin
      //选择折线图
      ShowLine(1);
    end;
    2:
    begin
      //选择饼图
      ShowPie(1);
    end;
  end;
end;
//选择工作资历分布图的图表样式
procedure TForm1.RadioGroup2Click(Sender: TObject);
var
  i:integer;
begin
  //先将各个区间段的数目清零
  for i:=0 to 2 do
  begin
    AZili[i].count:=0;
  end;
  //判断选择的是哪种样式
  case RadioGroup2.ItemIndex of
    0:
    begin
      //选择直方图
      ShowBar(2);
    end;
    1:
    begin
      //选择折线图
      ShowLine(2);
    end;
    2:
    begin
      //选择饼图
      ShowPie(2);
    end;
  end;
end;
//显示直方图
procedure TForm1.ShowBar(index: integer);
var
  salary:single;
  hiredate:Tdatetime;
  i:integer;
begin
  //判断当前操作的是哪个图
  case index of
    1:
    //当前为薪酬分布图
    begin
      DM.table1.First;
      while not DM.table1.Eof do
      begin
        //取得当前雇员的薪酬数
        salary:=DM.table1.fieldbyname('salary').AsFloat;
        //统计各薪酬段的数目
        for i:=0 to 4 do
        begin
          if (Salary>=ASalary[i].Min) and (Salary<ASalary[i].Max) then
            ASalary[i].count:=ASalary[i].count+1;
        end;
        DM.table1.Next;
      end;
      //显示直方图
      DBChart1.Series[0].Clear;
      DBChart1.Series[1].Clear;
      DBChart1.Series[2].Clear;
      for i:=1 to 5 do
      begin
        //为直方图添加五个数据点
        DBChart1.Series[0].AddXY(i,ASalary[i-1].count,ASalary[i-1].Title,);
      end;
      DBChart1.Series[0].Active:=True;
      DBChart1.Series[1].Active:=False;
      DBChart1.Series[2].Active:=False;
    end;
    2:
    //当前为工作资历分布图
    begin
      DM.table1.First;
      while not DM.table1.Eof do
      begin
        //取得当前雇员的签约日期
        hiredate:=DM.table1.fieldbyname('hiredate').AsDateTime;
        //统计各资历段的数目
        for i:=0 to 2 do
        begin
          if (hiredate>=AZili[i].Min) and (hiredate<AZili[i].Max) then
            AZili[i].count:=AZili[i].count+1;
        end;
        DM.table1.Next;
      end;
      //显示直方图
      DBChart2.Series[0].Clear;
      DBChart2.Series[1].Clear;
      DBChart2.Series[2].Clear;
      for i:=1 to 3 do
      begin
        //为直方图添加三个数据点
        DBChart2.Series[0].AddXY(i,AZili[i-1].count,AZili[i-1].Title,);
      end;
      DBChart2.Series[0].Active:=True;
      DBChart2.Series[1].Active:=False;
      DBChart2.Series[2].Active:=False;
    end;
  end;
end;
//显示折线图
procedure TForm1.ShowLine(index: integer);
var
  salary:single;
  hiredate:Tdatetime;
  i:integer;
begin
  case index of
    1:
    begin
      DM.table1.First;
      while not DM.table1.Eof do
      begin
        salary:=DM.table1.fieldbyname('salary').AsFloat;
        for i:=0 to 4 do
        begin
          if (Salary>=ASalary[i].Min) and (Salary<ASalary[i].Max) then
            ASalary[i].count:=ASalary[i].count+1;
        end;
        DM.table1.Next;
      end;
      DBChart1.Series[0].Clear;
      DBChart1.Series[1].Clear;
      DBChart1.Series[2].Clear;
      for i:=1 to 5 do
      begin
        DBChart1.Series[1].AddXY(i,ASalary[i-1].count,ASalary[i-1].Title,);
      end;
      DBChart1.Series[1].Active:=True;
      DBChart1.Series[0].Active:=False;
      DBChart1.Series[2].Active:=False;
    end;
    2:
    begin
      DM.table1.First;
      while not DM.table1.Eof do
      begin
        hiredate:=DM.table1.fieldbyname('hiredate').AsDateTime;
        for i:=0 to 2 do
        begin
          if (hiredate>=AZili[i].Min) and (hiredate<AZili[i].Max) then
            AZili[i].count:=AZili[i].count+1;
        end;
        DM.table1.Next;
      end;
      DBChart2.Series[0].Clear;
      DBChart2.Series[1].Clear;
      DBChart2.Series[2].Clear;
      for i:=1 to 3 do
      begin
        DBChart2.Series[1].AddXY(i,AZili[i-1].count,AZili[i-1].Title,);
      end;
      DBChart2.Series[1].Active:=True;
      DBChart2.Series[0].Active:=False;
      DBChart2.Series[2].Active:=False;
    end;
  end;

end;
//显示饼图
procedure TForm1.ShowPie(index: integer);
var
  salary:single;
  hiredate:Tdatetime;
  i:integer;
begin
  case index of
    1:
    begin
      DM.table1.First;
      while not DM.table1.Eof do
      begin
        salary:=DM.table1.fieldbyname('salary').AsFloat;
        for i:=0 to 4 do
        begin
          if (Salary>=ASalary[i].Min) and (Salary<ASalary[i].Max) then
            ASalary[i].count:=ASalary[i].count+1;
        end;
        DM.table1.Next;
      end;
      DBChart1.Series[0].Clear;
      DBChart1.Series[1].Clear;
      DBChart1.Series[2].Clear;
      for i:=1 to 5 do
      begin
        DBChart1.Series[2].AddXY(i,ASalary[i-1].count,ASalary[i-1].Title,);
      end;
      DBChart1.Series[2].Active:=True;
      DBChart1.Series[0].Active:=False;
      DBChart1.Series[1].Active:=False;
    end;
    2:
    begin
      DM.table1.First;
      while not DM.table1.Eof do
      begin
        hiredate:=DM.table1.fieldbyname('hiredate').AsDateTime;
        for i:=0 to 2 do
        begin
          if (hiredate>=AZili[i].Min) and (hiredate<AZili[i].Max) then
            AZili[i].count:=AZili[i].count+1;
        end;
        DM.table1.Next;
      end;
      DBChart2.Series[0].Clear;
      DBChart2.Series[1].Clear;
      DBChart2.Series[2].Clear;
      for i:=1 to 3 do
      begin
        DBChart2.Series[2].AddXY(i,AZili[i-1].count,AZili[i-1].Title,);
      end;
      DBChart2.Series[2].Active:=True;
      DBChart2.Series[0].Active:=False;
      DBChart2.Series[1].Active:=False;
    end;
  end;

end;

procedure TForm1.PageControl1Change(Sender: TObject);
var
  i:integer;
begin
  //判断当前操作的是哪个页面
  case PageControl1.ActivePageIndex of
    0:
      ;
    1:
    begin
      //如果是薪酬分布图页面,则先将薪酬段数目清零
      for i:=0 to 2 do
      begin
        ASalary[i].count:=0;
      end;
      //默认显示直方图
      RadioGroup1.ItemIndex:=0;
      ShowBar(1);
    end;
    2:
    begin
      //如果是工作资历分布图页面,则先将工作资历段数目清零
      for i:=0 to 2 do
      begin
        AZili[i].count:=0;
      end;
      //默认显示直方图
      RadioGroup2.ItemIndex:=0;
      ShowBar(2);
    end;
  end;
end;
//3D
procedure TForm1.N3D1Click(Sender: TObject);
begin
  case PageControl1.ActivePageIndex of
    1:
      //立体显示薪酬分布图表
      DBChart1.View3D:=not DBChart1.View3D;
    2:
      //立体显示工作资历分布图表
      DBChart2.View3D:=not DBChart2.View3D;
  end;
end;
//旋转
procedure TForm1.N1Click(Sender: TObject);
begin
  //若当前为饼图,则启动定时器,使图表转动
  if (DBChart1.Series[2].Active) or (DBChart2.Series[2].Active) then
    Timer1.Enabled:=not Timer1.Enabled;
end;
//响应定时器事件
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  case PageControl1.ActivePageIndex of
    1:
      //转动薪酬分布饼图
      (DBChart1.Series[2] as TPieSeries).Rotate(10);
    2:
      //转动工作资历分布饼图
      (DBChart2.Series[2] as TPieSeries).Rotate(10)
  end;
end;



procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
  //若当前图表不是饼图,则"旋转"功能子菜单不能用
  case PageControl1.ActivePageIndex of
    1:
    begin
      if DBChart1.Series[2].Active then
        N1.Enabled:=True
      else
        N1.Enabled:=False;
    end;
    2:
    begin
      if DBChart2.Series[2].Active then
        N1.Enabled:=True
      else
        N1.Enabled:=False;
    end;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -