В первоначальном сообщении казалось было важно, "где" создаётся дочерняя форма, на самом деле, важно "когда" - если дочерняя форма создана после Application.Run, то имеем глюки в ehlib (вряд ли тут проблема именно в ehlib, скорее всего, какое-то сочетание факторов из-за особенностей отрисовки ehlib контролов). И важно, что приложение должно быть запущено сразу в rdp сессии (если запустить в консоли, открыть дочернюю форму и подключится по rdp, то проблема не проявляется)
В общем суть такая, что в Application.Run добавился вызов RemoteSessionCheck, который в итоге выставляет переменную FInRemoteSession. Вот обходной код.
Код:
{ TApplicationHelper }
type
TApplicationHelper = class helper for TApplication
private
function GetInRemoteSession(): Boolean;
procedure SetInRemoteSession(const Value: Boolean);
public
procedure RemoteSessionCheck;
procedure RemoteSessionChange;
property InRemoteSession: Boolean read GetInRemoteSession
write SetInRemoteSession;
end;
function TApplicationHelper.GetInRemoteSession: Boolean;
begin
Result := FInRemoteSession;
end;
procedure TApplicationHelper.SetInRemoteSession(const Value: Boolean);
begin
FInRemoteSession := Value;
end;
procedure TApplicationHelper.RemoteSessionCheck;
begin
inherited RemoteSessionCheck;
end;
procedure TApplicationHelper.RemoteSessionChange;
var
LMsg: TCMRemoteSessionStatusChanged;
begin
// часть кода из TApplication
LMsg.Msg := CM_REMOTESESSIONSTATUSCHANGED;
LMsg.InRemoteSession := Application.InRemoteSession;
LMsg.Unused := 0;
LMsg.Result := 0;
for var I: Integer := 0 to Pred(Screen.FormCount) do
begin
Screen.Forms[I].Broadcast(TMessage(LMsg));
end;
end;
procedure TForm15.Button1Click(Sender: TObject);
var
LInRemoteSession: Boolean;
begin
if not Assigned(Form16) then
begin
// решает проблему тоже
// Application.SingleBufferingInRemoteSessions := False;
LInRemoteSession := Application.InRemoteSession;
// решает проблему
// если True в момент создания формы, то глюк отрисовки в rdp сессии
Application.InRemoteSession := False;
try
// Form16 := TForm16.Create(Self);
Application.CreateForm(TForm16, Form16);
finally
Application.InRemoteSession := LInRemoteSession;
Application.RemoteSessionChange;
end;
// Application.RemoteSessionCheck;
// Application.RemoteSessionChange;
end;
Form16.Show;
end;
Есть ли простой способ как можно изменить создание всех форм в приложении в одном месте (что-то вроде декоратора на конструктор), не исправляя Vcl.Forms.pas?