首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >柱移动后的FMX TGrid OnGetValue

柱移动后的FMX TGrid OnGetValue
EN

Stack Overflow用户
提问于 2017-04-14 20:08:03
回答 1查看 332关注 0票数 0

我有支持移动列的Grid,并编写了以下代码:

代码语言:javascript
运行
复制
type
  TRec = record
    Col0,
    Col1,
    Col2: string;
  end;

var
  Data: TArray<TRec>;

procedure TFormMain.GridGetValue(Sender: TObject; const Col, Row: Integer; var Value: TValue);
begin
  case Col of
    0:  Value := Data[Row].Col0;
    1:  Value := Data[Row].Col1;
    2:  Value := Data[Row].Col2;
  end;
end;

移动列时,此OnGetValue代码工作不正确(显示前几个位置上的列数据)。怎么解决这个问题?我应该使用OnColumnMoved事件并手动记住新列的位置吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-16 10:54:54

好吧,这是我自己的答案:

我们应该将帮助函数添加到TRec中,以便按索引读取字段:

代码语言:javascript
运行
复制
type
  TRec = record
    Col0,
    Col1,
    Col2: string;
    function GetField(AIndex: Integer): string;
  end;

function TRec.GetField(AIndex: Integer): string;
begin
  case AIndex of
    0:  Result := Col0;
    1:  Result := Col1;
    2:  Result := Col2;
  else
    Result := '';
  end;
end;

还有两个函数可以使用Ini文件保存和恢复TGrid列:

代码语言:javascript
运行
复制
type
  TColumnData = record
    Pos:     UInt8;
    Visible: Boolean;  
    Width:   UInt16;
  end;

procedure LoadColumns(AGrid: TGrid; const ASection, AIdent: string);
var
  I, J, ColsSize: Integer;
  A: TArray<TColumnData>;
  Col: TColumn;
begin
  for I := 0 to AGrid.ColumnCount - 1 do
    AGrid.Columns[I].Tag := I;
  SetLength(A, AGrid.ColumnCount);
  ColsSize := AGrid.ColumnCount*SizeOf(TColumnData);
  if ReadIni(<FileName>, ASection, AIdent, (@A[0])^, ColsSize) = ColsSize then
    for J := 0 to AGrid.ColumnCount - 1 do begin
      for I := 0 to AGrid.ColumnCount - 1 do begin
        Col := AGrid.Columns[I];
        if Col.Tag = A[J].Pos then begin
          Col.Index   := J;
          Col.Visible := A[J].Visible;
          Col.Width   := A[J].Width;
        end;
      end;
    end;
end;

procedure SaveColumns(AGrid: TGrid; const ASection, AIdent: string);
var
  I, ColsSize: Integer;
  A: TArray<TColumnData>;
  Col: TColumn;
begin
  SetLength(A, AGrid.ColumnCount);
  ColsSize := AGrid.ColumnCount*SizeOf(TColumnData);
  for I := 0 to AGrid.ColumnCount - 1 do begin
    Col := AGrid.Columns[I];
    A[I].Pos     := Col.Tag;
    A[I].Visible := Col.Visible;
    A[I].Width   := Round(Col.Width);
  end;
  WriteIni(<FileName>, ASection, AIdent, (@A[0])^, ColsSize);
end;

现在,我们应该从OnFormCreate调用OnFormCreate,从OnFormDestroy调用SaveColumns (也是为列初始化标记字段),从OnFormDestroy调用SaveColumns。最后是OnGetValue代码:

代码语言:javascript
运行
复制
var
  Data: TArray<TRec>;

procedure TFormMain.GridGetValue(Sender: TObject; const Col, Row: Integer; var Value: TValue);
begin
  Value := Data[Row].GetField((Sender as TGrid).Columns[Col].Tag);
end;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43418528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档