Как правильно реализовать пользовательское изображение заблокированного состояния в cxgrid в Delphi? - PullRequest
0 голосов
/ 17 сентября 2018

Я использую Delphi 10.2 Tokyo и хотел бы реализовать собственное «изображение заблокированного состояния» в потомке Tcxgrid (DevExpress VCL 18.2).

Я попытался переопределить защищенный метод DoPrepareLockedStateImage следующим образом:

function TZcxGrid.DoPrepareLockedStateImage: Boolean;
begin
   Result: = False;

   if Assigned (OnPrepareLockedStateImage) then
     OnPrepareLockedStateImage (Self, LockedStatePaintHelper.GetImage, Result)
   else
     DoLockedStateImage (Self, LockedStatePaintHelper.GetImage, Result);
end;

Реализованный выше метод вызывает переполнение стека, поскольку LockedStatePaintHelper.GetImage вызывает DoPrepareLockedStateImage из сетки.

Это способ реализации этой функциональности?

Примечание. Я не нашел темы в Центре поддержки или в FAQ по DevExpress. Я только что нашел тему, объясняющую, как использовать OnPrepareLockedStateImage метод cxgrid

1 Ответ

0 голосов
/ 17 сентября 2018

Проблема в том, что использование TcxLockedStatePaintHelper GetImage во время подготовки образа состояния вызовет переполнение стека, которое вы испытываете. Это связано с тем, что пока изображение не будет полностью подготовлено, вызов GetImage приведет к подготовке изображения (снова и снова в этом случае).

Путем прямого доступа к защищенному свойству Bitmap с помощью средства доступа это можно обойти. Используя DoLockedStateImage (ваша реализация рисования другого изображения) ваш подход будет выглядеть так:

type
  TcxLockedStatePaintHelperAccess = class(TcxLockedStatePaintHelper);

function TZcxGrid.DoPrepareLockedStateImage: Boolean;
begin
  DoLockedStateImage(Self, TcxLockedStatePaintHelperAccess(LockedStatePaintHelper).Bitmap, Result);
  Result := inherited DoPrepareLockedStateImage;
end;
...