设置可见表单的问题 - 在一段时间后表单生成异常

时间:2011-04-04 07:56:26

标签: delphi forms

我在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属性,但这不起作用。

2 个答案:

答案 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;