datasource连query
dbgrid 连 datasource
dbgrid 连 datasource
解决方案 »
- 程序打包
- 大家帮忙看一下我写的设置ListBox的横向滚动条的小程序,为什么显示得不对呢?
- 请问如何对日期型字段进行查询?
- 一个很菜的问题,一直听说用mscomm做串口编程,但不知道串口是指的计算机上哪个接口啊
- 在线等一个ClientSocket出错处理
- 如何用SQL语句创建远程服务器上的数据库,SQL SERVER 用Create dabatase 只能创建本地的,好象不能创建远程的数据库
- 关于RICHEDIT的问题。
- 大侠请进,求教数据库的问题?圣诞快乐!!
- 在做报表时,对于一些复杂的表格怎么去处理?
- 请教一个数据库问题和ftp问题。
- 关于目录结构的问题!!如果我有几十万个文件。。又要对它进行搜索,,该怎么安排它的目录才能使它的搜索快一点!!
- 求救!怎么把显示在DBGRID里面的数据输出到EXCEL里面?
或是你把dbgrid里的数据导入的临时表里也可以
interfaceuses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, Grids, DBGrids, DB, DBTables, Menus, StdCtrls, Spin,
Gauges, ExtCtrls, ComCtrls;type
TMainForm = class(TForm)
tblClients: TTable;
dsClients: TDataSource;
dbgColumns: TDBGrid;
mmMain: TMainMenu;
mmiFile: TMenuItem;
mmiPrint: TMenuItem;
lblLastName: TLabel;
lblColumns: TLabel;
lblFirstName: TLabel;
lblAddress: TLabel;
lblCity: TLabel;
lblState: TLabel;
lblZip: TLabel;
edtHeaderFont: TEdit;
lblHeader: TLabel;
btnHeaderFont: TButton;
FontDialog: TFontDialog;
edtLastName: TEdit;
edtFirstName: TEdit;
edtAddress: TEdit;
edtCity: TEdit;
edtState: TEdit;
edtZip: TEdit;
udLastName: TUpDown;
udFirstName: TUpDown;
udAddress: TUpDown;
udCity: TUpDown;
udState: TUpDown;
udZip: TUpDown;
procedure mmiPrintClick(Sender: TObject);
procedure btnHeaderFontClick(Sender: TObject);
private
PixelsInInchx: integer;
LineHeight: Integer;
{ Keeps track of vertical space in pixels, printed on a page }
AmountPrinted: integer;
{ Number of pixels in 1/10 of an inch. This is used for line spacing }
TenthsOfInchPixelsY: integer;
procedure PrintLine(Items: TStringList);
procedure PrintHeader;
procedure PrintColumnNames;
end;var
MainForm: TMainForm;implementation
uses printers, AbortFrm;{$R *.DFM}procedure TMainForm.PrintLine(Items: TStringList);
var
OutRect: TRect;
Inches: double;
i: integer;
begin
// First position the print rect on the print canvas
OutRect.Left := 0;
OutRect.Top := AmountPrinted;
OutRect.Bottom := OutRect.Top + LineHeight;
With Printer.Canvas do
for i := 0 to Items.Count - 1 do
begin
Inches := longint(Items.Objects[i]) * 0.1;
// Determine Right edge
OutRect.Right := OutRect.Left + round(PixelsInInchx*Inches);
if not Printer.Aborted then
// Print the line
TextRect(OutRect, OutRect.Left, OutRect.Top, Items[i]);
// Adjust right edge
OutRect.Left := OutRect.Right;
end;
{ As each line prints, AmountPrinted must increase to reflect how
much of a page has been printed on based on the line height. }
AmountPrinted := AmountPrinted + TenthsOfInchPixelsY*2;
end;procedure TMainForm.PrintHeader;
var
SaveFont: TFont;
begin
{ Save the current printer's font, then set a new print font based
on the selection for Edit1 }
SaveFont := TFont.Create;
try
Savefont.Assign(Printer.Canvas.Font);
Printer.Canvas.Font.Assign(edtHeaderFont.Font);
// First print out the Header
with Printer do
begin
if not Printer.Aborted then
Canvas.TextOut((PageWidth div 2)-(Canvas.TextWidth(edtHeaderFont.Text)
div 2),0, edtHeaderFont.Text);
// Increment AmountPrinted by the LineHeight
AmountPrinted := AmountPrinted + LineHeight+TenthsOfInchPixelsY;
end;
// Restore the old font to the Printer's Canvas property
Printer.Canvas.Font.Assign(SaveFont);
finally
SaveFont.Free;
end;
end;procedure TMainForm.PrintColumnNames;
var
ColNames: TStringList;
begin
{ Create a TStringList to hold the column names and the
positions where the width of each column is based on values
in the TEdit controls. }
ColNames := TStringList.Create;
try
// Print the column headers using a bold/underline style
Printer.Canvas.Font.Style := [fsBold, fsUnderline]; with ColNames do
begin
// Store the column headers and widths in the TStringList object
AddObject('LAST NAME', pointer(StrToInt(edtLastName.Text)));
AddObject('FIRST NAME', pointer(StrToInt(edtFirstName.Text)));
AddObject('ADDRESS', pointer(StrToInt(edtAddress.Text)));
AddObject('CITY', pointer(StrToInt(edtCity.Text)));
AddObject('STATE', pointer(StrToInt(edtState.Text)));
AddObject('ZIP', pointer(StrToInt(edtZip.Text)));
end; PrintLine(ColNames);
Printer.Canvas.Font.Style := [];
finally
ColNames.Free; // Free the column name TStringList instance
end;
end;procedure TMainForm.mmiPrintClick(Sender: TObject);
var
Items: TStringList;
begin
{ Create a TStringList instance to hold the fields and the widths
of the columns in which they'll be drawn based on the entries in
the edit controls }
Items := TStringList.Create;
try
// Determine pixels per inch horizontally
PixelsInInchx := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
TenthsOfInchPixelsY := GetDeviceCaps(Printer.Handle,
LOGPIXELSY) div 10;
AmountPrinted := 0;
MainForm.Enabled := false; // Disable the parent form
try
Printer.BeginDoc;
AbortForm.Show;
Application.ProcessMessages;
{ Calculate the line height based on text height using the
currently rendered font }
LineHeight := Printer.Canvas.TextHeight('X')+TenthsOfInchPixelsY;
if edtHeaderFont.Text <> '' then
PrintHeader;
PrintColumnNames;
tblClients.First;
{ Store each field value in the TStringList as well as its
column width }
while (not tblClients.Eof) or Printer.Aborted do
begin Application.ProcessMessages;
with Items do
begin
AddObject(tblClients.FieldByName('LAST_NAME').AsString,
pointer(StrToInt(edtLastName.Text)));
AddObject(tblClients.FieldByName('FIRST_NAME').AsString,
pointer(StrToInt(edtFirstName.Text)));
AddObject(tblClients.FieldByName('ADDRESS_1').AsString,
pointer(StrToInt(edtAddress.Text)));
AddObject(tblClients.FieldByName('CITY').AsString,
pointer(StrToInt(edtCity.Text)));
AddObject(tblClients.FieldByName('STATE').AsString,
pointer(StrToInt(edtState.Text)));
AddObject(tblClients.FieldByName('ZIP').AsString,
pointer(StrToInt(edtZip.Text)));
end;
PrintLine(Items);
{ Force print job to begin a new page if printed output has
exceeded page height }
if AmountPrinted + LineHeight > Printer.PageHeight then
begin
AmountPrinted := 0;
if not Printer.Aborted then
Printer.NewPage;
PrintHeader;
PrintColumnNames;
end;
Items.Clear;
tblClients.Next;
end;
AbortForm.Hide;
if not Printer.Aborted then
Printer.EndDoc;
finally
MainForm.Enabled := true;
end;
finally
Items.Free;
end;
end;procedure TMainForm.btnHeaderFontClick(Sender: TObject);
begin
{ Assign the font selected with FontDialog1 to Edit1. }
FontDialog.Font.Assign(edtHeaderFont.Font);
if FontDialog.Execute then
edtHeaderFont.Font.Assign(FontDialog.Font);
end;end.
//打印DBGrid中的所有数据********************************************************
//==============================================================================
procedure DBGridPrint(DBGrid: TDBGrid; Title: string);
var PrintDialog: TPrintDialog;
RowHeight, Temp_X, Temp_Y, PageEdgeX, PageEdgeY, PixelsPerInchX, PixelsPerInchY: integer;
TempStr: string;
Scale: Double;
Rect: TRect;
//==============================================================================
//1.输出标题********************************************************************
//==============================================================================
procedure Print_Title;
begin
Rect := Bounds(0,0,Printer.PageWidth,PageEdgeY);
Printer.Canvas.Font.Name := '楷体_GB2312';
Printer.Canvas.Font.Style := Printer.Canvas.Font.Style + [fsBold];
Printer.Canvas.Font.Size := 20;
DrawText(Printer.Canvas.Handle,PChar(Title),Length(Title),Rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE);
Printer.Canvas.Rectangle(PageEdgeX, PageEdgeY, Printer.PageWidth - PageEdgeX, PageEdgeY + 1);
end;
//==============================================================================
//2.输出列头********************************************************************
//==============================================================================
procedure Print_Column;
var j: integer;
begin
Printer.Canvas.Font.Name := '黑体';
Printer.Canvas.Font.Size := 9;
Temp_X := PageEdgeX;
Temp_Y := PageEdgeY;
//========================================================================
for j:=1 to DBGrid.Columns.Count do
begin
if not DBGrid.Columns[j-1].Visible then Continue;
//======================================================================
TempStr := DBGrid.Columns[j-1].Title.Caption;
Rect := Bounds(Temp_X, Temp_Y, Trunc(DBGrid.Columns[j-1].Width*Scale), RowHeight);
case DBGrid.Columns[j-1].Field.Alignment of
//====================================================================
//case.1.居中*********************************************************
//====================================================================
taCenter: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE);
//====================================================================
//case.2.居左*********************************************************
//====================================================================
taLeftJustify: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_LEFT or DT_VCENTER or DT_SINGLELINE);
//====================================================================
//case.3.居右*********************************************************
//====================================================================
taRightJustify: if Rect.Right-Rect.Left>=Printer.Canvas.TextWidth(TempStr)
then DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_RIGHT or DT_VCENTER or DT_SINGLELINE)
else DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_LEFT or DT_VCENTER or DT_SINGLELINE);
end;
Temp_X := Temp_X + Trunc(DBGrid.Columns[j-1].Width*Scale);
end;
Temp_Y := Temp_Y + RowHeight;
end;
//3.输出DBGrid内容**************************************************************
//==============================================================================
procedure Print_Cells;
var j: integer;
begin
Printer.Canvas.Font.Name := '宋体';
Printer.Canvas.Font.Style := Printer.Canvas.Font.Style - [fsBold];
while Temp_Y<Printer.PageHeight-PageEdgeY do
begin
Temp_X := PageEdgeX;
for j:=1 to DBGrid.Columns.Count do
begin
if not DBGrid.Columns[j-1].Visible then Continue;
//====================================================================
Rect := Bounds(Temp_X, Temp_Y, Trunc(DBGrid.Columns[j-1].Width*Scale), RowHeight);
if (DBGrid.Columns[j-1].Field is TCurrencyField)
or (DBGrid.Columns[j-1].Field is TLargeIntField)
or (DBGrid.Columns[j-1].Field is TSmallIntField)
or (DBGrid.Columns[j-1].Field is TIntegerField)
or (DBGrid.Columns[j-1].Field is TFloatField)
or (DBGrid.Columns[j-1].Field is TWordField)
then TempStr := FormatFloat(',##0.00',DBGrid.Columns[j-1].Field.AsFloat)
else TempStr := DBGrid.Columns[j-1].Field.AsString;
//====================================================================
case DBGrid.Columns[j-1].Field.Alignment of
//==================================================================
//case.1.居中*******************************************************
//==================================================================
taCenter: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE);
//==================================================================
//case.2.居左*******************************************************
//==================================================================
taLeftJustify: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_LEFT or DT_VCENTER or DT_SINGLELINE);
//==================================================================
//case.3.居右*******************************************************
//==================================================================
taRightJustify: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_RIGHT or DT_VCENTER or DT_SINGLELINE);
end;
Temp_X := Temp_X + Trunc(DBGrid.Columns[j-1].Width*Scale);
end;
Temp_Y := Temp_Y + RowHeight;
DBGrid.DataSource.DataSet.Next;
if DBGrid.DataSource.DataSet.Eof then Exit;
end;
end;
//==============================================================================
//4.输出页脚********************************************************************
//==============================================================================
procedure Print_Footer;
begin
Temp_Y := Printer.PageHeight - PageEdgeY + RowHeight;
//========================================================================
//4.0.输出横线************************************************************
//========================================================================
Printer.Canvas.Rectangle(PageEdgeX, Temp_Y, Printer.PageWidth - PageEdgeX, Temp_Y + 1);
//========================================================================
//4.1.输出日期************************************************************
//========================================================================
Rect := Bounds(PageEdgeX, Temp_Y, Printer.PageWidth-PageEdgeX, RowHeight);
DrawText(Printer.Canvas.Handle,PChar(DateTimeToStr(Now)),Length(DateTimeToStr(Now)),Rect,DT_LEFT or DT_VCENTER or DT_SINGLELINE);
//========================================================================
//4.2.输出页号************************************************************
//========================================================================
Rect := Bounds(PageEdgeX, Temp_Y, Printer.PageWidth-PageEdgeX*2, RowHeight);
DrawText(Printer.Canvas.Handle,PChar('#'+IntToStr(Printer.PageNumber)),Length('#'+IntToStr(Printer.PageNumber)),Rect,DT_RIGHT or DT_VCENTER or DT_SINGLELINE);
end;
//==============================================================================
begin
PrintDialog := TPrintDialog.Create(DBGrid);
if PrintDialog.Execute then
begin
//==========================================================================
//0.取当前打印机X,Y方向每英寸像素*******************************************
//==========================================================================
PixelsPerInchX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
PixelsPerInchY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
//==========================================================================
//1.变量初始化**************************************************************
//==========================================================================
PageEdgeX := PixelsPerInchX div 6;
PageEdgeY := PixelsPerInchY div 5 * 4;
RowHeight := Trunc(1.5 * 9 * PixelsPerInchY / 72);
Scale := PixelsPerInchX / Screen.PixelsPerInch;
//==========================================================================
try
Printer.BeginDoc;
DBGrid.DataSource.DataSet.First;
while not DBGrid.DataSource.DataSet.Eof do
begin
Print_Title;
Print_Column;
Print_Cells;
Print_Footer;
Printer.NewPage;
end;
//========================================================================
if not Printer.Aborted then Printer.EndDoc;
except
on E:EPrinter do
begin
MessageBox(Application.Handle,PChar('打印机没有准备好!'),'提示!',MB_OK+MB_ICONINFORMATION);
Printer.Abort;
Exit;
end;
on E:Exception do
begin
raise;
Exit;
end;
end;
end;
//============================================================================
PrintDialog.Free;
end;
dbgrid 连 datasource