Doppelpufferung und Remote-Verbindungen
Nach oben zu Mit Steuerelementen arbeiten - Index
Gemäß den empfohlenen Best Practices sollte in Anwendungen keine Doppelpufferung verwendet werden, wenn sie über eine Remote-Desktop-Verbindung ausgeführt werden, da sonst das gesamte Speicher-Bitmap über die Remote-Desktop-Verbindung übertragen werden muss.
Aus diesem Grund hat TApplication seit RAD Studio 11.1 zwei neue public-Eigenschaften und ein neues public-Ereignis, um Einzel- und Doppelpufferung zu behandeln, wenn Anwendungen über eine Remote- oder lokale Verbindung ausgeführt werden.
Die Ereignisbehandlungsroutine OnRemoteSessionChanged wird ausgelöst, wenn die Sitzung von lokal zu remote oder umgekehrt wechselt. Sie kann das Standardverhalten bei der Aktualisierung von InRemoteSession mit ihrem var-Parameter InRemoteSession überschreiben.
Die Eigenschaft InRemoteSession gibt einen booleschen Wert zurück. Sie gibt True
zurück, wenn die aktuelle Sitzung remote ist (d. h. wenn sie über RDP ausgeführt wird), und False
, wenn sie lokal ist, vorausgesetzt die Ereignisbehandlungsroutine OnRemoteSessionChanged hat das Standardverhalten nicht überschrieben.
Der Standardwert der Eigenschaft SingleBufferingInRemoteSessions ist True
, was verursacht, dass alle VCL-Steuerelemente ohne Design ihre Eigenschaft DoubleBuffered ignorieren, wenn sie in einer Remote-Sitzung ausgeführt werden. Bei False
verwenden Steuerelemente ohne Design weiterhin die Doppelpufferung in Remote-Sitzungen.
Beim Start (in der Prozedur Run) überprüft das Objekt TApplication, ob die aktuelle Sitzung eine lokale oder eine Remote-Sitzung ist. Sie wird auch benachrichtigt, wenn die Sitzung während der Programmausführung von lokal zu remote oder umgekehrt wechselt. Das Verhalten, wenn der Sitzungstyp beim Start festgelegt wird oder wenn er sich zur Laufzeit ändert, ist identisch:
- Das Ereignis OnRemoteSessionChanged wird mit dem neuen Sitzungsstatus ausgelöst, der in einem var-Parameter übergeben wird, sodass der Benutzercode die Änderung bei Bedarf stoppen kann, damit sie nicht bemerkt wird.
- Unter der Voraussetzung, dass die Änderung nicht von der Ereignisbehandlungsroutine "ausgeblendet" wurde, wird InRemoteSession festgelegt, um anzuzeigen, ob die aktuelle Sitzung remote ist oder nicht, sodass diese Eigenschaft von Benutzercode verwendet werden kann.
Wenn InRemoteSession und SingleBufferingInRemoteSessions beide True
sind, dann ignorieren VCL-Steuerelemente ohne Design ihre DoubleBufferered-Eigenschaft und verwenden die Einzelpufferung.
Für Steuerelemente mit Design und Stil-Hooks sollte im Code nur die Doppelpufferung verwendet werden, wenn dies zu True
ausgewertet wird:
DoubleBuffered and (not InRemoteSession or not SingleBufferingInRemoteSessions)
Das heißt, wenn der Anwendungsentwickler eine Doppelpufferung möchte, unabhängig davon, ob die Anwendung in einer lokalen oder Remote-Sitzung ausgeführt wird, wird das Steuerelement so konfiguriert, dass es die Doppelpufferung verwendet.