Zitat von
dust258:
Kennt Ihr das: In DEM MOMENT in dem ich hier den Thread abgesendet habe finde ich die Lösung
Danke fürs Kopfzerbrechen, ich musste nur "FindWindow('TListStatSchnittForm', nil);" nutzen ^^
Nur zu Genüge! Ich bekomme mit der Vorgehensweise aber immer nur ein graues Fenster. Ich kann es verschieben, aber nicht minimieren, nicht schließen und - wie gesagt - ich sehe keine Komponenten mehr auf dem Fenster.
Ich persönlich finde es auch
etwas kompliziert:
Den Code zum Finden des Fenster-
Handle gibt einem
WinSpy wesentlich kürzer aus. Da Du Deinen Titel und die Klasse kennst, ist das Fenster auch eindeutig identifizierbar. So kannst Du das herausfiltern des Fensternamens sparen, wenn Du bei FindWindow statt nil als zweiten Parameter, den Titel angibst.
Ich mag mich irren, aber
Handle ist
Handle und dann sollte BringWindowToTop() auch gehen. Und schließlich würde ich Deinen Code vor Application.Initialize platzieren. Das spart Zeit, Speicher etc. weil gleich als erstes geprüft wird, ob bereits ein Instanz läuft.
Ich "löse" mein Problem etwas unorthodox -
allerdings Dank Deines Schemas - dann so (
dpr-Datei):
Delphi-Quellcode:
Const
MutexName ='Eindeutiger Name für ein Chat-Programm';
Var
hMutex : THandle;
Wnd : Hwnd;
Begin
hMutex:=CreateMutex(nil, True, MutexName);
If GetLastError = ERROR_ALREADY_EXISTS Then
Begin
CloseHandle(hMutex);
Wnd:=FindWindow('TChat', 'Nachrichten');
If Wnd <> 0 Then
Begin
SendMessage(Wnd, WM_2ndInstance, 0, 0);
Halt;
End;
End;
Application.Initialize;
Application.ShowMainForm:=False;
Application.CreateForm(TChat, Chat);
Application.Run;
End.
In der
Unit fürs MainForm reagiere ich dann so:
Delphi-Quellcode:
Const
WM_2ndInstance = $0406;
Type
TChat = Class(TForm)
...
Private
Procedure WM2ndInstance(Var Msg: TMessage); Message WM_2ndInstance;
...
End;
...
Procedure TChat.WM2ndInstance(Var Msg: TMessage);
Begin
Show;
End;
Keine Ahnung, ob man das so macht. Aber es funktioniert.
Gruß, Alex