AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

fsStayOnTop <-> fsNormal zur Laufzeit ändern?

Ein Thema von Jumpy · begonnen am 14. Feb 2012 · letzter Beitrag vom 14. Feb 2012
Antwort Antwort
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#1

fsStayOnTop <-> fsNormal zur Laufzeit ändern?

  Alt 14. Feb 2012, 08:45
Zitat von Delphi 6 Hilfe:
Der Wert von FormStyle sollte nicht zur Laufzeit geändert werden.
Genau das brauche ich aber. Sprich der User soll in den Optionen einstellen können, dass das Fenster immer OnTop ist, wenn er das wünscht und nach verlassen der Optionen soll die Einstellung direkt geändert sein. Das funktioniert aber nicht, zumindest in der einen Richtiung wenn StayOnTop aktiviert werden soll. Wegen der Bemerkung in der Hilfe, durfte ich das auch nicht erwarten.

Also behelfe ich mir derzeit mit einem "unaufälligen" Neustart:

Delphi-Quellcode:
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;
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.
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:
Das Formular bleibt immer im Vordergrund, es sei denn, bei anderen Fenstern ist FormStyle auch auf fsStayOnTop gesetzt. Wenn ein fsStayOnTop-Formular ein anderes fsStayOnTop-Formular aufruft, bleibt keines der beiden dauerhaft im Vordergrund.
Wie stelle ich das FormStyle des "unsichtbaren" Forms sinnvollerweise ein?

(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).
Ralph
  Mit Zitat antworten Zitat
Gustav.R
(Gast)

n/a Beiträge
 
#2

AW: fsStayOnTop <-> fsNormal zur Laufzeit ändern?

  Alt 14. Feb 2012, 09:09
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);
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: fsStayOnTop <-> fsNormal zur Laufzeit ändern?

  Alt 14. Feb 2012, 10:30
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:
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;
Edit:
Hab jetzt diesen bei delphi about gefundenen Codeschnipsel in mein Form eingebaut und da sowieso bereits ein Timer eingebaut war nutze ich diesen zusätzlich um immer wieder Gustav's Code auszuführen.
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.
Ralph

Geändert von Jumpy (14. Feb 2012 um 11:10 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz