谢谢

解决方案 »

  1.   

    是不是在自已的窗体中调用方法用了form1.()?
      

  2.   

    程序是这样的:
    unit Unit14;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ToolWin, ComCtrls, ExtCtrls, DB, Grids, DBGrids, DBReportGrid,
      ADODB, StdCtrls;type
      TForm14 = class(TForm)
        Panel1: TPanel;
        StatusBar1: TStatusBar;
        ADODataSet1: TADODataSet;
        DataSource1: TDataSource;
        Panel2: TPanel;
        Label2: TLabel;
        Label1: TLabel;
        DateTimePicker1: TDateTimePicker;
        DateTimePicker2: TDateTimePicker;
        Label3: TLabel;
        Button1: TButton;
        DBGrid1: TDBGrid;
        Label4: TLabel;
        Label5: TLabel;
        ADODataSet1DSDesigner: TStringField;
        ADODataSet1DSDesigner2: TBCDField;
        ADODataSet1DSDesigner3: TIntegerField;
        Panel4: TPanel;
        ADODataSet1DSDesigner4: TIntegerField;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormDestroy(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form14: TForm14;
      procedure KSSR;implementationuses ConnectDM, DBRoutines,ExportTo;
    procedure KSSR;
    begin
     if Form14=nil then
        Form14:=TForm14.Create(Application)
      else
        Form14.Show;end;
    {$R *.dfm}procedure TForm14.FormCreate(Sender: TObject);
    var
    aa: string[28] ;
    bb: string[28] ;
    cc: string[28] ;
    Y, M, D: WORD;begin
      aa:=DateToStr(Date);
      bb:=copy(aa,1,5);
      bb:=bb+'.20';
      DecodeDate(Date(), Y, M, D);
      if M>1 then
        M:=M-1
      else begin
        Y:=Y-1;
        M:=12;
      end;
      cc:=IntToStr(Y)+'.';
      if M<10 then
        cc:=cc+'0'+IntToStr(M)
      else
        cc:=cc+IntToStr(M);
        cc:=cc+'.21';
      DateTimePicker1.DateTime:=StrToDate(cc);
      DateTimePicker2.DateTime:=StrToDate(bb);
      Panel4.Caption:='说明:因数据量大,故计算时间较长';
      //DateTimePicker1.DateTime:=Date ;
      //DateTimePicker2.DateTime:=Date ;
      end;
    procedure TForm14.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    ADODataSet1.Close;
    DataObject.qryHelper.Close;
    DataObject.qryHelper1.Close;
    Action:=caFree;
    end;procedure TForm14.FormDestroy(Sender: TObject);
    begin
    Form14:=nil;
    end;procedure TForm14.Button1Click(Sender: TObject);
    var
    Sum1:Double;
    Sum2:Double;
    Sum3:Double;
    begin  with ADODataSet1 do
      begin
            Close;
    //        ShowMessage(DateToStr(DateTimePicker1.Date));
            CommandText:='Execute an_Manager1 :startdate, :enddate';
            Parameters[0].Value:=DateTimePicker1.Date;
            Parameters[1].Value:=DateTimePicker2.Date+1;
            Open;
      end;
      with DataObject.qryHelper do
      begin
        Close;
        SQL.Text:='select convert(decimal(12,2),sum(实付单价*数量)) from 门诊费用_head a join 门诊费用_data b on a.序号=b.序号 where 日期 between :startdate and :enddate ';
        Parameters[0].Value:=DateTimePicker1.Date;
        Parameters[1].Value:=DateTimePicker2.Date+1;
        Open;
        Sum1:=Fields[0].AsFloat;
        Close;
      end;
      with DataObject.qryHelper1 do
      begin
        Close;
        SQL.Text:='select convert(decimal(12,2),sum(单价*数量)) from 住院费用 where 日期 between :startdate and :enddate ';
        Parameters[0].Value:=DateTimePicker1.Date;
        Parameters[1].Value:=DateTimePicker2.Date+1;
        Open;
        Sum2:=Fields[0].AsFloat;
        Close;
      end;
      TDBGridExport.Export_To_Excel(DBGrid1);
      sum3:=Sum1+Sum2;
      Panel4.Caption:='门诊收入:'+FloatToStr(Sum1)+'       住院收入:'+FloatToStr(Sum2)+'       总收入:'+FloatToStr(Sum3);end;end.
    TDBGridExport.Export_To_Excel(DBGrid1);这句提示错误,请指点一下,谢谢
      

  3.   

    unit   ExportTo;
    interface
    uses
        SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,StdCtrls,   Db,   DBGrids,   Comobj,   extctrls,   comctrls,   ActiveX;
    type
        TSpaceMark   =   (csComma,   csSemicolon,   csTab,   csBlank,   csEnter);
        TDBGridExport   =   class(TComponent)
        private
            FDB_Grid:   TDBGrid;   {读取DBGrid的源}
            FTxtFileName:   string;   {文本文件名}
            FSpaceMark:   TSpaceMark;   {间隔符号}
            FSpace_Ord:   Integer;   {间隔符号的Asc数值}
            FTitle:   string;   {显示的标题}
            FSheetName:   string;   {工作表标题}
            FExcel_Handle:   OleVariant;   {Excel的句柄}
            FWorkbook_Handle:   OleVariant;   {书签的句柄}
            FShow_Progress:   Boolean;   {是否显示插入进度}
            FProgress_Form:   TForm;   {进度窗体}
            FRun_Excel_Form:   TForm;   {启动Excel提示窗口}
            FProgressBar:   TProgressBar;   {进度条}
            function   Connect_Excel:   Boolean;   {启动Excel}
            function   New_Workbook:   Boolean;   {插入新的工作博}
            function   InsertData_To_Excel:   Boolean;   {插入数据}
            procedure   Create_ProgressForm(AOwner:   TComponent);   {创建进度显示窗口}
            procedure   Create_Run_Excel_Form(AOwner:   TComponent);   {创建启动Excel窗口}
            //procedure   SetSpaceMark(Value:   TSpaceMark);   {设置导出时的间隔符号}
            protected
        public
            constructor   Create(AOwner:   TComponent);   override;   {新建}
            destructor   Destroy;   override;   {销毁}
            function   Export_To_Excel:   Boolean;   overload;   {导出到Excel中}
            function   Export_To_Excel(DB_Grid:   TDBGrid):   Boolean;   overload; 
            function   Export_To_Txt(NewFile:   Boolean   =   True):   Boolean;   overload;   {导出到文本文件中}
            function   Export_To_Txt(FileName:   string;   NewFile:   Boolean   =   True):   Boolean;   overload; 
            function   Export_To_Txt(DB_Grid:   TDBGrid;   NewFile:   Boolean   =   True):   Boolean;   overload; 
            function   Export_To_Txt(FileName:   string;   DB_Grid:   TDBGrid;   NewFile:   Boolean   =   True):   Boolean;   overload;
            published 
            property   DB_Grid:   TDBGrid   read   FDB_Grid   write   FDB_Grid; 
            property   Show_Progress:   Boolean   read   FShow_Progress   write   FShow_Progress; 
            property   TxtFileName:   string   read   FTxtFileName   write   FTxtFileName;
      //      property   SpaceMark:   TSpaceMark   read   FSpaceMark   write   SetSpaceMark;
            property   Title:   string   read   FTitle   write   FTitle; 
            property   SheetName:   string   read   FSheetName   write   FSheetName; 
    end; procedure   Register;implementation procedure   Register;begin
        RegisterComponents( 'Stone',   [TDBGridExport]);
    end; 
    {-------------------------------------------------------------------------------} 
    {新建}
    constructor   TDBGridExport.Create(AOwner:   TComponent); 
    begin 
        inherited   Create(AOwner); 
        FShow_Progress   :=   True;
        FSpaceMark   :=   csTab; 
    end;{销毁} 
    destructor   TDBGridExport.Destroy; 
    begin
        varClear(FExcel_Handle); 
        varClear(FWorkbook_Handle); 
    inherited   Destroy;
    end; 
    {===============================================================================} 
    {导出到文本文件中}
    function   TDBGridExport.Export_To_Txt(NewFile:   Boolean   =   True):   Boolean; 
    var 
        Txt:   TStrings;
        Tmp_Str,data_Str,Column_name:   string; 
        i,   j:   Integer; 
        Data_Set:   TDataSet; 
        book:   pointer; 
        Before_Scroll,   Afrer_Scroll:   TDataSetNotifyEvent;
    begin 
        Result   :=   False; 
        if   NewFile   =   True   then 
            FTxtFileName   :=   ' ';
        if   FTxtFileName   =   ' '   then
        begin 
            with   TSaveDialog.Create(nil)   do 
            begin 
                Title   :=   '请选择输出文件名 ';
                DefaultExt   :=   'txt ';
                Filter   :=   '文本文件(*.Txt) |*.txt ';
                Options   :=   [ofOverwritePrompt,   ofHideReadOnly,   ofPathMustExist,   ofNoReadOnlyReturn,   ofEnableSizing]; 
                if   Execute   then 
                    FTxtFileName   :=   FileName; 
                Free;
                if   FTxtFileName   =   ' '   then   {如果没有选中文件,则直接推出}
                exit; 
            end;         if   FTxtFileName   =   ' '   then
            begin 
                raise   exception.Create( '没有指定输出文件 ');
                Exit; 
            end; 
        end;
        if   FDB_Grid   =   nil   then
            raise   exception.Create( '请输入DBGrid名称 ');
        Txt   :=   TStringList.Create; 
        try{显示插入进度} 
            if   FShow_Progress   =   True   then
            begin 
                Create_ProgressForm(nil); 
                FProgress_Form.Show; 
            end; 
            {第一行,插入标题}
            Tmp_Str   :=   ' ';   //FDB_Grid.Columns[0].Title.Caption;
            for   i   :=   1   to   FDB_Grid.Columns.Count   do 
            if   FDB_Grid.Columns[i   -   1].Visible   =   True   then 
                Tmp_Str   :=   Tmp_Str   +   FDB_Grid.Columns[i   -   1].Title.Caption   +   Chr(FSpace_Ord); 
            Tmp_Str   :=   Copy(Tmp_Str,   1,   Length(Tmp_Str)   -   1);
            Txt.Add(Tmp_Str); 
            {插入DBGrid中的数据} 
            Data_Set   :=   FDB_Grid.DataSource.DataSet; 
            {记忆当前位置并取消任何事件} 
            //   new(book);
            book   :=   Data_Set.GetBook; 
            Data_Set.DisableControls; 
            Before_Scroll   :=   Data_Set.BeforeScroll; 
            Afrer_Scroll   :=   Data_Set.AfterScroll; 
            Data_Set.BeforeScroll   :=   nil;
            Data_Set.AfterScroll   :=   nil; 
            if   FShow_Progress   =   True   then 
            begin 
                Data_Set.Last; 
                FProgress_Form.Refresh;
                FProgressBar.Max   :=   Data_Set.RecordCount; 
            end; 
            {插入DBGrid中的所有字段} 
            Data_Set.First; 
            j   :=   2;
            while   not   Data_Set.Eof   do 
            begin 
                if   FShow_Progress   =   True   then 
                    FProgressBar.Position   :=   j   -   2; 
                Column_name   :=   FDB_Grid.Columns[0].FieldName;
                Tmp_Str   :=   ' ';   //Data_Set.FieldByName(Column_name).AsString;
                for   i   :=   1   to   FDB_Grid.Columns.Count   do 
                    if   FDB_Grid.Columns[i   -   1].Visible   =   True   then 
                    begin 
                        data_Str   :=   FDB_Grid.Fields[i   -   1].DisplayText; 
                        Tmp_Str   :=   Tmp_Str   +   data_Str   +   Chr(FSpace_Ord); 
                    end; 
                Tmp_Str   :=   Copy(Tmp_Str,   1,   Length(Tmp_Str)   -   1); 
                Txt.Add(Tmp_Str); 
                j   :=   j   +   1; 
                Data_Set.Next; 
            end; 
            {恢复原始事件以及标志位置} 
            Data_Set.GotoBook(book); 
            Data_Set.FreeBook(book); 
            //   dispose(book); 
            Data_Set.EnableControls; 
            Data_Set.BeforeScroll   :=   Before_Scroll; 
            Data_Set.AfterScroll   :=   Afrer_Scroll; 
            {写到文件} 
            Txt.SaveToFile(FTxtFileName); 
            Result   :=   True; 
        finally 
            Txt.Free; 
            if   FShow_Progress   =   True   then 
            begin 
                FProgress_Form.Free; 
                FProgress_Form   :=   nil; 
            end; 
        end; 
    end;
    function   TDBGridExport.Export_To_Txt(FileName:   string;   NewFile:   Boolean   =   True):   Boolean; 
    begin 
        FTxtFileName   :=   FileName; 
        Result   :=   Export_To_Txt(NewFile); 
    end; function   TDBGridExport.Export_To_Txt(DB_Grid:   TDBGrid;   NewFile:   Boolean   =   True):   Boolean; 
    begin 
        FDB_Grid   :=   DB_Grid; 
        Result   :=   Export_To_Txt(NewFile); 
    end; function   TDBGridExport.Export_To_Txt(FileName:   string;   DB_Grid:   TDBGrid;   NewFile:   Boolean   =   True):   Boolean; 
    begin 
        FTxtFileName   :=   FileName; 
        FDB_Grid   :=   DB_Grid; 
        Result   :=   Export_To_Txt(NewFile); 
    end; 
      

  4.   

    unit   ExportTo;
    interface
    uses
        SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,StdCtrls,   Db,   DBGrids,   Comobj,   extctrls,   comctrls,   ActiveX;
    type
        TSpaceMark   =   (csComma,   csSemicolon,   csTab,   csBlank,   csEnter);
        TDBGridExport   =   class(TComponent)
        private
            FDB_Grid:   TDBGrid;   {读取DBGrid的源}
            FTxtFileName:   string;   {文本文件名}
            FSpaceMark:   TSpaceMark;   {间隔符号}
            FSpace_Ord:   Integer;   {间隔符号的Asc数值}
            FTitle:   string;   {显示的标题}
            FSheetName:   string;   {工作表标题}
            FExcel_Handle:   OleVariant;   {Excel的句柄}
            FWorkbook_Handle:   OleVariant;   {书签的句柄}
            FShow_Progress:   Boolean;   {是否显示插入进度}
            FProgress_Form:   TForm;   {进度窗体}
            FRun_Excel_Form:   TForm;   {启动Excel提示窗口}
            FProgressBar:   TProgressBar;   {进度条}
            function   Connect_Excel:   Boolean;   {启动Excel}
            function   New_Workbook:   Boolean;   {插入新的工作博}
            function   InsertData_To_Excel:   Boolean;   {插入数据}
            procedure   Create_ProgressForm(AOwner:   TComponent);   {创建进度显示窗口}
            procedure   Create_Run_Excel_Form(AOwner:   TComponent);   {创建启动Excel窗口}
            //procedure   SetSpaceMark(Value:   TSpaceMark);   {设置导出时的间隔符号}
            protected
        public
            constructor   Create(AOwner:   TComponent);   override;   {新建}
            destructor   Destroy;   override;   {销毁}
            function   Export_To_Excel:   Boolean;   overload;   {导出到Excel中}
            function   Export_To_Excel(DB_Grid:   TDBGrid):   Boolean;   overload; 
            function   Export_To_Txt(NewFile:   Boolean   =   True):   Boolean;   overload;   {导出到文本文件中}
            function   Export_To_Txt(FileName:   string;   NewFile:   Boolean   =   True):   Boolean;   overload; 
            function   Export_To_Txt(DB_Grid:   TDBGrid;   NewFile:   Boolean   =   True):   Boolean;   overload; 
            function   Export_To_Txt(FileName:   string;   DB_Grid:   TDBGrid;   NewFile:   Boolean   =   True):   Boolean;   overload;
            published 
            property   DB_Grid:   TDBGrid   read   FDB_Grid   write   FDB_Grid; 
            property   Show_Progress:   Boolean   read   FShow_Progress   write   FShow_Progress; 
            property   TxtFileName:   string   read   FTxtFileName   write   FTxtFileName;
      //      property   SpaceMark:   TSpaceMark   read   FSpaceMark   write   SetSpaceMark;
            property   Title:   string   read   FTitle   write   FTitle; 
            property   SheetName:   string   read   FSheetName   write   FSheetName; 
    end; procedure   Register;implementation procedure   Register;begin
        RegisterComponents( 'Stone',   [TDBGridExport]);
    end; 
    {-------------------------------------------------------------------------------} 
    {新建}
    constructor   TDBGridExport.Create(AOwner:   TComponent); 
    begin 
        inherited   Create(AOwner); 
        FShow_Progress   :=   True;
        FSpaceMark   :=   csTab; 
    end;{销毁} 
    destructor   TDBGridExport.Destroy; 
    begin
        varClear(FExcel_Handle); 
        varClear(FWorkbook_Handle); 
    inherited   Destroy;
    end; 
    {===============================================================================} 
    {导出到文本文件中}
    function   TDBGridExport.Export_To_Txt(NewFile:   Boolean   =   True):   Boolean; 
    var 
        Txt:   TStrings;
        Tmp_Str,data_Str,Column_name:   string; 
        i,   j:   Integer; 
        Data_Set:   TDataSet; 
        book:   pointer; 
        Before_Scroll,   Afrer_Scroll:   TDataSetNotifyEvent;
    begin 
        Result   :=   False; 
        if   NewFile   =   True   then 
            FTxtFileName   :=   ' ';
        if   FTxtFileName   =   ' '   then
        begin 
            with   TSaveDialog.Create(nil)   do 
            begin 
                Title   :=   '请选择输出文件名 ';
                DefaultExt   :=   'txt ';
                Filter   :=   '文本文件(*.Txt) |*.txt ';
                Options   :=   [ofOverwritePrompt,   ofHideReadOnly,   ofPathMustExist,   ofNoReadOnlyReturn,   ofEnableSizing]; 
                if   Execute   then 
                    FTxtFileName   :=   FileName; 
                Free;
                if   FTxtFileName   =   ' '   then   {如果没有选中文件,则直接推出}
                exit; 
            end;         if   FTxtFileName   =   ' '   then
            begin 
                raise   exception.Create( '没有指定输出文件 ');
                Exit; 
            end; 
        end;
        if   FDB_Grid   =   nil   then
            raise   exception.Create( '请输入DBGrid名称 ');
        Txt   :=   TStringList.Create; 
        try{显示插入进度} 
            if   FShow_Progress   =   True   then
            begin 
                Create_ProgressForm(nil); 
                FProgress_Form.Show; 
            end; 
            {第一行,插入标题}
            Tmp_Str   :=   ' ';   //FDB_Grid.Columns[0].Title.Caption;
            for   i   :=   1   to   FDB_Grid.Columns.Count   do 
            if   FDB_Grid.Columns[i   -   1].Visible   =   True   then 
                Tmp_Str   :=   Tmp_Str   +   FDB_Grid.Columns[i   -   1].Title.Caption   +   Chr(FSpace_Ord); 
            Tmp_Str   :=   Copy(Tmp_Str,   1,   Length(Tmp_Str)   -   1);
            Txt.Add(Tmp_Str); 
            {插入DBGrid中的数据} 
            Data_Set   :=   FDB_Grid.DataSource.DataSet; 
            {记忆当前位置并取消任何事件} 
            //   new(book);
            book   :=   Data_Set.GetBook; 
            Data_Set.DisableControls; 
            Before_Scroll   :=   Data_Set.BeforeScroll; 
            Afrer_Scroll   :=   Data_Set.AfterScroll; 
            Data_Set.BeforeScroll   :=   nil;
            Data_Set.AfterScroll   :=   nil; 
            if   FShow_Progress   =   True   then 
            begin 
                Data_Set.Last; 
                FProgress_Form.Refresh;
                FProgressBar.Max   :=   Data_Set.RecordCount; 
            end; 
            {插入DBGrid中的所有字段} 
            Data_Set.First; 
            j   :=   2;
            while   not   Data_Set.Eof   do 
            begin 
                if   FShow_Progress   =   True   then 
                    FProgressBar.Position   :=   j   -   2; 
                Column_name   :=   FDB_Grid.Columns[0].FieldName;
                Tmp_Str   :=   ' ';   //Data_Set.FieldByName(Column_name).AsString;
                for   i   :=   1   to   FDB_Grid.Columns.Count   do 
                    if   FDB_Grid.Columns[i   -   1].Visible   =   True   then 
                    begin 
                        data_Str   :=   FDB_Grid.Fields[i   -   1].DisplayText; 
                        Tmp_Str   :=   Tmp_Str   +   data_Str   +   Chr(FSpace_Ord); 
                    end; 
                Tmp_Str   :=   Copy(Tmp_Str,   1,   Length(Tmp_Str)   -   1); 
                Txt.Add(Tmp_Str); 
                j   :=   j   +   1; 
                Data_Set.Next; 
            end; 
            {恢复原始事件以及标志位置} 
            Data_Set.GotoBook(book); 
            Data_Set.FreeBook(book); 
            //   dispose(book); 
            Data_Set.EnableControls; 
            Data_Set.BeforeScroll   :=   Before_Scroll; 
            Data_Set.AfterScroll   :=   Afrer_Scroll; 
            {写到文件} 
            Txt.SaveToFile(FTxtFileName); 
            Result   :=   True; 
        finally 
            Txt.Free; 
            if   FShow_Progress   =   True   then 
            begin 
                FProgress_Form.Free; 
                FProgress_Form   :=   nil; 
            end; 
        end; 
    end;
    function   TDBGridExport.Export_To_Txt(FileName:   string;   NewFile:   Boolean   =   True):   Boolean; 
    begin 
        FTxtFileName   :=   FileName; 
        Result   :=   Export_To_Txt(NewFile); 
    end; function   TDBGridExport.Export_To_Txt(DB_Grid:   TDBGrid;   NewFile:   Boolean   =   True):   Boolean; 
    begin 
        FDB_Grid   :=   DB_Grid; 
        Result   :=   Export_To_Txt(NewFile); 
    end; function   TDBGridExport.Export_To_Txt(FileName:   string;   DB_Grid:   TDBGrid;   NewFile:   Boolean   =   True):   Boolean; 
    begin 
        FTxtFileName   :=   FileName; 
        FDB_Grid   :=   DB_Grid; 
        Result   :=   Export_To_Txt(NewFile); 
    end; 
      

  5.   

    貌似2楼翻译错了,我来给个正确的翻译:“只有类方法才允许这种方法调用的方式”。很明显,TDBGridExport.Export_To_Excel(DBGrid1),你是企图想用类方法的调用方式来调用这个函数,但是“Export_To_Excel”并不是一个类方法。因此你必须先创建TDBGridExport的实例,然后才能调用到这个方法。
      

  6.   

    如果先创建这个类就可以直接调用。不创建类,可以class function TDBGridExport.Export_To_Txt(NewFile: Boolean = True): Boolean;  这样写