发现有时调用showMessage、messageDlg程序停止相应,一开始没有在意。后来跟踪一下发现运行到Dialogs.pas单元GetAveCharSize(Canvas: TCanvas): TPoint函数的如下语句
  GetTextExtentPoint(Canvas.Handle, Buffer, 52, TSize(Result))
时程序停止响应,这时Result的x、y中有一个是负数,于是在前面添加:
  Result.X:=10; Result.Y:=10;  // dyf 2003-02-18 我添加的
结果还是一样。事情起因是我在数据模块中调用MainForm.ProgressBar用于显示进度,如果注释调这些语句则没有问题。调用过程如下:
function TBackup.RestoreAll: boolean;
var
  i:integer;
begin
  ImportForm.cbbLog.Clear;
  MainForm.ProgressBar.Visible:=True;
  for i:=0 to Ftables.Count-1 do begin
    Result:=Restore(TTableBackup(Ftables.Objects[i]));
    MainForm.ProgressBar.Position:=(i+1)*100 div Ftables.Count;
    if not Result then Break;
  end;
  MainForm.ProgressBar.Visible:=False;
end;Dialogs.pas单元GetAveCharSize函数如下,用于获得字符width\height
function GetAveCharSize(Canvas: TCanvas): TPoint;
var
  I: Integer;
  Buffer: array[0..51] of Char;
begin
  Result.X:=10; Result.Y:=10;  // dyf 2003-02-18 我添加的
  for I := 0 to 25 do
    Buffer[I] := Chr(I + Ord('A'));
  for I := 0 to 25 do
    Buffer[I + 26] := Chr(I + Ord('a'));
  GetTextExtentPoint(Canvas.Handle, Buffer, 52, TSize(Result));
  Result.X := Result.X div 52;
end;