cxGrid вычисляет по мере ввода

Упрощенный У меня есть cxGrid, где я ввожу время начала и время окончания. Мне нужна функция, которая при изменении одного из этих значений вычисляет разницу и сохраняет ее в третьем столбце.

У меня возникли проблемы с поиском правильного способа сделать это.


person OZ8HP    schedule 01.07.2012    source источник
comment
Пожалуйста, уточните: DevExpress cxGrid? Базовая база данных или просто структура в памяти, такая как TSTringGrid?   -  person Jan Doggen    schedule 01.07.2012
comment
За этим стоит база данных, но мне нужно изменить значения «на экране». Я пробовал метод изменения его в таблице, но он не отображается на экране перед обновлением данных, и это имеет некоторые нежелательные эффекты.   -  person OZ8HP    schedule 01.07.2012


Ответы (1)


Я предполагаю, что вы назначили столбцу какой-то редактор свойств (возможно, DateEdit).

Учитывая это, вы можете попробовать использовать следующий код в событии OnValidate редактора свойств:

var
  ValueThirdCol : variant;
  RecordIndex : integer;
begin
  RecordIndex := myView.DataController.FocusedRecordIndex;
  ValueThirdCol := myView.DataController.GetValue(RecordIndex, MyEndDateCol.Index) - myView.DataController.GetValue(RecordIndex, MyStartDateCol.Index);
  myView.DataController.SetValue(RecordIndex, myDifCol.Index, ValueThirdCol);
end;

Обратите внимание, что вам, возможно, придется немного изменить этот код в зависимости от того, установили ли вы для GridMode или DataModeController.SyncMode значение true или нет, и использовать DisplayValue там, где это необходимо, но основная идея должна работать.

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

Чтобы код работал, вам нужно использовать (для изменяемого столбца) аргумент DisplayValue, предоставленный событием, вместо значения, возвращаемого GetValue.

Например, если EndDateCol будет столбцом, который инициирует OnValidate, тогда код должен быть

ValueThirdCol := DisplayValue - myView.DataController.GetValue(RecordIndex, MyStartDateCol.Index);

ХТН

person Guillem Vicens    schedule 02.07.2012
comment
Я пытался заставить это работать, но безуспешно. Это похоже на то, что он использует предыдущее значение из столбца, а значение, которое я набираю, не добавляется в столбец (старое значение остается там) - person OZ8HP; 06.07.2012
comment
Извините за поздний ответ. Я отредактирую свой пост, чтобы прояснить кое-что о событии OnValidate и DisplayValue. - person Guillem Vicens; 10.07.2012