如何从记录中将数据插入Grid

时间:2016-11-21 14:43:19

标签: delphi firemonkey delphi-10.1-berlin

我有三个记录:

type
    TItem = record

    Item    : String;
    Quantity: SmallInt;
    Price   : Currency;
 end;

我也有将值设置为记录的程序:

function TForm1.SetItem(item:string;quan:SmallInt;price:Currency):TItem;
   var It :TItem; 
   begin
          It.Item :=item;
          It.Quantity:= quan;
          It.Price:=price;
         Result :=It;
   end;

现在,我需要一个将记录TItem 插入 TStringGrid TGrid 的程序,我不知道该怎么做。 我的TStringGrid中还有三列:

1. col_Item     :string;
2. col_Quantity :SmallInt;
3. col_Price    :Currency;

每当我调用 SetItem 程序时,我需要在记录中填写三个列中的三列:

结果应该是这样的:

ITEM      | Quantity  | Price   

Bread         1         1,5
Coca cola     1         3
Fanta         2         3

..等等。

1 个答案:

答案 0 :(得分:1)

首先,网格(TGrid)不存储数据,因此您需要提供像f.ex这样的数据存储。 TDataArr = array of TItem;。当网格需要在单元格中显示数据时,它会调用OnGetValue()事件:

procedure TForm4.Grid1GetValue(Sender: TObject; const Col, Row: Integer;
  var Value: TValue);
begin
  if Row > (Length(DataArr)-1) then exit;
  case Col of
    0: Value := DataArr[Row].Item;
    1: Value := DataArr[Row].Quantity;
    2: Value := DataArr[Row].Price;
  end;
end;

网格中的disply隐式转换为字符串。

在网格中编辑数据时,更改会触发OnSetValue事件:

procedure TForm4.Grid1SetValue(Sender: TObject; const Col, Row: Integer;
  const Value: TValue);
begin
  if Row > (Length(DataArr)-1) then exit;
  case Col of
    0: DataArr[Row].Item := Value.AsString;
    1: DataArr[Row].Quantity := StrToInt(Value.AsString);
    2: DataArr[Row].Price := StrToCurr(Value.AsString);
  end;
end;

似乎没有其他方式的隐式转换,因此StrToInt(Value.AsString)StrToCurr(Value.AsString)