我们的模块窗口是用包编译的动态连接库。窗口上用的控件大多是Developer Express控件,用dxLayoutControl控件控制窗口上控件的布局。各个模块窗口是动态载入到主窗体的PageControl控件上的,可以打开多个。
问题是:窗体偶尔会打不开,捕获到的错误是“Canvas does not allow drawing”,此时cpu使用率接近100%。请各位大虾多提宝贵的想法,小弟在这边谢了!
问题是:窗体偶尔会打不开,捕获到的错误是“Canvas does not allow drawing”,此时cpu使用率接近100%。请各位大虾多提宝贵的想法,小弟在这边谢了!
解决方案 »
- UrlDownloadToFile是怎么设置代理的?
- 几个随即数同时显示的问题
- 如何刷新其它程序非正常退出时遗留的托盘图标?
- 一个常见的问题,DBedit让其readonly为真就不能编辑了。可我的一窗体上有几十个DBEdit我不能下一排去啊。有什么简便的方法让这些都不能编
- Delphi实现分栏
- DBGRID中,当横向滚动条滚动时如何让某一列固定不动?
- 怎样达到矩形框的旋转这个功能
- 如何操作在New Items对话框中,选择File->New命令,并打开带有项目名称的页?
- 我需要帮助,有个字符里面替换部分字符的功能,不知怎么实现.
- 怎样判断一篇文章是Big5码还是GB码?
- 请教列位大哥,UBB中的 [ 和 ] 的转意字符是用什么表示?就像HTML中<的转意字符是<一样?
- 数据库高手帮忙啊,只要解决,马上结帐,多谢!
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);
ObjectInfo: TObjectInfo;(自定义类)
帮我仔细看看好吗?
设置dll程序的断点
run->paramters->host application选调用此dll的程序。
F9运行dll程序
运行主程序
调试,看什么地方出错再告诉我们吧!
一个tcxpagecontrol 两个tcxtabsheet1和tcxtabsheet2
程序一起动我就建立一个线程处理,部分结果显示在tcxtabsheet1中的数据控件中,
部分结果显示在 tcxtabsheet2中的数据控件中,报错:Canvas does not allow drawing
后来我改用要显示在tcxtabsheet2中的数据放在数组或者链表中,等用户点击到tcxtabsheet2的时候才
加载数据显示出来。问题不再出现
各位不要生气。基本的调试,我是会的。
捕获到的错误我已经写出来了,就是:Canvas does not allow drawing。
偶尔会报这样的错误,出错的概率大约是10%吧。谢谢 Sorder(剑客) ,让我有了一点想法。
请问 victor_yang(victoryang) 需要些什么处理呢?
begin
IF not Self.Showing then Exit;
end;