Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Probleme mit Bildschirmschonervorschau (https://www.delphipraxis.net/103569-probleme-mit-bildschirmschonervorschau.html)

Delphi-Laie 26. Mai 2012 11:15

AW: Probleme mit Bildschirmschonervorschau
 
Gut, dann werde ich wohl diese komplizierte Methode vermeiden und einfach die Ereignisbehandlungsprozeduren verwenden.

Zitat:

Zitat von Popov (Beitrag 1168196)
Was den Code angeht den du nutzt, soll das ein NonVCL ScrennSaver sein?

Teils, teils. Ursprünglich nur VCL mit nur einem Formular für Vorschau und für den eigentlichen Schoner. Dazu muß dieses Formular entweder maximiert und bsNone laufen oder eben in das Vorschaufenster gepreßt werden. Und letzteres war eben nur schwierig und mit Verzögerungen abzubrechen. Die dargestellte Non-VCL-Lösung behebt diese Schwierigkeit, für den eigentlichen Schoner bleibt es beim Formular.

Ursprünglich wollte ich sogar für alle 3 Modi (Vorschau, Schoner und Konfiguration) nur ein Formular benutzen, aber damit tut man sich auch keine Freude an.

Popov 26. Mai 2012 11:43

AW: Probleme mit Bildschirmschonervorschau
 
Mit einem Fenster für alle Modi ist auch nicht so wild, man muß es nur richtig vorbereiten und auf paar Punkte achten.

Als erstens ist die Abfrage Art wie
Delphi-Quellcode:
if AnsiStartsText('/P',ParamStr(1)) then
Quatsch, sie ist nicht falsch, aber nicht effektiv. Effektiver ist die Parameter zuerst separat auszuwerten, wie z. B.

Delphi-Quellcode:
const
  ssmConfigure  = 1;       { Dialog 'Einstellungen' }
  ssmFullScreen = 2;       { Vollbildmodus }
  ssmPreview    = 3;       { Vorschau }
  ssmPassword   = 4;       { Dialog 'Passwort setzen' }
  ssmInstall    = 5;       { Installieren }

var
  ssMode: Byte;

...

    case Param1[1] of
    'C':     Result := ssmConfigure;   { Dialog 'Einstellungen' }
    'S':     Result := ssmFullScreen;  { Vollbildmodus }
    'P':     Result := ssmPreview;     { Vorschau }
...
Danach arbeitest du nur noch mit der globalen variable ssMode. In einem ein Fenster ScreenSaver reagierst du dann auf
Delphi-Quellcode:
if ssMode = ssmFullScreen
oder
Delphi-Quellcode:
if ssMode = ssmPreview
usw. Je nach ssMode reagierst du unterschiedlich. Ist es ssmFullScreen, arbeitet es wie ein ScreenSaver, ist es ssmPreview, abereitet es wie ein Programm, d. h. Tastendruck beendet das Programm nicht usw.

Dann solltest du soweit es geht alles was geht in zwei Funktionen packen für ScreenSaver begin und end, d. h. bestimmte Screensaver Funktionen sollten nicht unkontrolliert in einer normalen Prozedur behandelt werden, sondern in separaten eigenen Funktionen. Damit kannst du je nach ssMode sie aufrufen oder nicht.

Delphi-Laie 26. Mai 2012 12:05

AW: Probleme mit Bildschirmschonervorschau
 
Das ist mir durchaus klar, danke!

Also, der Bildschirmschoner wird für jeden Modus in diesem Modus neu gestartet.

Für den Vollschirmmodus, den eigentlichen Schonermodus, setzte ich den Mauscursor auf -1 (abgeschaltet) - und nach meiner Meinung auch nur in diesem (Bedingungen und Verzweigungen).

Erstaunlicherweise war der Mauscursor auch im Konfigurationsformular verschwunden. Ich setzte ihn daraufhin für diesen Modus sogar explizt auf crDefault (ist ja eigentlich schon die Starteinstellung), aber es änderte sich nichts, er wollte einfach nicht. Das war mir dann zuviel, ich hatte einfach kein Interesse, mich in diese Unwichtigkeit zu verbeißen. Also, wie schon gesagt, ich tat mir damit keine Freude. Auch muß man dann soviel an dem einen Formular "rummachen" und damit Quelltext erzeugen, daß zwei getrennte Formulare mit den entsprechenden, im Objektinspektor eingetragenen Startwerten auch ihre Berechtigung haben.

jaenicke 26. Mai 2012 14:02

AW: Probleme mit Bildschirmschonervorschau
 
Hier gibt es übrigens auch noch ein Beispiel, das habe ich mir nicht näher angeschaut, aber könnte ja interessant sein:
http://edn.embarcadero.com/article/26652

Ich selbst habe die Funktionalität in einer Klsse gekapselt, und zeichne dann nur auf das jeweilige Ziel (Vorschau oder echt). Das macht das ganze deutlich einfacher.

Delphi-Laie 26. Mai 2012 16:54

AW: Probleme mit Bildschirmschonervorschau
 
Die Vorschauschleife ist dort genauso gelöst wie weiter oben von mir hier veröffentlicht, danke!

Die eigentliche Zeichenfunktion lagerte ich in eine Prozedur aus:

Delphi-Quellcode:
procedure Ausgabe(canvas:TCanvas;x,y:word);
begin
//Quellcode für den Bildschirmschoner
end;
die so

Delphi-Quellcode:
while IsWindowVisible(DemoWnd) do Ausgabe(MyCanvas,scrWidth,scrHeight);


aufgerufen wird, das klappt soweit auch. x und y sind dabei natürlich die Abmessungen des Canvas, somit weiß die Prozedur, in welche Fläche (Ausdehnung derselben) sie zu zeichnen hat.

Nun wollte ich diesselbe Prozedur ja nicht nur für die Schonervorschau, sondern auch für das eigentliche Bildschirmschonen benutzen, deshalb ja die Prozedur. Doch der Aufruf vom als SaverScreen titulierten Formular

Delphi-Quellcode:
Ausgabe(SaverScreen.Canvas,SaverScreen.Width,SaverScreen.Height)


klappt natürlich nicht (wäre ja auch zu schön gewesen), es findet keine Ausgabe statt. Die Prozdur wird natürlich aufgerufen, das war das erste, was ich prüfte. Irgendetwas stimmt mit der Übergabe nicht. Ich probierte es schon mit Pointer, mit der Kreierung eines eigenen Canvas, dem ich das Handle des ScaverScreens respektive seines Canvas' zuwies, doch es tut sich einfach nichts, bis auf einmal, als wenigstens die Meldung kam, daß die Fläche kein Zeichnen erlaubt.

Wie bekommt man dieser Prozedur mitgeteilt, daß sie diesmal auf das Canvas des Schonerformulares zeichnen soll?

Edit: Die Übergabe des Canvas' klappt doch, der Fehler liegt woanders...

Edit 2: Fehler gefunden.

jaenicke 26. Mai 2012 18:58

AW: Probleme mit Bildschirmschonervorschau
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal ein kleines Beispiel gemacht wie ich mir das so vorstelle, siehe Anhang. ;-)
(Kompilierbar im Moment ausschließlich mit XE2.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:00 Uhr.
Seite 4 von 4   « Erste     234   

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