Как вставить данные в Grid из записи

У меня есть запись с тремя полями:

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;

Теперь мне нужна процедура для вставки record 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

..и так далее.


person Dejan    schedule 21.11.2016    source источник
comment
Ваша процедура SetItem() бесполезна. Он создает запись типа TItem, заполняет ее значениями, а затем отбрасывает, не возвращая обратно.   -  person GuidoG    schedule 21.11.2016
comment
@GuidoG У меня есть вопрос об обновлении. Это ошибка. Можете ли вы помочь мне, это ясно, что мне нужно.   -  person Dejan    schedule 21.11.2016
comment
Приложение Firemonkey?   -  person LU RD    schedule 21.11.2016
comment
@LURD да это.....   -  person Dejan    schedule 21.11.2016


Ответы (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;

Существует неявное преобразование в строку для отображения в сетке.

Когда вы редактируете данные в сетке, это изменение вызывает событие 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).

person Tom Brunberg    schedule 21.11.2016