一用就出错,‘Canvas does not allow drawing’,用MessageBox就不会。Why?!

解决方案 »

  1.   

    可以使用showmessage,以前用过
    你的为什么不行,不太清楚
      

  2.   

    unit MainFrm;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ComCtrls, ExtCtrls, ADODB, Grids, DBGrids, DBCtrls, StdCtrls;type
      TForm1 = class(TForm)
        DBNavigator1: TDBNavigator;
        DBGrid1: TDBGrid;
        ADOConnection1: TADOConnection;
        ADODataSet1: TADODataSet;
        Panel1: TPanel;
        ProgressBar1: TProgressBar;
        DataSource1: TDataSource;
        ADOCommand1: TADOCommand;
        Button1: TButton;
        Button2: TButton;
        procedure FormActivate(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure ADODataSet1FetchProgress(DataSet: TCustomADODataSet;
          Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
        procedure ADODataSet1FetchComplete(DataSet: TCustomADODataSet;
          const Error: Error; var EventStatus: TEventStatus);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    var
      lStart, lEnd : DWORD;procedure TForm1.FormActivate(Sender: TObject);
    var
      sRecCount : string;
    begin
      ProgressBar1.Max := ADOCommand1.Execute.Fields.Item[0].Value;
      sRecCount := IntToStr(ProgressBar1.Max);
      self.Caption := '共有' + sRecCount + '条记录';
      ProgressBar1.Max := ProgressBar1.Max;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      try
        ADODataSet1.Active := false;
        ADODataSet1.ExecuteOptions := [eoAsyncFetchNonBlocking];
      finally
        lStart := GetTickCount;
        ADODataSet1.Active := true;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      try
        ADODataSet1.Active := false;
        ADODataSet1.ExecuteOptions := [eoAsyncFetch];
      finally
        lStart := GetTickCount;
        ADODataSet1.Active := true;
      end;
    end;procedure TForm1.ADODataSet1FetchProgress(DataSet: TCustomADODataSet;
      Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
    begin
        ProgressBar1.Position := Progress;
    end;procedure TForm1.ADODataSet1FetchComplete(DataSet: TCustomADODataSet;
      const Error: Error; var EventStatus: TEventStatus);
    begin
      lEnd := GetTickCount;
      ShowMessage('总共花了' + FloatToStr((lEnd - lStart) / 1000.0) + '秒。');      <<<---这里报错,用下面的MessageBox就可以
      //MessageBox(GetActiveWindow(),PChar('总共花了' + FloatToStr((lEnd - lStart) / 1000.0) + '秒。'),'',MB_OK );
    end;end.
      

  3.   

    我说自己的想法:它应该和VCL的线程不安全有关,而messagebox是api function 所以不会出错的
    是我个人想法 具体解决就是 使用messagebox. 
    你还可以咨询或等待 高手帮你彻底解决。 :)不过 别忘了告诉我!
      

  4.   

    Register/safecall
    感觉和这个有关系~~