![]() |
fsStayOnTop <-> fsNormal zur Laufzeit ändern?
Zitat:
Also behelfe ich mir derzeit mit einem "unaufälligen" Neustart:
Delphi-Quellcode:
Problem ist nun, dass ich aus anderen Gründen sicher stellen muss, dass das Programm nur einmal auf dem Rechner läuft und hab nun daher einen Mutex (nach einer Anleitung hier im Forum) eingebaut.
procedure TMain.Restart;
begin if (shellexecute(Application.Handle, 'open', PChar(ParamStr(0)), nil, PChar(ExtractFilePath(ParamStr(0))), SW_SHOWNORMAL) <= 32) then ShowMessage('Bitte manuell neu starten, damit die Änderungen wirksam werden'); try acBeenden.Execute; finally //do nothing end end; Und damit schieß ich mir nun selbst ins Knie. Das neue Programm startet bevor das alte geschlossen ist. Der Mutext verhindert den Neustart. Das alte Programm schließt. Und kein Programm ist mehr da. Hat jemand eine Idee was man da machen könnte? Zweite Frage bzw. Unterbedingung im ersten Problem. Die Anwendung hat eigentlich zwei Formulare. Das erste ist immer unsichtbar, trägt die Business-Logik und ruft das eigentlich sichtbare zweite Fenster auf. Mir ist nun aber nicht ganz klar, wie diese Forms bzgl. FormStyle zueinander stehen, denn wieder aus der Delphi-Hilfe: Zitat:
(Nur so als Info: Das unsichtbare Formular ist das Optionen-Formular, sprich wenn der User was ändern will, wird dieses sichtbar gemacht und anschl. wieder ausgeblendet). |
AW: fsStayOnTop <-> fsNormal zur Laufzeit ändern?
Delphi-Quellcode:
// Soll das Fenster im Vordergrund bleiben
if bStayOnTop then SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, swp_NoMove + swp_NoSize) else SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, swp_NoMove + swp_NoSize); |
AW: fsStayOnTop <-> fsNormal zur Laufzeit ändern?
Hallo Gustav,
erstmal danke für die Antwort. Hab es wie in deinem Tipp umgesetzt (sollte öfter mal über den Tellerrand der VCL in Richtung API schauen. Lernt man immer was neues). Hab mir dann SetWindowPos bei MSDN angeschaut und via Googel noch zwei drei ähnliche Varianten gefunden, die zusätzlich noch SWP_NOACTIVATE als weiteres Flag benutzen und wo das immer zu klappen scheint. Wie ich es aber auch mache, das Fenster bleibt nicht im Vordergrund. Es scheint zunächset so, aber mach ich irgendein anderes Fenster auf, z.B. Firefox, Explorer, ..., so verschwindet meines doch wieder dahinter. Woran kann das liegen? Hier die Codestelle, wo ich das umswitche:
Delphi-Quellcode:
Edit:
procedure TMain.ApplyOptionen;
//var i, // iwidth: integer; begin if Optionen.StayOnTop then begin // self.FormStyle := fsStayOnTop; // DisplayForm.FormStyle := fsStayOnTop; SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE+swp_NoMove + swp_NoSize); SetWindowPos(DisplayForm.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE+swp_NoMove + swp_NoSize); end else begin // self.FormStyle := fsNormal; // DisplayForm.FormStyle := fsNormal; SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE+swp_NoMove + swp_NoSize); SetWindowPos(DisplayForm.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE+swp_NoMove + swp_NoSize); end; DisplayForm.AlphaBlend:= Optionen.hgDurchscheinend; DisplayForm.TransparentColor:=Optionen.hgdurchsichtig; if DisplayForm.TransparentColor then DisplayForm.Color:=DisplayForm.TransparentColorValue else DisplayForm.Color:=Optionen.hgFarbe; end; Hab jetzt diesen bei ![]() Eine der beiden Maßnahmen, oder beide Zusammen, habens dann gebracht. Einzig die Delphi-IDE drängelt sich immer noch in den Vordergrund (k.A. wieso), auch wenn ich das Prog. ausserhalb der IDE starte, aber damit kann ich leben, da das ja den Normaluser nicht betrifft. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz