Перейти к содержанию
  • Регистрация
  • 0
Morfi

Как правильно наследоваться от TCustomGrid ?

Вопрос

Доброго времени суток.

Нашел проблему при написании кастомного грида, который наследуется от TCustomGrid:

При использовании LiveBindings  между кастомным гридом и набором данных, после закрытия среды вываливается AV:

AV.png.ecdfe06687e4a362f93941d216c4a02e.png

 

CustomGrid.thumb.png.c225d248bb0dad4525ae922da0d51153.png

 

Подскажите, что я упустил?

 

Минимальный код кастомного грида:

Спойлер

 


unit Simple.FMX.DBGridTest;

interface

uses
  FMX.Grid, System.Classes;

type
  TCustomFMXGrid = class(TCustomGrid)
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

  end;

  TFMXGrid = class(TCustomFMXGrid)
  protected
    function GetDefaultStyleLookupName: string; override;
    procedure DoEndUpdate; override;
  published
    property Anchors;
    property Align;
    property CanFocus;
    property CanParentFocus;
    property ClipChildren;
    property ClipParent;
    property ControlType;
    property Cursor;
    property DisableFocusEffect;
    property DragMode;
    property EnableDragHighlight;
    property Enabled;
    property Height;
    property HelpContext;
    property HelpKeyword;
    property HelpType;
    property HitTest;
    property Locked;
    property Padding;
    property Opacity;
    property Margins;
    property PopupMenu;
    property Position;
    property ReadOnly;
    property RotationAngle;
    property RotationCenter;
    property Scale;
    property Size;
    property StyleLookup;
    property TextSettings;
    property StyledSettings;
    property TabOrder;
    property TabStop;
    property TouchTargetExpansion;
    property Visible;
    property Width;
    property RowHeight;
    property RowCount;
    property Options;
    property Images;

    property DefaultDrawing;
    property OnHeaderClick;
    property OnColumnMoved;
    property OnDrawColumnHeader;
    property OnSelectCell;
    property OnSelChanged;
    property OnDrawColumnBackground;
    property OnDrawColumnCell;
    property OnGetValue;
    property OnSetValue;
    property OnCreateCustomEditor;
    property OnEditingDone;
    property OnResize;
    property OnResized;
    property OnCellClick;
    property OnCellDblClick;
    property OnDragEnter;
    property OnDragLeave;
    property OnDragOver;
    property OnDragDrop;
    property OnDragEnd;
  end;

procedure Register;

implementation

uses
  FMX.Styles, FMX.Presentation.Factory, FMX.Presentation.Style, FMX.Grid.Style,
  FMX.Controls, FMX.Types;

procedure Register;
begin
  RegisterComponents('Simple', [TFMXGrid]);
end;


{ TCustomFMXGrid }

constructor TCustomFMXGrid.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

end;

destructor TCustomFMXGrid.Destroy;
begin

  inherited;
end;

{ TFMXGrid }

procedure TFMXGrid.DoEndUpdate;
begin
  Model.ClearCache;
  inherited;
end;

function TFMXGrid.GetDefaultStyleLookupName: string;
begin
  result := 'gridstyle';
end;

initialization
  TPresentationProxyFactory.Current.Register(TCustomFMXGrid, TControlType.Styled, TStyledPresentationProxy<TStyledGrid>);
  TPresentationProxyFactory.Current.Register(TFMXGrid, TControlType.Styled, TStyledPresentationProxy<TStyledGrid>);

  TColumnClasses.Register([TColumn, TStringColumn, TProgressColumn, TCheckColumn, TDateColumn, TTimeColumn, TPopupColumn,
  TImageColumn, TCurrencyColumn, TFloatColumn, TIntegerColumn, TGlyphColumn]);

  RegisterFmxClasses([TFMXGrid]);
finalization
  TColumnClasses.UnRegister([TColumn, TStringColumn, TProgressColumn, TCheckColumn, TDateColumn, TTimeColumn, TPopupColumn,
  TImageColumn, TCurrencyColumn, TFloatColumn, TIntegerColumn, TGlyphColumn]);

  TPresentationProxyFactory.Current.Unregister(TFMXGrid, TControlType.Styled, TStyledPresentationProxy<TStyledGrid>);
  TPresentationProxyFactory.Current.Unregister(TCustomFMXGrid, TControlType.Styled, TStyledPresentationProxy<TStyledGrid>);

end.

 

Изменено пользователем Morfi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

Я бы на Вашем месте копал в сторону секций initialization и finalization. Зачем повторно регистрировать TColumnClasses? Да и с TPresentationProxyFactory.Current.Unregister не всё понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От SIARHEI RAHOUSKI
      Здравствуйте, у меня возник вопрос Как базу данных подключить к TGrid? Я использую Delphi XE3 и База данных Accsess: ADOConnection + ADOQuery + DataSource. И вот как отобразить в TGrid Таблицу бд ?
    • От Niddarun
      На форме стоит tgrid при прокрутке есть заддержка. не большая но все равно не приянто. программа под windows. И еще при прокрутке идет нагрузка на процессор. 
    • От GoldenEalge
      Всем привет, подскажите как организовать MultiSelect в grid
      Нашел статью ,но как понимаю она уже не очень актуальна
      Поиск по форуму тоже не дал результатов
    • От Freezer_86
      Пишу кроссплатформенное приложение. Результат поиска отображается в TGrid. Стал вопрос отображения картинки в одной из колонок.
      На Windows все ок, но на планшете происходят просто чудеса: при первом отображение все корректно, но если простоколить вверх-вниз как картинки одни перетираются другими, часть вообще отображается вверх ногами.
      Код для сохранение картинки(jpg) в базу:
      if Assigned(sm) then begin sm.Position := 0; //TBlobField(dmData.cdsPlayerData.FieldByName('Photo')).LoadFromStream(sm); vImage := TImage.Create(nil); try sm.Position := 0; vImage.Bitmap.LoadFromStream(sm); vKoef := vImage.Bitmap.Height / 64; vImage.Bitmap.Resize(Trunc(vImage.Bitmap.Width / vKoef), Trunc(vImage.Bitmap.Height / vKoef)); sm.Free; sm := TMemoryStream.Create(); try vImage.Bitmap.SaveToStream(sm); TBlobField(dmData.cdsPlayerData.FieldByName('SmallPhoto')).LoadFromStream(sm); finally sm.Free; end; finally vImage.Free; end; end{if}; До скрола:

      После скрола:

      Пробовал и LiveBinding, и ручную прорисовку - результат один и тот же. Есть идеи что не так?
      P.S. Знаю что нужно делать через TListView, но заказчик хочет «сеточку как в старой программе», так как на android будет работать только на планшетах – я согласился.
       
    • От Clio
      Добрый день !
      В приложении я использую базу SQLite (полt, содержащие дату и время тип REAL) . В TFDQuery я описал это поле - тип Float и через LiveBindings подключил к TGrid (Date Column). 
      Но в гриде отображается только год, а не полное время. 
      Подскажите, пожалуйста, как необходимо настроить поле в Query и TGrid, чтобы дата и время отображалась правильно.
    • От ENERGY
      Нужно сделать компонент TGrid. Стандартный Grid не подходит, потому что нужно чтобы строки (raws) были разной высоты, а также чтобы была возможность соединять (сливать) ячейки.
      Я решил сделать его на основе TListView и его DynamicAppearance. Использовать кастомные объекты, отнаследованные от TListItemObject + возможность рисовать на Canvas каждого ListItem, например прямоугольники.
      Т.к. колонки он не поддерживает, есть идея использовать THeader и подстраивать их под размер своих колонок. Также важно быстродействие компонента.
      Как вы думаете есть ли в этом смысл?
      Возможно кто-то уже занимался подобным, и может что-нибудь посоветовать.
      Спасибо.
       
    • От ENERGY
      1. Можно ли установить разную высоту у ячеек (точнее raws)?
      2. Можно ли объединять ячейки?
      3. Если писать свой компонент, и отнаследоваться от ScrollBox - то при отрисовке всех ячеек, будут ли отрисовываться невидимые ячейки или TscrollBox игнорирует и не отрисовывает невидимую часть?  Или лучше стоит отнаследоваться от TScrollContent и высчитывать самостоятельно? Компонент не будет связан со стилями. Как будет быстрее в плане производительности компонента?
      4. Что лучше для этого случая TScrollContent или TScrollBox?
      4. Если 1 и 2 - нет, то придется писать свой компонент - возможно у вас будут какие то рекомендации на этот счет.
      Спасибо. Очень жду ваш ответ.
      @RoschinSpb
    • От Mazzay
      Есть хоть какая-нибудь возможность зафиксировать первый столбец, чтобы он не прокручивался?
      То есть нужен аналог свойства FixedCols из VCL,
    • От eser
      Как связать кастомный элемент стиля (например к тексту на кнопке лежащей на элементе listbox'а)  с полем FDQuery при помощи Livebinding?
    • От x0k
      Delphi 10.1 Berlin
      Как передать список в value?
      Value:=TValue.From<TStringList>(StringList); - не работает.
      Можно ли из TValue получить индекс выбранного элемента?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...