![]() |
AW: Probleme mit Bildschirmschonervorschau
Gut, dann werde ich wohl diese komplizierte Methode vermeiden und einfach die Ereignisbehandlungsprozeduren verwenden.
Zitat:
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. |
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:
Quatsch, sie ist nicht falsch, aber nicht effektiv. Effektiver ist die Parameter zuerst separat auszuwerten, wie z. B.
if AnsiStartsText('/P',ParamStr(1)) then
Delphi-Quellcode:
Danach arbeitest du nur noch mit der globalen variable ssMode. In einem ein Fenster ScreenSaver reagierst du dann auf
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 } ...
Delphi-Quellcode:
oder
if ssMode = ssmFullScreen
Delphi-Quellcode:
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.
if ssMode = ssmPreview
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. |
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. |
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:
![]() 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. |
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:
die so
procedure Ausgabe(canvas:TCanvas;x,y:word);
begin //Quellcode für den Bildschirmschoner end;
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. |
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 14:14 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-2025 by Thomas Breitkreuz