[erledigt]Hab mit wsFullScreen probleme?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
lcb-User
Beiträge: 54
Registriert: Di 15. Jul 2014, 13:18
OS, Lazarus, FPC: Linux Mint 21.1 Cinnamon Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1
CPU-Target: 64Bit
Wohnort: München

[erledigt]Hab mit wsFullScreen probleme?

Beitrag von lcb-User »

Liebe Forengemeinde!

Unter dem Motto:
Ein Programm sagt mehr als 1000 Worte,
hab ich da mal was vorbereitet.
fullscreendemo.zip
(139.81 KiB) 48-mal heruntergeladen
Das Demoprogramm hat einen Timer um den Parameter WindowState live in eine Listbox zu schreiben.
Mit FormKeyDown reagiere ich auf F11

Aber es läuft nicht sauber.

Wenn ich das richtig sehe wird das Form von wsNormal auf wsFullScreen gebracht
(nur unter Linux, unter Windows geht die Form nicht über die Task-leiste)
aber WindowsState bleibt auf swNormal.
Erst wenn man nochmal F11 drückt gehts auf wsFullScreen.

Mach ich da was falsch?
Habt Ihr da ein Idee wie man das sauber hinbringt?

LG
Zuletzt geändert von lcb-User am Fr 10. Mär 2023, 10:20, insgesamt 1-mal geändert.
Sonnige Grüße
Bibsi


Traue keiner Statistik die du nicht selbst gefälscht hast (Sir Winston Churchill 1874 - 1965)
Linux Mint 21.1 Cinnamon 5.6.7 Kernel 5.19.0-35-generic
Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1 x86_64-linux-gtk2

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Hab mit wsFullScreen probleme?

Beitrag von h-elsner »

Ich habe das Programm mal zum Test umgeschrieben. Das verhalten kann ich bestätigen. Es sieht so aus, als ob immer wenn Resize aufgerufen wird, der WindowState auf wsNormal gesetzt wird, ohne dass das Fenster seine Größe ändert. Hier der Ablauf für 9-maliges F11-Drücken:

OnCreate: wsNormal
OnShow: wsNormal
OnActivate: wsNormal
OnResize: wsNormal
F11: 1
vorher: wsNormal
nachher: wsFullScreen
OnResize: wsNormal
F11: 2
vorher: wsNormal
nachher: wsFullScreen
F11: 3
vorher: wsFullScreen
nachher: wsNormal
OnResize: wsNormal
F11: 4
vorher: wsNormal
nachher: wsFullScreen
OnResize: wsNormal
F11: 5
vorher: wsNormal
nachher: wsFullScreen
F11: 6
vorher: wsFullScreen
nachher: wsNormal
OnResize: wsNormal
F11: 7
vorher: wsNormal
nachher: wsFullScreen
OnResize: wsNormal
F11: 8
vorher: wsNormal
nachher: wsFullScreen
F11: 9
vorher: wsFullScreen
nachher: wsNormal
fullscreendemo1.zip
(2.52 KiB) 41-mal heruntergeladen
Gruß HE

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Hab mit wsFullScreen probleme?

Beitrag von sstvmaster »

@lcb-User,

ich glaube dieses Problem gibt es schon länger. Zumindest wenn man im deutschem/englischem Forum nach wsFullScreen sucht.

zb hier: viewtopic.php?t=11742

Bau mal deinen FormKeyDown folgendermaßen um:

Code: Alles auswählen

procedure TMainForm.FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
begin
  if Key = VK_F11 then
  begin
    if WindowState = wsNormal then WindowState := wsFullScreen else WindowState := wsNormal;
    {
    case WindowState of
      wsFullScreen: WindowState := wsNormal;
      wsMaximized: WindowState := wsFullScreen;
      wsNormal: WindowState := wsFullScreen
      else
    end;
    }
    Key := 0;
  end;
end; 
Mal sehen wie das nun verhält.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
lcb-User
Beiträge: 54
Registriert: Di 15. Jul 2014, 13:18
OS, Lazarus, FPC: Linux Mint 21.1 Cinnamon Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1
CPU-Target: 64Bit
Wohnort: München

Re: Hab mit wsFullScreen probleme?

Beitrag von lcb-User »

sstvmaster hat geschrieben:
Fr 10. Mär 2023, 09:06
ich glaube dieses Problem gibt es schon länger. Zumindest wenn man im deutschem/englischem Forum nach wsFullScreen sucht.
sstvmaster: Das hat im Ablauf nichts gebracht :(
Aber Danke!

h-elsner: Du hast mich auf den Gedanke gebracht, in FormResize einzugreifen.

Code: Alles auswählen

procedure TMainForm.FormResize(Sender: TObject);
begin
  if wishFullScreen then  WindowState := wsFullScreen;  //Wenn gewünscht WindowState nochmal setzen
end; 
eine Globale Variable

Code: Alles auswählen

 var
 wishFullScreen: boolean = False; // wünsche ich eine FullScreen-Darstellung? 
und im FormKeyDown die Variable switchen

Code: Alles auswählen

if Key = VK_F11 then
  begin
    wishFullScreen := not wishFullScreen;  // Ja/Nein 
Damit hab ich's umschifft und es funktioniert wie gewünscht
aber wirklich lösen muss man's anders wo.

Danke für Euren Beitrag.
Sonnige Grüße
Bibsi


Traue keiner Statistik die du nicht selbst gefälscht hast (Sir Winston Churchill 1874 - 1965)
Linux Mint 21.1 Cinnamon 5.6.7 Kernel 5.19.0-35-generic
Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1 x86_64-linux-gtk2

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Hab mit wsFullScreen probleme?

Beitrag von theo »

Ich bin jetzt nicht drin in dem Thema, wollte nur kurz darauf hinweisen, dass ein Formular auch das Ereignis
OnWindowStateChange kennt.

ich nehme nicht an, dass dies ein Problem löst, aber vielleicht ist es doch passender als OnResize?

Benutzeravatar
lcb-User
Beiträge: 54
Registriert: Di 15. Jul 2014, 13:18
OS, Lazarus, FPC: Linux Mint 21.1 Cinnamon Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1
CPU-Target: 64Bit
Wohnort: München

Re: Hab mit wsFullScreen probleme?

Beitrag von lcb-User »

theo hat geschrieben:
Fr 10. Mär 2023, 09:49
Ich bin jetzt nicht drin in dem Thema, wollte nur kurz darauf hinweisen, dass ein Formular auch das Ereignis
OnWindowStateChange kennt.

ich nehme nicht an, dass dies ein Problem löst, aber vielleicht ist es doch passender als OnResize?
Hallo theo.

Ok, ob es für die Zukunft besser ist
FormWindowStateChange anstadt FormResize zu verwenden weiß ich nicht.
Aber momentan ist kein Unterschied zu erkennen.

Danke! :)

[edit]
FullScreenDemo.zip
(138.06 KiB) 40-mal heruntergeladen
vielleicht kann's einer brauchen, so hab ich's mir vorgestellt. :mrgreen:
Sonnige Grüße
Bibsi


Traue keiner Statistik die du nicht selbst gefälscht hast (Sir Winston Churchill 1874 - 1965)
Linux Mint 21.1 Cinnamon 5.6.7 Kernel 5.19.0-35-generic
Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1 x86_64-linux-gtk2

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: [erledigt]Hab mit wsFullScreen probleme?

Beitrag von wp_xyz »

In Delphi gibt es gar keinen fsFullScreen WindowState. Daher vermute ich, dass das eine Erweiterung in Lazarus für Nicht-Windows-Betriebssysteme ist. Ich wollte mal testen, ob zumindest die Umschaltung Normal-Maximiert richtig funtkioniert. Wenn ich in h-elsner's Code in FormKeyDown die Case-Anweisung ersetze durch

Code: Alles auswählen

    case WindowState of
      wsNormal: WindowState := wsMaximized;
      wsMaximized: WindowState := wsNormal;
    end;
schaltet das Programm unter Delphi und Lazarus einwandfrei zwischen normaler und maximierter Ansicht hin und her (unter Windows)

Benutzeravatar
lcb-User
Beiträge: 54
Registriert: Di 15. Jul 2014, 13:18
OS, Lazarus, FPC: Linux Mint 21.1 Cinnamon Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1
CPU-Target: 64Bit
Wohnort: München

Re: [erledigt]Hab mit wsFullScreen probleme?

Beitrag von lcb-User »

Hab jetzt meine Variante unter Windows 10 und XP getestet.
Da das Fenster vollständig angezeigt wird, kann auf die Symbole minimieren/maximieren/beenden geklickt werden
und das funktioniert nicht. :o
Sonnige Grüße
Bibsi


Traue keiner Statistik die du nicht selbst gefälscht hast (Sir Winston Churchill 1874 - 1965)
Linux Mint 21.1 Cinnamon 5.6.7 Kernel 5.19.0-35-generic
Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1 x86_64-linux-gtk2

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: [erledigt]Hab mit wsFullScreen probleme?

Beitrag von h-elsner »

Tatsächlich, mit wsMaximized geht es. Da ist vor Resize wsMaximized und danach auch. Bei wsFullscreen jedoch nicht.
Nochmal zur Erklärung für wsFullScreen:

F11: 1. Drücken
vorher: wsNormal
nachher: wsFullScreen // Fullscreen wird angefordert und auch ausgeführt, das Fenster wird groß --> Deshalb wird Resize ausgeführt
OnResize: wsNormal // Nach Resize steht im WindowState plötzlich wieder wsNormal drin. Warum? Ist das ein Fehler oder hat das einen Sinn?

F11: 2. Drücken
vorher: wsNormal // Obwohl das Fenster groß ist und sich über den gesamten Bildschirm erstreckt, starten wir mit wsNormal und fordern Fullscreen an.
nachher: wsFullScreen // wsFullScreen wird gesendet, aber weil das Fenster schon groß ist, wird kein Resize ausgeführt. Nun behalten wir den WindowState wsFullScreen.

F11: 3. Drücken
vorher: wsFullScreen // Da nun wsFullScreen erhalten bleibt, funktioniert das toggeln der Fenstergröße wieder.
nachher: wsNormal // Da das Fenster nun wieder kleiner wird, ruft sich Resize auf und setzt den WindowsState auf wsNormal, was ja hier richtig ist.
OnResize: wsNormal

F11: 4. Drücken // Das Spiel beginn von Neuem. Man muss immer zweimal wsFullScreen abschicken.
vorher: wsNormal
nachher: wsFullScreen
OnResize: wsNormal
... usw....

Bei wsMaximized wird der WindowState im Resize nicht mit wsNormal überschrieben, sondern bleibt erhalten.

Gruß HE

Nachtrag:

Wenn man mit wsMaximized startet, bleibt beim Resize wsFullScreen Wert erhalten und wird nicht mit wsNormal überschrieben.


OnResize: wsMaximized // Manuell auf Miximized gesetzt
F11: 1. Drücken
vorher: wsMaximized
nachher: wsFullScreen // Soweit klar
OnResize: wsFullScreen // Nach Rezeize ist immer noch wsFullScreen erhalten geblieben.
F11: 2. Drücken // Das Toggeln funktioniert hier wie erwartet, aber eben nur mit wsMaximized.
vorher: wsFullScreen
nachher: wsNormal // Nun starten wir wieder mit wsNormal und das Toggeln geht nicht mehr.

Benutzeravatar
lcb-User
Beiträge: 54
Registriert: Di 15. Jul 2014, 13:18
OS, Lazarus, FPC: Linux Mint 21.1 Cinnamon Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1
CPU-Target: 64Bit
Wohnort: München

Re: Hab mit wsFullScreen probleme?

Beitrag von lcb-User »

theo hat geschrieben:
Fr 10. Mär 2023, 09:49
Ich bin jetzt nicht drin in dem Thema, wollte nur kurz darauf hinweisen, dass ein Formular auch das Ereignis
OnWindowStateChange kennt.

ich nehme nicht an, dass dies ein Problem löst, aber vielleicht ist es doch passender als OnResize?
Nach theo's Hinweis hab ich die FormWindowStateChange zugefügt.

Code: Alles auswählen

procedure TMainForm.FormWindowStateChange(Sender: TObject);
begin
   ListBox1.Items.Add('OnWindowStateChange:   '+WindowStateToStr(WindowState));
end;                 
Und?

OnCreate: wsMaximized
OnShow: wsMaximized
OnResize: wsMaximized
OnWindowStateChange: wsNormal
OnActivate: wsNormal
OnWindowStateChange: wsMaximized
OnResize: wsMaximized
F11: 1
vorher: wsMaximized
nachher: wsFullScreen
OnResize: wsFullScreen
F11: 2
vorher: wsFullScreen
nachher: wsNormal
OnResize: wsNormal
F11: 3
vorher: wsNormal
nachher: wsFullScreen
OnWindowStateChange: wsNormal
OnResize: wsNormal
F11: 4
vorher: wsNormal
nachher: wsFullScreen
F11: 5
vorher: wsFullScreen
nachher: wsNormal
OnResize: wsNormal
F11: 6
vorher: wsNormal
nachher: wsFullScreen
OnWindowStateChange: wsNormal
OnResize: wsNormal
F11: 7
vorher: wsNormal
nachher: wsFullScreen
F11: 8
vorher: wsFullScreen
nachher: wsNormal

Das irritiert mich, dass nur einmal OnWindowStateChange kommt!?
Müsste das nicht beim zurück nochmal kommen? :?

LG
Sonnige Grüße
Bibsi


Traue keiner Statistik die du nicht selbst gefälscht hast (Sir Winston Churchill 1874 - 1965)
Linux Mint 21.1 Cinnamon 5.6.7 Kernel 5.19.0-35-generic
Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1 x86_64-linux-gtk2

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: [erledigt]Hab mit wsFullScreen probleme?

Beitrag von Ally »

Hallo lcb-User,

anbei zwei Beispiele wie man die Fensterwerte speichern kann, so dass sie beim Neustart erhalten bleiben.
Dabei wird, auch wenn man das Fenster im Vollbildmodus schließt, die Position und die Größe für wsNormal korrekt beibehalten.

Die Variante im Ordner XReg benutzt TRegistry.
TRegistry ist in Lazarus so implementiert, dass es cross-platform ist. ( https://wiki.freepascal.org/fcl-registry )
Ich habe mir dafür eine kleine Unit gebaut, die String, Integer, Boolean, usw. in die Registry schreiben und daraus lesen kann.
Das Ganze funktioniert auch unter Linux, dort werden Registry-Zugriffe automatisch im Order .config in einer entsprechenden XML gespeichert.

Vorteil: die Programmeinstellungen stehen BS-Spezifisch am "richtigen" Ort und sind immer erreichbar.


Die Variante im Ordner XIni benutzt TIniFile.
Mit dieser Variante kann man eine Ini-Datei in einen beliebigen Ordner schreiben.

Vorteil: man kann die Programmeinstellungen halt speichern wo man will. (wobei ich mir nicht ganz sicher bin ob das wirklich ein Vorteil ist. :wink: )


Gruß Roland
Dateianhänge
RegIni.zip
(12.18 KiB) 42-mal heruntergeladen

Antworten