Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Form in Service rendern (https://www.delphipraxis.net/201050-form-service-rendern.html)

BambinatorXE 18. Jun 2019 21:58

Form in Service rendern
 
Hallo Leute,
ich habe eine ungewöhnliche Anforderung erhalten:
Ich brauche einen Windows-Dienst, der eine Form rendern soll und die als Bitmap (oder natürlich komprimiert) übers Netzwerk verschicken soll.
Kurz zu den Hintergründen: Gesamtarchitektur ist ein Windows Server 2012R2, auf dem ein Dienst läuft (den soll ich machen). Dieser Dienst erzeugt irgendwie eine schöne Darstellung eines Dashboards und streamt diese Darstellung per Netzwerk (Multicast) an mehrere Clients. Ob das nun Mini-PCs werden oder irgendwas à la DLNA, MJPEG, H.264 o.Ä. wird, ist erstmal nebensächlich, es geht erstmal darum, ob das überhaupt machbar ist. Die Framerate ist unkritisch (1 fps reicht).

Meine Idee ist jetzt, die Darstellung als unsichtbare TForm zu erstellen, um die VCL nutzen zu können (die Form gibts nämlich schon als normale VCL-Anwendung). Das ganze muss aber zwingend als Dienst laufen, da der Server ja normalerweise headless läuft und niemand angemeldet ist. Die Anwendung auf die ganzen Empfänger zu verteilen ist aus Sicherheitsgründen (Netztrennung der gemonitorten Daten) leider keine Option (so war's nämlich vorher). Und evtl. geht der Empfang später sogar ohne Mini-PCs mit der DLNA-Funktion der Fernseher.

Um endlich mal aufn Punkt zu kommen: wie kann ich in einem Service eine unsichtbare Form rendern und das Ergebnis als Bitmap erhalten?
Ich hab schon was gelesen, dass interaktive Services nicht mehr möglich sind, aber interaktiv brauch ichs ja nicht, ich wills ja nicht direkt dem User anzeigen... Das Dashboard komplett per Software in ein Bitmap quasi per Hand zu zeichnen wird wahrscheinlich viiiiel zu aufwendig - deswegen die Idee mit der VCL.
Mir fehlt leider komplett der Ansatzpunkt. Habt ihr eine Idee?

Vielen Dank schonmal für euer Hirnschmalz.

Stephan

Luckie 18. Jun 2019 22:20

AW: Form in Service rendern
 
Zeichne doch direkt auf das Bitmap.

BambinatorXE 18. Jun 2019 22:49

AW: Form in Service rendern
 
Zitat:

Zitat von BambinatorXE (Beitrag 1434981)
Das Dashboard komplett per Software in ein Bitmap quasi per Hand zu zeichnen wird wahrscheinlich viiiiel zu aufwendig

Die Idee hatte ich anfangs auch, das wäre nahe liegend und simpel. Aber der Teufel steckt im Detail - oder hier eher im Gegenteil. Da sind haufenweise hübsche grafische Komponenten auf der Form drauf (z.B. Tortendiagramm) - das müsst ich ja dann alles nachbauen...

gast2019 19. Jun 2019 04:10

AW: Form in Service rendern
 
Vorweg: von Services/Diensten habe ich null Ahnung.

Falls der Service das Formular anzeigen könnte, das Formular z.B. bei Left := -5000;
(also zwei Meter links vom Monitor) anzeigen lassen und das Formular sich timergesteuert als Bitmap abspeichern lassen.

Zwei Meter links vom Monitor ist ja quasi auch unsichtbar. Nur so als Idee...

Luckie 19. Jun 2019 05:15

AW: Form in Service rendern
 
Warum sollte das tun? Den Desktop eines Dienstes bekommt eh kein Benutzer zu sehen.

hoika 19. Jun 2019 06:07

AW: Form in Service rendern
 
Hallo,
ich würde "einfach" eine Html-Seite erzeugen.
Das sollte nicht ganz so aufwendig sein, wie eine Bitmap.

peterbelow 19. Jun 2019 06:36

AW: Form in Service rendern
 
Zitat:

Zitat von BambinatorXE (Beitrag 1434981)
Hallo Leute,
ich habe eine ungewöhnliche Anforderung erhalten:
Ich brauche einen Windows-Dienst, der eine Form rendern soll und die als Bitmap (oder natürlich komprimiert) übers Netzwerk verschicken soll.
Kurz zu den Hintergründen: Gesamtarchitektur ist ein Windows Server 2012R2, auf dem ein Dienst läuft (den soll ich machen). Dieser Dienst erzeugt irgendwie eine schöne Darstellung eines Dashboards und streamt diese Darstellung per Netzwerk (Multicast) an mehrere Clients. Ob das nun Mini-PCs werden oder irgendwas à la DLNA, MJPEG, H.264 o.Ä. wird, ist erstmal nebensächlich, es geht erstmal darum, ob das überhaupt machbar ist. Die Framerate ist unkritisch (1 fps reicht).

Meine Idee ist jetzt, die Darstellung als unsichtbare TForm zu erstellen, um die VCL nutzen zu können (die Form gibts nämlich schon als normale VCL-Anwendung). Das ganze muss aber zwingend als Dienst laufen, da der Server ja normalerweise headless läuft und niemand angemeldet ist. Die Anwendung auf die ganzen Empfänger zu verteilen ist aus Sicherheitsgründen (Netztrennung der gemonitorten Daten) leider keine Option (so war's nämlich vorher). Und evtl. geht der Empfang später sogar ohne Mini-PCs mit der DLNA-Funktion der Fernseher.

Um endlich mal aufn Punkt zu kommen: wie kann ich in einem Service eine unsichtbare Form rendern und das Ergebnis als Bitmap erhalten?
Ich hab schon was gelesen, dass interaktive Services nicht mehr möglich sind, aber interaktiv brauch ichs ja nicht, ich wills ja nicht direkt dem User anzeigen... Das Dashboard komplett per Software in ein Bitmap quasi per Hand zu zeichnen wird wahrscheinlich viiiiel zu aufwendig - deswegen die Idee mit der VCL.
Mir fehlt leider komplett der Ansatzpunkt. Habt ihr eine Idee?

Vielen Dank schonmal für euer Hirnschmalz.

Stephan

Ein Service läuft normalerweise ohne einen Desktop und damit kann man da, soweit ich weis, auch keine Window-Handles erzeugen. Aber es gibt da eine API-Funktion CreateDesktop, die Du Dir mal ansehen solltest.

Wenn Du das Form ohne Fehler erzeugen kannst sollte es per PaintTo möglich sein, es auf einen Bitmap-Canvas zu zeichnen.

gast2019 19. Jun 2019 06:37

AW: Form in Service rendern
 
Meine Idee (falls verwirklichbar) umschifft das Rendern einer "unsichtbaren" Form durch das Rendern einer sichtbaren Form außerhalb des Sichtfeldes.

Das Formular speichert sich mit 1fps timergesteuert als Bitmap und der Dienst verteilt das gespeicherte Bitmap weiter.

Falls das geht. Und wie schon gesagt, ich habe von Services/Diensten keine Ahnung.

Aber mein Vorschlag dürfte etwas einfacher sein als #2 "Zeichne doch direkt auf das Bitmap.".
Auf das Bitmap von was denn? Irgendwoher muß das Bitmap doch kommen...

Der TE wollte erstmal Hirnschmalz, keine Nörgeleien darüber, was man auf dem "Desktop eines Dienstes" überhaupt sieht.

Muss man hier - seit wann - die Sinnfrage #5 "Warum sollte das tun?" eigentlich immer stellen?

Für #5 "Warum sollte das tun?" kaufe ich ein "man" bei der nächsten hippen+ultracoolen Gameshow im TV :wink:

mjustin 19. Jun 2019 06:41

AW: Form in Service rendern
 
HTML verwenden wäre auch mein Kompromiss - da muss man die Oberfläche zwar neu gestalten, aber es gibt spätestens mit HTML5 und JavaScript für visuell ansprechende Oberflächen (die auch skalieren auf unterschiedliche Biildschirmauflösungen) gute Lösungen, viele als open source. Diagramme, sogar mit interaktiven Elementen, zu gestalten ist damit möglich und wenig bis mäßiger Aufwand. Und man benötigt clientseitig nur einen HTML-Client.

pesi 19. Jun 2019 07:32

AW: Form in Service rendern
 
Hmmm.... denke ich zu einfach? (was das Generieren eines "Screenshots" angeht)

Delphi-Quellcode:
I:=TBitmap.Create;
Bild:=TJPEGImage.Create;
I:=StatistikFORM.GetFormImage;
Bild.assign(I);
Bild.savetofile(Bla.jpg');
Das hat auf jeden Fall bei mir lange und gut funktioniert.
Die Anwendung war zwar kein Service sondern wurde als geplanter Task aufgerufen, aber auch dann ist ja die ganze Anwendung nicht sichtbar. Könnte daher doch auch bei einem Service funktionieren, oder???


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:19 Uhr.
Seite 1 von 2  1 2      

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