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

📄 unit1.cpp

📁 有视频
💻 CPP
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <math.h>
#include <stdlib.h>
#include <printers.hpp>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  PrnDpi=180;
  TabLeft=100;
  TabTop=100;
}
//---------------------------------------------------------------------------
int __fastcall TForm1::ToSz(int nn)
{
  int ii;
  double aa;
  aa=nn;
  aa/=96;
  aa*=PrnDpi;
  ii=ceill(aa);
  return ii;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintText(TCanvas *cv,int xx,int yy,int ww,int hh,int indent,TAlignment al,AnsiString text)
{
  TRect rc;
  tagRECT drect;
  int cw,ch,fsz,ll;
  bool chgfsz=False;

  cw=cv->TextWidth(text);

  if((cw+2*indent)>ww)
  {
    fsz=cv->Font->Size;//保存字号,准备改变字号
    chgfsz=True;
    for(;;)
    {
      if(cv->Font->Size<=8)break;
      cv->Font->Size--;
      cw=cv->TextWidth(text);
      if((cw+2*indent)<=ww)break;
    }
  }
//
  cw=cv->TextWidth(text);
//超宽处理
  if((cw+2*indent)>ww)
  {
    drect.left=xx+indent;
    drect.top=yy+2;
    drect.right=xx+ww-indent;
    drect.bottom=yy+hh-2;
    ll=text.Length();
    DrawText(cv->Handle,text.c_str(),ll,&drect,DT_WORDBREAK);
  }
  else
  {
//按对齐方式输出文本
    ch=cv->TextHeight(text);
    ll=hh-ch;ll/=2;if(ll<1)ll=1;
    if(al==taLeftJustify)
    {
      cv->TextOut(xx+indent,yy+ll,text);
    }
    else if(al==taRightJustify)
    {
      xx=xx+ww-cw-indent;
      cv->TextOut(xx,yy+ll,text);
    }
    else
    {
      ch=ww-cw;ch/=2;
      cv->TextOut(xx+ch,yy+ll,text);
    }
  }
  if(chgfsz)cv->Font->Size=fsz;
}
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::GetFieldValue(TDataSet *Dset,AnsiString name)
{
  double aa;
  TDate dd;
  TField *field;
  AnsiString ass="";
  field=Dset->FindField(name);
  if(field==NULL)return ass;
  switch(field->DataType)
  {
    case ftString:
      ass=Dset->FieldByName(name)->AsString;
      break;
    case ftDate:
    case ftDateTime:
      dd=Dset->FieldByName(name)->AsDateTime;
      ass=DateToStr(dd);
      break;
    case ftInteger:
    case ftFloat:
      aa=Dset->FieldByName(name)->AsFloat;
      ass=FloatToStr(aa);
      break;
    default:
      break;
  }
  return ass;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if(OpenDialog1->Execute())
  {
    Query1->Active=False;
    Query1->SQL->Clear();
    Query1->SQL->Add("SELECT *");
    Query1->SQL->Add("From \""+OpenDialog1->FileName+"\"");
    Query1->Active=True;
  }
}
//---------------------------------------------------------------------------
int __fastcall TForm1::PrintTableTitle(TDBGrid *DGrid,TCanvas *cv,int x1,int y1)
{
  AnsiString ass;
  int TitleHeight,ii,nn,left,ww,top;
  left=x1;
  top=y1;

  cv->Font=DGrid->TitleFont;
  TitleHeight=Canvas->TextHeight("高度")*2;

  nn=DGrid->Columns->Count;
  for(ii=0;ii<nn;ii++)
  {
    ass=DGrid->Columns->Items[ii]->FieldName;
    ww=DGrid->Columns->Items[ii]->Width;
    if(ww>=6)
    {
      PaintText(cv,ToSz(left),ToSz(top),ToSz(ww),ToSz(TitleHeight),
        ToSz(1),DGrid->Columns->Items[ii]->Title->Alignment,ass);
      cv->MoveTo(ToSz(left),ToSz(top));
      cv->LineTo(ToSz(left),ToSz(top+TitleHeight));
      cv->LineTo(ToSz(left+ww),ToSz(top+TitleHeight));
      cv->LineTo(ToSz(left+ww),ToSz(top));
      cv->LineTo(ToSz(left),ToSz(top));
    }
    left=left+ww;
  }
  return TitleHeight;
}
//---------------------------------------------------------------------------
int __fastcall TForm1::PrintTableItem(TDBGrid *DGrid,TCanvas *cv,int x1,int y1)
{
  AnsiString ass;
  int ItemHeight,ii,nn,left,ww,top;
  left=x1;
  top=y1;

  cv->Font=DGrid->Font;
  ItemHeight=Canvas->TextHeight("高度")*2;

  nn=DGrid->Columns->Count;
  for(ii=0;ii<nn;ii++)
  {
    ass=GetFieldValue(DGrid->DataSource->DataSet,DGrid->Columns->Items[ii]->FieldName);
    ww=DGrid->Columns->Items[ii]->Width;
    if(ww>=6)
    {
      PaintText(cv,ToSz(left),ToSz(top),ToSz(ww),ToSz(ItemHeight),
        ToSz(1),DGrid->Columns->Items[ii]->Title->Alignment,ass);
      cv->MoveTo(ToSz(left),ToSz(top));
      cv->LineTo(ToSz(left),ToSz(top+ItemHeight));
      cv->LineTo(ToSz(left+ww),ToSz(top+ItemHeight));
      cv->LineTo(ToSz(left+ww),ToSz(top));
      cv->LineTo(ToSz(left),ToSz(top));
    }
    left=left+ww;
  }
  return ItemHeight;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  int top,lines,cot;
  TCanvas *cv;
  PrnDpi=GetDeviceCaps(Printer()->Handle,LOGPIXELSX);
  cv=Printer()->Canvas;
  Printer()->BeginDoc();
  SetBkMode(Printer()->Canvas->Handle,TRANSPARENT);
  Query1->First();
  top=TabTop;
  top+=PrintTableTitle(DBGrid1,cv,TabLeft,top);
  lines=atoi(Edit1->Text.c_str());
  if(lines<2)lines=2;
  cot=0;
  while(!Query1->Eof)
  {
    top+=PrintTableItem(DBGrid1,cv,TabLeft,top);
    Query1->Next();
    cot++;
    if(cot>lines)
    {
      cot=0;
      Printer()->NewPage();
      top=TabTop;
      top+=PrintTableTitle(DBGrid1,cv,TabLeft,top);
    }
  }
  Printer()->EndDoc();
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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