Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 
#5
  Alt 21. Aug 2002, 13:19
Zitat von Sharky:
ich habe das einfach über einen Mutex gelöst:
... und dabei aber vergessen, den Mutex am Ende mit "CloseHandle" oder "ReleaseMutex" freizugeben. Ein besserer Weg wäre daher dieser, weil er die alte Instanz in den Vordergrund holt:
Code:
mHandle := CreateMutex([b]nil[/b], True, '{13971189-D133-4D62-9510-AF8EACD8E366}');

[b]if[/b] GetLastError = ERROR_ALREADY_EXISTS [b]then[/b]
  [b]begin[/b]
    [color=#000080][i]// Name "TDeineForm" richtet sich nach dem Namen deiner Form! :o) -->[/i][/color]
    SendMessage(findwindow('TDeineForm',[b]nil[/b]),WM_SYSCOMMAND,SC_RESTORE,0);
    SetForegroundWindow(findwindow('TDeineForm',[b]nil[/b]));
  [b]end[/b]
[b]else[/b]
  [b]begin[/b]
    [color=#000080][i]// bla bla[/i][/color]
  [b]end[/b];

ReleaseMutex(mHandle);
Und in der Unit, um Probleme mit dem Minimieren zu vermeiden:
Code:
[b]type[/b]
  TDeineForm = [b]class[/b](TForm)
    ...
  [b]private[/b]
    [b]procedure[/b] WmSysCommand([b]var[/b] [b]Message[/b]: TMessage); [b]message[/b] WM_SYSCOMMAND;
  ...
  [b]end[/b];

[b]procedure[/b] TDeineForm.WmSysCommand([b]var[/b] [b]Message[/b]: TMessage);
[b]begin[/b]
  [b]if[/b]([b]Message[/b].Msg = WM_SYSCOMMAND) [b]and[/b] ([b]Message[/b].wParam = SC_RESTORE) [b]then[/b]
    Application.Restore;
  [b]inherited[/b];
[b]end[/b];
Im Entwickler-Forum gibt´s irgendwo noch eine Diskussion über "Semaphore", mit denen man auch festlegen kann, dass z.B. die Anwendung zweimal gleichzeitig aktiv sein kann. Jeder Startversuch darüber hinaus wird geblockt. Auch ein interessanter Ansatz.
  Mit Zitat antworten Zitat