我们的模块窗口是用包编译的动态连接库。窗口上用的控件大多是Developer Express控件,用dxLayoutControl控件控制窗口上控件的布局。各个模块窗口是动态载入到主窗体的PageControl控件上的,可以打开多个。
问题是:窗体偶尔会打不开,捕获到的错误是“Canvas does not allow drawing”,此时cpu使用率接近100%。请各位大虾多提宝贵的想法,小弟在这边谢了!
问题是:窗体偶尔会打不开,捕获到的错误是“Canvas does not allow drawing”,此时cpu使用率接近100%。请各位大虾多提宝贵的想法,小弟在这边谢了!
解决方案 »
- 【求助】delphi 改写看雪论坛“vista.win7 32/64 session隔离注入” 出错
- 如何四舍五入
- 如何判断CHECKBOX已选,并插入数据库中?
- 我在加入 directshow 控件时 在编译的时候 总是出现 not found DirectX.inc 我该怎么加入 DirectX.inc ?
- 请问,我想实现按下一个TSpeedButton按钮时复制该按钮,移动鼠标时,复制的按钮随鼠标移动,放开鼠标左键后,复制的按钮停在放开的窗体位置,该
- delphi 中的sql语句问题
- ★TPropInfo = packed record中的packed record是什么意思?
- 菜鸟问题!
- 怎样可以把某字段为空的所有记录查找出来?
- 在哪可以找到GB18030字符集部首查询的电子版?否则谁知道某个字编码是什么,再用区位码输入
- 请教列位大哥,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;