我在Delphi 5中创建的表单应用程序有问题。在这个应用程序中,我有几个按钮打开(设置可见属性)不同的表单。这表示父母有Panel。 只覆盖一个函数:
procedure TForm.CreateParams(var Params : TCreateParams);
begin
inherited CreateParams(Params);
with Params do begin
Style := ws_Child;
X :=FormMain.panelMain.Left;
Y :=FormMain.panelMain.Top;
Height :=FormMain.panelMain.Height;
Width := FormMain.panelMain.Height;
WndParent := FormMain.Handle;
end
end;
我还可以在面板上更改实际表单:
procedure TFormMain.ChangeToForm(newForm: TMainForm);
begin
if (newForm=nil) or (newForm=lastForm) then EXIT;
actForm:=newForm;
actForm.Visible :=true;
if assigned(lastForm) then lastForm.Visible:=false;
lastForm:=actForm;
LabelScreen.Caption:=actForm.Caption;
newForm.Left := 0;
newForm.Top := 0;
newForm.Width := panelMDI.Width;
newForm.Height := panelMDI.Height;
newForm.Left := panelMDI.Left;
newForm.Top := panelMDI.Top;
end;
当我打开应用程序时,一切正常。按钮改变形式。一切都好。 但是当用户不使用此应用程序(不要更改表单等)一段时间。 单击按钮会生成例外:
Access violation at address 0044D761 in module 'rozpoznawanie.exe'. Read of address 00000004; EAccessViolation
[...]
00534f2e jz loc_534fe9
00534f34 196 mov eax, [ebp-8]
00534f37 mov [$54b3a4], eax
00534f3c 197 mov dl, 1
00534f3e mov eax, [$54b3a4]
00534f43 > call -$9c194 ($498db4) ; Forms.TCustomForm.SetVisible
00534f48 198 cmp dword ptr [$54b3a8], 0
00534f4f jz loc_534f5d
00534f51 xor edx, edx
00534f53 mov eax, [$54b3a8]
00534f58 call -$9c1a9 ($498db4) ; Forms.TCustomForm.SetVisible
[...]
我到处寻找,我不知道为什么会出现。 你有什么想法吗?
修改
我发现问题可能更早:
00756bc8 vcl70.bpl Controls.TWinControl.HandleNeeded
00756bd5 vcl70.bpl Controls.TWinControl.GetHandle
0076e675 vcl70.bpl Forms.TCustomForm.GetMonitor
0076ecd0 vcl70.bpl Forms.TCustomForm.SetWindowToMonitor
0076daf1 vcl70.bpl Forms.TCustomForm.SetVisible
在SetWindowToMonitor 中我读到如果在计算机上我们安装了多个显示器,有时会出现此问题。但我尝试更改DefaultMonitor属性,但这不起作用。
答案 0 :(得分:0)
我可能找到了解决问题的方法。我有没有Update Pack 1的Delphi 5。
我做了一些研究,我发现问题就像我说的那样是Delphi函数TCustomForm.GetMonitor
在生产计算机上安装了一个真正的监视器和虚拟(Radmin应用程序)。
安装UP1后问题消失了。
我也可以自己改变功能:
function TCustomForm.GetMonitor: TMonitor;
var
HM: HMonitor;
I: Integer;
begin
Result := nil;
HM := MonitorFromWindow(Handle, MONITOR_DEFAULTTONEAREST);
for I := 0 to Screen.MonitorCount - 1 do
if Screen.Monitors[I].Handle = HM then
begin
Result := Screen.Monitors[I];
Exit;
end;
//if we get here, the Monitors array has changed, so we need to clear and reinitialize it
for i := 0 to Screen.MonitorCount-1 do
TMonitor(Screen.FMonitors[i]).Free;
Screen.FMonitors.Clear;
EnumDisplayMonitors(0, nil, @EnumMonitorsProc, LongInt(Screen.FMonitors));
for I := 0 to Screen.MonitorCount - 1 do
if Screen.Monitors[I].Handle = HM then
begin
Result := Screen.Monitors[I];
Exit;
end;
end;
感谢您的任何评论!
答案 1 :(得分:0)
另外,是:
Height :=FormMain.panelMain.Height;
Width := FormMain.panelMain.Height;
错字?否则使用
Height :=FormMain.panelMain.Height;
Width := FormMain.panelMain.Width;