Проблема с множеством видимых форм - через некоторое время форма генерирует исключение - PullRequest
0 голосов
/ 04 апреля 2011

У меня проблема с приложением формы, созданным в Delphi 5. В этом приложении у меня есть несколько кнопок, которые открывают (устанавливают видимое свойство) разные формы.Это создается как родительская панель.Переопределена только одна функция:

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 голосов
/ 05 апреля 2011

Кроме того, это:

Height :=FormMain.panelMain.Height; 
Width := FormMain.panelMain.Height; 

Опечатка?Остальное использовать

Height :=FormMain.panelMain.Height; 
Width := FormMain.panelMain.Width;
0 голосов
/ 05 апреля 2011

Я, вероятно, нашел решение для моей проблемы. У меня Delphi 5 без пакета обновления 1. Я провел некоторые исследования и обнаружил, что проблема, как я уже сказал, заключается в функции 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;

Спасибо за любые комментарии!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...