FTouchManager вызывает AV, когда включены темы во время выполнения

Как я написал в заголовке, у меня проблема с AV, вызванная FTouchManager, когда включены темы во время выполнения. На главной форме у меня есть рамка с одной кнопкой. Событие OnClick вызывает метод основной формы, который должен уничтожить фрейм. Если я нажму на эту кнопку, я получу AV в «Vcl.Controls». Когда я отключу темы выполнения, все будет работать нормально. Как я могу решить эту проблему?

Заранее спасибо, Тим

Протестировано на: Delphi XE3, XE6 Платформа: Win32

Vcl.Controls:

procedure TWinControl.WndProc(var Message: TMessage);
...
WM_MOUSEFIRST..WM_MOUSELAST:
        with FTouchManager do  
          if (GestureEngine <> nil) and (efMouseEvents in GestureEngine.Flags) then // <-- here I get AV error because FTouchManager = nil
            GestureEngine.Notification(Message);
...
end;

Блок кадра:

constructor TFrame2.Create(AOwner: TWinControl);
begin
  inherited Create(AOwner);
  Parent := AOwner;
end;

destructor TFrame2.Destroy;
begin
  Parent := nil;
  inherited;
end;

procedure TFrame2.Button1Click(Sender: TObject);
begin
    Form1.DestroyFrame;
end;

MainFormUnit:

procedure TForm1.FormShow(Sender: TObject);
begin
    Frame2 := TFrame2.Create(Form2);
end;

procedure TForm1.DestroyFrame;
begin
    FreeAndNil(Frame2);
end;

person Tim    schedule 05.12.2014    source источник


Ответы (1)


Вы уничтожаете фрейм и, следовательно, содержащуюся в нем кнопку во время события OnClick. Таким образом, каждый код внутри экземпляра кнопки и/или фрейма, следующий за событием OnClick, ссылается на уничтоженную личность. Мне это кажется не совсем разумным.

Лучше отправьте сообщение в форму (PostMessage), которая вызывает DestroyFrame в обработчике сообщений.

person Uwe Raabe    schedule 05.12.2014
comment
Или реализовать метод Release для TFrame точно так же, как TForm через Postmessage. Также установка Parent в конструкторе мне не кажется правильной. - person kobik; 05.12.2014
comment
Спасибо за помощь. Как вы предложили, я буду использовать PostMessage. Похоже, что кнопка была уничтожена, а затем она получила еще одно сообщение, которое вызвало AV. - person Tim; 05.12.2014