我们的模块窗口是用包编译的动态连接库。窗口上用的控件大多是Developer Express控件,用dxLayoutControl控件控制窗口上控件的布局。各个模块窗口是动态载入到主窗体的PageControl控件上的,可以打开多个。
问题是:窗体偶尔会打不开,捕获到的错误是“Canvas does not allow drawing”,此时cpu使用率接近100%。请各位大虾多提宝贵的想法,小弟在这边谢了!

解决方案 »

  1.   

    我用的Developer Express控件,这个问题出现好久了,老是一时好,一时坏,不过出现的次数不多!
      

  2.   

    dxLayoutControl这个控件有问题。可能是它引起的,试着去掉它。
      

  3.   

    function  ShowObject(var mObjectInfo:TObjectInfo):LongInt;StdCall;
    begin
      Application.Handle := mObjectInfo.ApplicationHandle;
      With TfrmMain.create(nil) do
      begin
        Try
          ObjectInfo:=mObjectInfo;
         // dmMain:= mobjectinfo.dm;
          BorderStyle := bsNone;
          left:=0;
          Top:=0;
          Width:=TdxTabSheet(TObjectInfo(mObjectInfo).dxTabSheet).Width;
          Height:=TdxTabSheet(TObjectInfo(mObjectInfo).dxTabSheet).Height;
          ParentWindow:=TdxTabSheet(TObjectInfo(mObjectInfo).dxTabSheet).Handle;
          Result:=LongInt(TfrmMain(FormList[FormList.Count-1]));
          //IniForm;
          Show;    except
          Result:=0;
          Close;
        end;
      end;
    end;Procedure ReSizeForm(ObjectHandle,mHeight,mWidth:LongInt);Stdcall;
    var
      I:Integer;
    begin
      For I:=0 to FormList.Count -1 do
        if LongInt(TfrmMain(FormList[I]))= ObjectHandle then
        begin
          TfrmMain(FormList[I]).top:=0;
          TfrmMain(FormList[I]).left:=0;
          TfrmMain(FormList[I]).Width:= mWidth;
          TfrmMain(FormList[I]).Height:= mHeight;
        end;
    end;Procedure RefreshForm(ObjectHandle:LongInt);Stdcall;
    var
      I:Integer;
    begin
      For I:=0 to FormList.Count -1 do
        if LongInt(TfrmMain(FormList[I]))= ObjectHandle then
        begin
    //      TfrmObject(FormList[I])上的某个刷新的过程
        end;
    end;function CloseForm(ObjectHandle:LongInt):Boolean;Stdcall;
    var
      I:Integer;
      bln: boolean;
    begin
      Result:=True;
      For I:=FormList.Count -1  Downto 0 do
      begin
        if LongInt(TfrmMain(FormList[I]))= ObjectHandle then
        begin
          TfrmMain(FormList[I]).blnCanClose := False;
          TfrmMain(FormList[I]).onCloseQuery(TfrmMain(FormList[I]), Bln);
          if not Bln then
          begin
            Result := False;
            exit;
          end;
          TfrmMain(FormList[I]).blnCanClose := True;
          TfrmMain(FormList[I]).Close;
          Break;
        end;
      end;
    end;function  CloseForms:Boolean;stdcall;
    var
      bln: boolean;
    begin
      Result := True;  while FormList.Count > 0 do
      begin
        TfrmMain(FormList[0]).blnCanClose := False;
        TfrmMain(FormList[0]).onCloseQuery(TfrmMain(FormList[0]), Bln);
        if not Bln then
        begin
          Result := False;
          exit;
        end;
        TfrmMain(FormList[0]).blnCanClose := True;
        TfrmMain(FormList[0]).Close;
      end;
    end;
    以上是动态连接库中调用窗口的接口。
    以下是主窗体调用模块窗口的代码:
    dxSideBar.Locked := true;
        if Item.Tag = 0 then
        begin
          OpenProgressForm('正在载入 ' + Item.Caption + ' 模块...', 0);
          Sleep(40);
          if dxPageControlGroup.ActivePage <> nil then
            OlddxTabSheet := dxPageControlGroup.ActivePage
          else
            OlddxTabSheet := nil;
          dxTabSheet := TdxTabSheet.Create(nil);
          dxTabSheet.PageControl := dxPageControlGroup;
          dxTabSheet.Caption := Item.Caption;
          dxTabSheet.TabVisible := false;
          dxTabSheet.Hint := IntToStr(LongInt(Item));
          Item.Tag := LongInt(dxTabSheet);      ObjectInfo := TObjectInfo.Create;
          ObjectInfo.ObjectName := Item.CustomData;
          Objectinfo.MainFormHandle := Handle;
          ObjectInfo.ApplicationHandle := Application.Handle;
          ObjectInfo.dxTabSheet := LongInt(dxTabSheet);
          ObjectInfo.ValueListEditor := LongInt(ValueListEditor);
          ObjectInfo.Caption := Item.Caption;
          ObjectInfo.PublicInfo := PublicInfo;
          ObjectInfo.dxBarManager := LongInt(PopupMenu1);
          ObjectInfo.DM := dmMain;      BlnWFNotCloseProGressForm := True;
          dxTabSheet.Tag := OpenObjectToPageControl(ObjectInfo);
          if dxTabSheet.Tag <> 0 then
          begin
            ValueListEditor.InsertRow(Item.CustomData, dxTabSheet.Hint, True);
            dxTabSheet.TabVisible := True;
            dxPageControlGroup.ActivePageIndex := dxTabSheet.PageIndex;
            dxTabSheet := nil;
            dxTabsheet.Free;
            ObjectInfo := nil;
            dxSideBar.SelectedItem := Item;
            dxSideBar.Locked := False;
            dxPageControlGroup.OnChange(dxPageControlGroup);
            dxSideBar.Locked := True;
            if dxPageControlGroup.PageCount = 1 then
              dxPageControlGroup.OnResize(dxPageControlGroup);
            if BlnWFNotCloseProGressForm then
              CloseProgressForm;
          end
          else
          begin
            dxTabSheet.Hint := '';
            dxTabSheet.PageControl := nil;
            dxTabSheet.Free;
            Item.Tag := 0;
            dxSideBar.SelectedItem := nil;
            if OlddxTabSheet <> nil then
              dxPageControlGroup.ActivePageIndex := OlddxTabSheet.PageIndex;
            ObjectInfo.Free;
            CloseProGressForm;
          end;
          Application.ProcessMessages;
        end
        else
          dxPageControlGroup.ActivePage := TdxTabSheet(Item.Tag);
        dxSideBar.Locked := False;    Sleep(20);
      

  4.   

    dxTabSheet, OlddxTabSheet: TdxTabSheet;
    ObjectInfo: TObjectInfo;(自定义类)
      

  5.   

    应该是控件本身的问题,我也用过Express这组控件
      

  6.   

    to: cybercake(数字蛋糕) 
    帮我仔细看看好吗?
      

  7.   

    调试下dll啦!
    设置dll程序的断点
    run->paramters->host application选调用此dll的程序。
    F9运行dll程序
    运行主程序
    调试,看什么地方出错再告诉我们吧!
      

  8.   

    我以前遇到过一个类似问题,描述如下:
    一个tcxpagecontrol 两个tcxtabsheet1和tcxtabsheet2
    程序一起动我就建立一个线程处理,部分结果显示在tcxtabsheet1中的数据控件中,
    部分结果显示在 tcxtabsheet2中的数据控件中,报错:Canvas does not allow drawing
    后来我改用要显示在tcxtabsheet2中的数据放在数组或者链表中,等用户点击到tcxtabsheet2的时候才
    加载数据显示出来。问题不再出现
      

  9.   

    用这样的标题知识为了吸引人而已,没别的意思。
    各位不要生气。基本的调试,我是会的。
    捕获到的错误我已经写出来了,就是:Canvas does not allow drawing。
    偶尔会报这样的错误,出错的概率大约是10%吧。谢谢  Sorder(剑客) ,让我有了一点想法。
      

  10.   

    dxPageControlGroupR的OnChanged事件你有事件吗?我怀疑这里有问题。我以前也出现过,就是要在这里处理的。
      

  11.   

    dxPageControlGroupR的OnChanged事件里没有事件。
    请问 victor_yang(victoryang) 需要些什么处理呢?
      

  12.   

    procedure TForm1.PageControl2Change(Sender: TObject);
    begin
      IF not Self.Showing then Exit;
    end;