我做了个处理Excel文件的程序,由于有时候数据量很大,要花费较长的时间,我想在处理excel的同时,弹出一个窗口来显示处理进度,不至于用户以为死机了,我用全局变量来传递处理进度,在form1中用了线程来容纳处理excel的函数并修改公用变量,在form2中用计时器来得到全局变量的值。
form1代码:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls,comobj;type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
  TtestThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;
var
  Form1: TForm1;implementationuses Unit2, Unit3;{$R *.dfm}procedure TtestThread.Execute;
var
  i:integer;
  ExcelApp:variant;
begin
  ExcelApp := CreateOleObject( 'Excel.Application' );
  ExcelApp.WorkBooks.Add;
  for i:=1 to 1000 do
  begin
   ExcelApp.Cells[i,1].Value := '第一行第四列';
   p:=i;
  end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
  ExcelApp: Variant;
  testThread:TtestThread;
begin
  testThread:=TtestThread.Create(false);
  form2.ShowModal;
end;end.
///////////////////////////
form2代码:
unit Unit2;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls;type
  TForm2 = class(TForm)
    ProgressBar1: TProgressBar;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form2: TForm2;implementationuses Unit3, Unit1;{$R *.dfm}procedure TForm2.Timer1Timer(Sender: TObject);
begin
  progressbar1.Position:=p;
  if progressbar1.Position=1000 then
  begin
    Timer1.Enabled:=false;
    form1.Enabled:=True;
  end;
end;procedure TForm2.FormShow(Sender: TObject);
begin
  timer1.Enabled:=True;
end;end.
/////////////////////
form3代码:
unit Unit3;interface
var
  p:integer;
implementationend.    运行时,发现错误:尚未调用coinitialize。各位给看看错在哪里,提出个解决方案看看。谢谢

解决方案 »

  1.   

    回复:initialization    
      Coinitialize(nil);
    finalization  
      CoUninitialize;
      

  2.   


    procedure TtestThread.Execute;
    var
    i:integer;
    ExcelApp:variant;
    begin
      coinitialize  ExcelApp := CreateOleObject( 'Excel.Application' );
      ExcelApp.WorkBooks.Add;
      for i:=1 to 1000 do
      begin
        ExcelApp.Cells[i,1].Value := '第一行第四列';
        p:=i;
      end;
    end;
      

  3.   

    我在单元后面加了:
    initialization    
      Coinitialize(nil);
    finalization  
      CoUninitialize;
    可编译时通不过去啊,告诉我
    undeclared identifier:'Coinitialize'
    这是为什么?
      

  4.   

    谢谢了,我明白了,在uses里加上Activex,采用了netfly(支点)的方法,可以实现了,非常感谢两位。结贴!