1

我使用以下方式来定义和填充带有 TCalendarEdit 原始单元格的列(这里是界面部分)。让我知道是否需要公开实现。

    type 
      TDynamicRecord = record
        Field1, Field2, Field3: string;
        DateSBU: TDate;
        TimeSBU: TTime;
      end;

      TDateCell = class(TCalendarEdit)
      protected
        procedure SetData(const Value: TValue); override;
      public
        constructor Create(AOwner: TComponent); override;
      end;

      TDateColumn = class(TColumn)
      protected
        function CreateCellControl: TStyledControl; override;
      public
        constructor Create(AOwner: TComponent); override;
      end;

代码工作正常,类型列TDateColumn可以添加到网格中。

我问了一个问题并为其打开了一个赏金,以寻找一种填充用户定义列的技术,LiveBindings但在赏金到期日之前我没有得到任何答案。这就是为什么我现在尝试另一种方式。我声明一个集合DynamicData: TList<TDynamicRecord>;并从数据集中填充它。@Mike-Sutton的回答和他的博客中非常清楚地解释了这种方法。我设法做到了这一点。数据在网格及其新定义的列中正确显示。

但现在我被另一个问题困住了。我需要更新有关用户活动的数据集。我尝试了父网格的OnSetValueandOnEditingDone事件(根据文档,这些事件将用于数据更新),但奇怪的是它没有触发。

什么是适合更新数据集的正确事件或其他方式?

4

1 回答 1

0

我认为这个问题至少部分解决了。

有必要重新声明几乎所有的类。如果有人给我建议如何降低代码的复杂性,我会很高兴。

我必须声明这个类以公开FOnEditingDoneprocedure SetValue(...)使其可访问:

type  
  TDynamicCustomGrid = class(TGrid)
  private
    FOnEditingDone: TOnEditingDone;
  protected
    procedure SetValue(Col, Row: Integer; const Value: TValue);override;
  end;
implementation
  procedure TDynamicCustomGrid.SetValue(Col, Row: Integer; const Value: TValue);
  begin
    inherited;
  end;

然后我重新声明

type  
  TDateColumn = class(TColumn)
  protected
    ...
    function Grid: TDynamicCustomGrid; overload;
    procedure DoDateChanged(Sender: TObject);
  public
    ...
  end;
implementation
procedure TDateColumn.DoDateChanged(Sender: TObject);
var
  P: TPointF;
  LGrid: TDynamicCustomGrid;
begin
  LGrid := Grid;
  if not Assigned(LGrid) then
    Exit;
  if FUpdateColumn then
    Exit;
  if FDisableChange then
    Exit;
  P := StringToPoint(TFmxObject(Sender).TagString);
  LGrid.SetValue(Trunc(P.X), Trunc(P.Y), TStyledControl(Sender).Data);
  if Assigned(LGrid.FOnEditingDone) then
    LGrid.FOnEditingDone(Grid, Trunc(P.X), Trunc(P.Y));
end;

function TDateColumn.Grid: TDynamicCustomGrid;
var
  P: TFmxObject;
begin
  Result := nil;
  P := Parent;
  while Assigned(P) do
  begin
    if P is TCustomGrid then
    begin
      Result := TDynamicCustomGrid(P);
      Exit;
    end;
    P := P.Parent;
  end;
end;

最后我分配TDateCell(Result).OnChange := DoDateChanged;function TDateColumn.CreateCellControl: TStyledControl;

我远非认为这种方式是最佳的,并且会感谢任何关于如何优化代码的评论和想法。

于 2015-09-10T12:38:54.257 回答