Om gebruikers automatisch uit te loggen na een x tijd inactiviteit gebruik ik een timer die een message naar 't MainForm post. De message handler roept vervolgens LogoffUser aan:
Dit werkt prima, totdat er op dat moment een modal form openstaat die 1 van de MDIChildren als owner heeft. Wanneer 't MainForm de owner is, is er niets aan de hand.
Probleem is dat de Release van 't modal form pas uitgevoerd wordt nadat de QuickLogout routine is afgehandeld (deze wist de current user en toont een login schermpje). Beetje vreemd, want in de code worden de modal forms als eerste gesloten.
Oorzaak van de access violation is dat op het moment van releasen de handle naar het window niet meer bestaat.
Application.ProcessMessages na het sluiten van het modal form helpt niets, en ook een PostMessage van WM_CLOSE of CM_DEACTIVATE of DestroyWindow bieden geen soelaas.
Iemand enig idee?
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| procedure TfrmMain.CloseChildForms(AForm: TForm); var i: integer; begin for i := 0 to AForm.ComponentCount - 1 do begin if (AForm.Components[i] is TForm) and (TForm(AForm.Components[i]).FormStyle <> fsMDIChild) then begin CloseChildForms(TForm(AForm.Components[i])); TForm(AForm.Components[i]).OnCloseQuery := nil; TForm(AForm.Components[i]).OnClose := nil; TForm(AForm.Components[i]).ModalResult := mrAbort; end; end; end; procedure TfrmMain.LogoffUser; var i: integer; begin // logout inactive user UserInfo.UserName := ''; // close forms CloseChildForms(Self); for i := 0 to MdiChildCount - 1 do begin CloseChildForms(MdiChildren[i]); MdiChildren[i].OnCloseQuery := nil; MdiChildren[i].Close; end; QuickLogout(miQuickLogout); end; |
Dit werkt prima, totdat er op dat moment een modal form openstaat die 1 van de MDIChildren als owner heeft. Wanneer 't MainForm de owner is, is er niets aan de hand.
Probleem is dat de Release van 't modal form pas uitgevoerd wordt nadat de QuickLogout routine is afgehandeld (deze wist de current user en toont een login schermpje). Beetje vreemd, want in de code worden de modal forms als eerste gesloten.
Oorzaak van de access violation is dat op het moment van releasen de handle naar het window niet meer bestaat.
Application.ProcessMessages na het sluiten van het modal form helpt niets, en ook een PostMessage van WM_CLOSE of CM_DEACTIVATE of DestroyWindow bieden geen soelaas.
Iemand enig idee?