惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Simon Willison's Weblog
Simon Willison's Weblog
P
Privacy International News Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Troy Hunt's Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
Attack and Defense Labs
Attack and Defense Labs
S
Secure Thoughts
V2EX - 技术
V2EX - 技术
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
O
OpenAI News
Cloudbric
Cloudbric
Google Online Security Blog
Google Online Security Blog
Schneier on Security
Schneier on Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Help Net Security
Help Net Security
Cyberwarzone
Cyberwarzone
G
GRAHAM CLULEY
L
Lohrmann on Cybersecurity
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Spread Privacy
Spread Privacy
NISL@THU
NISL@THU
N
News and Events Feed by Topic
T
Tenable Blog
S
Security @ Cisco Blogs
N
News and Events Feed by Topic
The Hacker News
The Hacker News
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google DeepMind News
Google DeepMind News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
P
Proofpoint News Feed
Webroot Blog
Webroot Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 三生石上(FineUI控件)
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Jina AI
Jina AI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
L
LangChain Blog
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东

博客园 - xi.Tran B2-448

Exception 微笑性抑郁症测试 抑郁症的自我测试 微软面试100题 我的linuxES 永远的Beatles 寂寞的圣诞节 星座人性之最 朋友难当 针对ARP协议的病毒攻击的简单分析 我是怎么了 我想飞在歌声响起的夜晚 幼稚 镜子 so long 圣诞节,李智归来! 生日快乐 Hibernate 黄色的烟灰缸
delphi打印实现(节选)
xi.Tran B2-448 · 2006-08-15 · via 博客园 - xi.Tran B2-448

{$R *.dfm}
procedure SetPaperHeight(Value:integer);   //设置纸张高度-单位:mm
var
  Device : array[0..255] of char;
  Driver : array[0..255] of char;
  Port : array[0..255] of char;
  hDMode : THandle;
  PDMode : PDEVMODE;
begin
if Value < 127 then Value := 127;   //自定义纸张最小高度127mm
  if Value > 432 then Value := 432; //自定义纸张最大高度432mm
    Printer.PrinterIndex := Printer.PrinterIndex;
    Printer.GetPrinter(Device, Driver, Port, hDMode);
    if hDMode <> 0 then
      begin
        pDMode := GlobalLock(hDMode);
        if pDMode <> nil then
        begin
          pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE or
                              DM_PAPERLENGTH;
          pDMode^.dmPaperSize := DMPAPER_USER;
          pDMode^.dmPaperLength := Value * 10;
          pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
          pDMode^.dmDefaultSource := DMBIN_MANUAL;
          GlobalUnlock(hDMode);
        end;
      end;
      Printer.PrinterIndex := Printer.PrinterIndex;
end;

procedure SetPaperWidth(Value:integer);  //设置纸张宽度:单位--mm
var
  Device : array[0..255] of char;
  Driver : array[0..255] of char;
  Port : array[0..255] of char;
  hDMode : THandle;
  PDMode : PDEVMODE;
begin
if Value < 76 then Value := 76;      //自定义纸张最小宽度76mm
  if Value > 216 then Value := 216;  //自定义纸张最大宽度216mm
    Printer.PrinterIndex := Printer.PrinterIndex;
    Printer.GetPrinter(Device, Driver, Port, hDMode);
    if hDMode <> 0 then
    begin
      pDMode := GlobalLock(hDMode);
      if pDMode <> nil then
      begin
        pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE or
                            DM_PAPERWIDTH;
        pDMode^.dmPaperSize := DMPAPER_USER;
        pDMode^.dmPaperWidth := Value * 10;    //将毫米单位转换为0.1mm单位
        pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
        pDMode^.dmDefaultSource := DMBIN_MANUAL;
        GlobalUnlock(hDMode);
      end;
    end;
    Printer.PrinterIndex := Printer.PrinterIndex;
end;


//======================================绘基础几何图型函数======================

//--------------------圆--------------------------------------------------------
procedure _Circle(x,y,r,N:real);
var
  IntLineWidth:Integer;
begin
  x:=x*mm_H;
  y:=y*mm_V;
  r:=r*mm_H;
  IntLineWidth:=Round(N*mm_H);
  MyCanvas.Pen.Width:=IntLineWidth;
  MyCanvas.Ellipse(round(x-r),round(y-r),round(x+r),round(y+r));
end;

function _outTxt(x,y:Real;Txt:String;FontSize:Real;FontName:String):Boolean;
var
  LogRec: TLOGFONT;
  OldFont, NewFont: HFONT;
  i: LongInt;
begin
//  case PrnMode of
{  1: begin
       with printer do
       begin
         GetObject(Canvas.Font.Handle, SizeOf(LogRec), @LogRec);
         LogRec.lfOutPrecision := OUT_TT_ONLY_PRECIS;
         LogRec.lfFaceName :='宋体';
         LogRec.lfHeight:=round(FontSize*mm_V);
         LogRec.lfWeight:=0;
         NewFont := CreateFontIndirect(LogRec);
         OldFont := SelectObject(Canvas.Handle,NewFont);
       end;
       x:=Round((x+PageLeft)*mm_H);
       y:=Round((y+PageTop)*mm_V);
       MyCanvas.TextOut(round(x),round(y),txt);
     end; }
 // 2:
   begin
       x:=Round((x+PageLeft)*mm_H);
       y:=Round((y+PageTop)*mm_V);
       MyCanvas.Font.Height:=round(FontSize*mm_V);
       MyCanvas.Font.Name:=FontName;
       MyCanvas.TextOut(round(x),round(y),txt);
     end;
// end;
end;

//移动坐标点
procedure _Move(x,y:Real);
begin
  Point1.X:=point1.X+round(x*mm_H);
  point1.Y:=Point1.Y+round(y*mm_V);
  MyCanvas.MoveTo(point1.X,point1.Y);
end;

procedure _line(x1,y1,x2,y2,LineWidth:Real);
var
  point2:TPoint;
  IntLineWidth:Integer;
begin
 // if x1+y1<>0 then
 _move(x1,y1);  //移动到起点坐标
  point2.X:=Point1.X+round(x2*mm_H);
  point2.Y:=Point1.Y+round(y2*mm_V);
  IntLineWidth:=Round(LineWidth*mm_H);  //输出线宽
  MyCanvas.Pen.Width:=IntLineWidth;     //设置线宽
  MyCanvas.LineTo(point2.X,point2.Y);
  point1:=point2;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  TmpQry : TADOQuery;
begin
  MyCanvas:=Image1.Canvas;
  ADOCOnnection1.Connected := false;
  ADOConnection1.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+GetCurrentDir()+'\data.mdb;Persist Security Info=False';
  ADOCOn:=ADOConnection1;
  ADOTable1.Active := true;
  TmpQry := OpenDB('select * from report order by ID',ADOCon);
  ComboBox1.Items.Clear;
  SetLength(TabIds,TmpQry.RecordCount);
  while not TmpQry.Eof do
  begin
    ComboBox1.Items.Add(VarToStr(TmpQry.FieldValues['Title']));
    TabIds[TmpQry.RecNo-1]:=TmpQry.FieldValues['id'];
    TmpQry.Next;
  end;
  if ComboBox1.Items.Count>0 then ComboBox1.ItemIndex :=0;
  TmpQry.Free
end;

procedure recover;
begin
  point1.X := round(PageLeft*mm_H);
  point1.Y := round(PageTop*mm_V);
end;

procedure _Grid(Id:Integer;Sql:String;Grid,Data:Boolean);
var
  TmpQry,TmpQry1 : TADOQuery;
  x1,y1,x2,y2,r,w,FontSize:real;
  txt : String;
  classId : Integer;
  FontName : TFontName ;          //显示使用的字体
  TmpColor:TColor;
begin
  if Sql<>'' then TmpQry1 := OpenDB(sql,ADOCon);
  Sql := 'select * from TableLib where hidden=0 and  tabId='+IntToStr(Id);
  if (not Grid) and (data) then sql:=sql+' and classId=4';
  if (grid) and (not data) then sql:=sql+' and classId<>4';

  TmpQry := OpenDB(Sql,ADOCon);
  while not TmpQry.Eof do
  begin
    x1 := TmpQry.FieldValues['x1'];
    y1 := TmpQry.FieldValues['y1'];
    w  := TmpQry.FieldValues['width'];
    if not TmpQry.FieldValues['relatively'] then recover;  //若非相对坐村,恢复原点
    ClassId := TmpQry.FieldValues['ClassId'];
    case ClassId of
      1 : begin  //标签
            txt := VarToStr(TmpQry.FieldValues['text']);
            if not TmpQry.FieldByName('FontSize').IsNull then
               FontSize := TmpQry.FieldValues['FontSize']
               else FontSize := 2.5;
            if not TmpQry.FieldByName('FontName').IsNull then
               FontName:=TmpQry.FieldValues['FontName']
               else FontName:='宋体';
               MyCanvas.Font.Style:=[];
               if TmpQry.FieldValues['FontBold'] then
                  MyCanvas.Font.Style:=[fsBold];
            _outTxt(x1,y1,txt,FontSize,FontName);
          end;
      2 : begin //直线
            x2 := TmpQry.FieldValues['x2'];
            y2 := TmpQry.FieldValues['y2'];
            _line(x1,y1,x2,y2,w);
          end;
      3 : begin //圆
            r  :=  TmpQry.FieldValues['r'];
            _circle(x1,y1,r,w);
          end;
      4 : begin  //字段
            if not TmpQry.FieldByName('text').IsNull then
            begin
               if not TmpQry1.FieldByName(TmpQry.FieldValues['text']).IsNull then
               begin
                  txt := VarToStr(TmpQry1.FieldValues[TmpQry.FieldValues['text']]);
                  if not TmpQry.FieldByName('FontSize').IsNull then
                     FontSize := TmpQry.FieldValues['FontSize']
                     else FontSize := 2.5;
                  if not TmpQry.FieldByName('FontName').IsNull then
                     FontName:=TmpQry.FieldValues['FontName']
                     else FontName:='宋体';
                     MyCanvas.Font.Style:=[];
                     if TmpQry.FieldValues['FontBold'] then
                        MyCanvas.Font.Style:=[fsBold];
                        TmpColor := MyCanvas.Font.Color;
                        MyCanvas.Font.Color := clBlack;
                        _outTxt(x1,y1,txt,FontSize,FontName);
                        MyCanvas.Font.Color := TmpColor;

               end;
            end;
          end;

    end;
    TmpQry.Next;
  end;
  TmpQry.Free;
end;

procedure _init(PageSize:TPoint);
begin
  case PrnMode of
    1: begin
       PhysicalWidth:=PageSize.x;                                     //物理页宽
       PhysicalHeight:=PageSize.Y;                                    //物理页高
       PageWidth:=printer.PageWidth;                                  //逻辑页宽
       PageHeight:=printer.PageHeight;                                //逻辑页高
       end;
    2: begin
       PageWidth:=PhysicalHeight;                                     //逻辑页宽
       PageHeight:=PhysicalHeight;                                    //逻辑页高
       end;
    end;
end;
//---------------------------------------------------------------------------------
procedure TForm1.OutPut(PrnMode:Integer;Grid,data:Boolean);
var
  PaperW,PaperH:integer;
  PrintDialog1:TPrintDialog;
  LogRec: TLOGFONT;
  OldFont, NewFont: HFONT;
  PageSize:Tpoint;
  pw,ph,PointX,PointY:Integer;  //纸张设置
  TabId : Integer;
  TmpQry :TADOQuery;
  Sql:String;
begin
  TabId := ComboBox1.ItemIndex+1;   //报表号
  Sql := 'select * from report where id='+IntToStr(TabId);
  TmpQry := OpenDb(Sql,ADOCon);
  if not TmpQry.Eof then
  begin
    PaperW   := TmpQry.FieldValues['PaperWidth'];
    paperH   := TmpQry.FieldValues['PaperHeight'];
    Sql := VarToStr(TmpQry.FieldValues['Sql']);

    if not ADOTable1.Eof then
      sql := _replace(sql,'@id@',VarToStr(ADOTable1.FieldValues['id']))
    else sql :='';

    PrintDialog1:=TPrintDialog.Create(nil);
    PageLeft := TmpQry.FieldValues['Left'];
    PageTop  := TmpQry.FieldValues['Top'];
    case PrnMode of
    1:  begin
          if PrintDialog1.Execute then
          begin
            SetPaperHeight(paperH);
            SetPaperWidth(PaperW);
            Escape(Printer.Handle, GETPHYSPAGESIZE, 0,nil,@PageSize);      //取得物理页尺寸
            PointX:=GetDeviceCaps(Printer.Handle,LOGPIXELSX);
            PointY:=GetDeviceCaps(Printer.Handle,LOGPIXELSY);
            mm_H:=PointX/25.4;
            mm_V:=PointY/25.4;
            _Init(PageSize);
            Printer.Title:=VarToStr(TmpQry.FieldValues['title']);
            MyCanvas := Printer.Canvas;
            Printer.BeginDoc;

            MyCanvas.Brush.Color:=clBlue;
            MyCanvas.Brush.Style := bsclear;
            MyCanvas.Pen.Color:=clGreen;
            MyCanvas.Font.Color := clGreen;
            Zoom:=TmpQry.FieldValues['Zoom'];
            mm_H := mm_H*zoom;
            mm_V := mm_V*zoom;
            _Grid(TabId,Sql,Grid,data);
            Printer.EndDoc;
          end;
        end;
    2:  begin
          mm_H:=2;
          mm_V:=2;
          Zoom := ComboBox2.ItemIndex+2 ;  //全局缩放比例
          mm_H := mm_H*zoom;
          mm_V := mm_V*zoom;
          Image1.Picture.Graphic.Width  := 1;
          Image1.Picture.Graphic.Height := 1;
          Image1.Width := Image1.Picture.Graphic.Width;
          Image1.Height := Image1.Picture.Graphic.Height;

          Image1.Picture.Graphic.Width  := round(PaperW*mm_H);
          Image1.Picture.Graphic.Height := round(PaperH*mm_V);
          Image1.Width := Image1.Picture.Graphic.Width;
          Image1.Height := Image1.Picture.Graphic.Height;


    Image1.Top:=10-ScrollBox1.VertScrollBar.Position;
    if Image1.Width+10>ScrollBox1.Width then
      Image1.Left:=0-ScrollBox1.HorzScrollBar.Position+2
    else
      Image1.Left:=((ScrollBox1.Width-Image1.Width) div 2)-8
                     -ScrollBox1.HorzScrollBar.Position;

    Image1.Canvas.Brush.Style := bsSolid;//   ---------清除预览画布上的残像
    Image1.Canvas.Brush.Color:=clWhite;
    Image1.Canvas.Pen.Color:=clWhite;
    Image1.Canvas.Rectangle(0,0,PageWidth,PageHeight);

    Shape1.Top:=Image1.Top+10;
    Shape1.Left:=Image1.Left+10;
    Shape1.Width:=Image1.Width;
    Shape1.Height:=Image1.Height;
    Shape1.Visible:=True;
    Image1.Visible := true;


          MyCanvas.Brush.Color :=clWhite;
          MyCanvas.FillRect(MyCanvas.ClipRect);  //清除残留影像
          MyCanvas:=Image1.Canvas;
          MyCanvas.Brush.Color:=clBlue;
          MyCanvas.Brush.Style := bsclear;
          MyCanvas.Pen.Color:=clGreen;
          MyCanvas.Font.Color := clGreen;
          Zoom:=TmpQry.FieldValues['Zoom'];
          mm_H := mm_H*zoom;
          mm_V := mm_V*zoom;
          _Grid(TabId,Sql,Grid,data);

        end;
    end;


   end;
   TmpQry.free;
end;
//-----------------------------------------------------------------------------------
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Start_Point.X:=x;
  Start_Point.Y:=y;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ScrollBox1.HorzScrollBar.Position:=  ScrollBox1.HorzScrollBar.Position+(Start_Point.X-x);
  ScrollBox1.VertScrollBar.Position:=  ScrollBox1.VertScrollBar.Position+(Start_Point.Y-y);
end;

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
  OutPut(1,checkBox1.Checked,checkBox2.Checked);
end;

procedure TForm1.ToolButton2Click(Sender: TObject);
begin
  OutPut(2,checkBox1.Checked,checkBox2.Checked);
end;

procedure TForm1.DBEdit10Change(Sender: TObject);
begin
 DBText1.caption := NumToChnStr(StrToFloat(DBEdit10.Text),false);
end;

procedure TForm1.DBEdit12Change(Sender: TObject);
begin
  DBText2.caption := NumToChnStr(StrToFloat(DBEdit12.Text),false);
end;

procedure TForm1.ADOTable1BeforePost(DataSet: TDataSet);
begin
  ADOTable1.FieldValues['cn_price'] := NumToChnStr(StrToFloat(DBEdit12.Text),false);
  ADOTable1.FieldValues['cn_rate'] := NumToChnStr(StrToFloat(DBEdit12.Text),false);
end;

procedure TForm1.PageControl1Change(Sender: TObject);
begin
  if ADOTable1.State = dsEdit then ADOTable1.Post;
  ToolButton2.Click;
end;

procedure TForm1.Shape1ContextPopup(Sender: TObject; MousePos: TPoint;
  var Handled: Boolean);
begin

end;

procedure TForm1.TabSheet2ContextPopup(Sender: TObject; MousePos: TPoint;
  var Handled: Boolean);
begin

end;

end.