Components for Delphi and C++ Builder.

Перейти в английский форум
Перейти на EhLib.com
Текущее время: 27 апр 2024, 21:30

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: RAD 11.1 отрисовка навигатор панели
СообщениеДобавлено: 25 мар 2022, 12:56 
Не в сети

Зарегистрирован: 15 авг 2018, 07:39
Сообщений: 106
В 11.1, EhLib 10.2 без исходников. Такой вот баг в приложении, запущенном в rdp сессии (не локально):

Изображение

Код:
type
  TCustomGridEhHelper = class helper for TCustomGridEh
  private
    function GetHorzScrollBarPanelControl(): TGridScrollBarPanelControlEh;
  public
    property HorzScrollBarPanelControl: TGridScrollBarPanelControlEh read GetHorzScrollBarPanelControl;
  end;

function TCustomGridEhHelper.GetHorzScrollBarPanelControl: TGridScrollBarPanelControlEh;
begin
  Result := inherited HorzScrollBarPanelControl;
end;

procedure TForm15.Button1Click(Sender: TObject);
begin
  if not Assigned(Form16) then begin
    // Form16 := TForm16.Create(Self);
    Application.CreateForm(TForm16, Form16);
  end;
  Form16.Show;
end;

procedure TForm15.Button2Click(Sender: TObject);
begin
  if Assigned(Form16) then begin
    Form16.gridData.HorzScrollBarPanelControl.Repaint;
  end;
end;


Для EhLib 10.2 хотя бы Repaint отрабатывает, в более древней версии EhLib Repaint "ужирняет" отрисовку, соответственно глючит и при ресайзе дочернего окна и при перемещении по записям.

Собранное в 10.4.2 всё тоже самое работает корректно.

Важно именно в каком месте создаётся дочерняя форма - если в модуле проекта (dpr), то глюка нет ни в главной форме, ни в дочерней.
Есть идеи как можно исправить?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 25 мар 2022, 21:45 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1549
Добрый день.

Можете переслать ваш Демо проект на support@ehlib.com?

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 04 апр 2022, 09:11 
Не в сети

Зарегистрирован: 15 авг 2018, 07:39
Сообщений: 106
EhLibSupport писал(а):
Можете переслать ваш Демо проект на support@ehlib.com?

Отправил


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 апр 2022, 12:18 
Не в сети

Зарегистрирован: 15 авг 2018, 07:39
Сообщений: 106
В первоначальном сообщении казалось было важно, "где" создаётся дочерняя форма, на самом деле, важно "когда" - если дочерняя форма создана после 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?


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB