ach mensch
Das funktioniert nicht so, wie ich will.
Es geht darum, dass zwar das Programm an sich zweimal gestartet werden kann.
In diesem Programm gibt es aber ein Modul, was nur einmal laufen soll.
Wenn also in dem einem Programm das Formular gerade angezeigt wird, soll es in dem anderen Programm nicht angezeigt werden können.
Dafür hab ich folgendes getan:
Eine Procedure, die prüft, ob es das Fenster schon aktiv ist.
Wenn nicht schon selbst gestartet, dann prüfen ob ein Semaphore Object der anderen Instanz des Programms existiert.
Code:
var
FormTS: TFormTS;
hSem : THandle = 0;
implementation
{$R *.dfm}
///////////////////////////////////////////////////////////////////////////////////
class function TFormTS.bereitsaktiv : boolean;
begin
result := true;
if hsem <> 0 then result := true else // dann schon selber gestartet
begin
// prüfen ob andere Instanz des Programms dieses Modul geöffnet hat
hSem := CreateSemaphore(nil,0,1,PCHAR('TS'));
if (hSem <> 0) and (GetLastError() = ERROR_ALREADY_EXISTS) then
result := true else result := false;
end;
end;
Der Aufruf erfolgt so: Und soll korrekt anzeigen, ob das Modul schon geladen ist.
Code:
/////////////////////////////////////////////////////////////////////////////////////
procedure TFormMain.Automatisierung1Click(Sender: TObject);
begin
if TFormTS.bereitsaktiv then
MessageDlg('bereits aktiv !', mtWarning, [mbOK], 0)
else
FormTS.show;
end;
im Formclose des Forms steht folgendes.
Code:
if hsem <> 0 then
begin
CloseHandle(hsem);
hsem := 0;
end;
und nun passiert folgendes:
in der einen laufenden Programm Instanz zeige ich das Fenster.
Wenn ich in der anderen laufenden Instanz des Programms dies nun auch tun will, zeigt er völlig korrekt die Meldung, dass es bereits aktiv wäre.
Wenn ich nun in dem anderen Programm das Fenster schließe, lässt sich ein keiner Der Versionen das Fenster wieder öffnen.
Wichtig bei diesem Test ist, dass man einen Check bei gerade geöffnetem Fenter machen muss !
hmmm