anchor.diff:    if curLine.Configuration.ReadOnly <> roAllowEditing then
       exit;
   
  -  curLine.OldDisplayValue.SetValue(FValueListEditor.Cells[aCol, aRow]);
  +  OldStringValue := FValueListEditor.Cells[aCol, aRow];
  +  OldActualValue := curLine.ActualValue;
   
     if curLine.Configuration.EditorKind = ekCalendar then
     begin
       calendarFrm := TmCalendarDialog.Create;
       try
  -      if FValueListEditor.Cells[aCol, aRow] <> '' then
  +      if OldStringValue <> '' then
         begin
           try
  -          calendarFrm.Date := StrToDate(FValueListEditor.Cells[aCol, aRow]);
  +          calendarFrm.Date := StrToDate(OldStringValue);
           except
             // ignored
           end;
         end;
         if calendarFrm.Execute then
         begin
  -        str := DateToStr(calendarFrm.Date);
  -        FValueListEditor.Cells[aCol, aRow] := str;
  -        aNewDisplayValue := str;
  -        aNewActualValue := calendarFrm.Date;
  -        curLine.OldActualValue:= curLine.ActualValue;
  +        aNewDisplayValue := DateToStr(calendarFrm.Date);
           curLine.ActualValue:= calendarFrm.Date;
           Result := true;
         end;
  
positive.code:     Changed: boolean;
      Configuration: TmEditorLineConfiguration;
      ActualValue : variant;
      OldActualValue : variant;
      OldDisplayValue : TNullableStringRecord;
      EditorExecuted : boolean;
    public
      constructor Create;
      destructor Destroy; override;
  
negative.code: 
  procedure TmEditingPanel.OnValueListEditorValidateEntry(sender: TObject; aCol, aRow: Integer; const OldValue: string; var NewValue: String);
  var
    curLine : TEditorLine;
    errorMessage : String;
    OldActualValue : variant;
  begin
    curLine := FLinesByRowIndex.Find(aRow) as TEditorLine;
  
    if curLine.Configuration.ReadOnly = roAllowEditing then
      NewValue := Trim(NewValue)
    else
    begin
      NewValue := OldValue;
      exit;
    end;
  
    if NewValue = OldValue then
      exit;
  
    OldActualValue := curLine.ActualValue;
  
    if (curLine.Configuration.EditorKind = ekSimple)
      or (curLine.Configuration.EditorKind = ekCalendar)
      or (curLine.Configuration.AllowFreeTypedText) then
    begin
      if curLine.Configuration.DataType = dtDate then
        CheckDate (OldValue, NewValue, curLine.ActualValue)
      else if curLine.Configuration.DataType = dtTime then
        CheckTime (OldValue, NewValue, curLine.ActualValue)
      else if curLine.Configuration.DataType = dtInteger then
        CheckInteger (OldValue, NewValue, curLine.ActualValue)
      else if (curLine.Configuration.DataType = dtFloat) then
        CheckFloat (OldValue, NewValue, curLine.ActualValue, curLine.Configuration)
      else if curLine.Configuration.DataType = dtUppercaseText then
      begin
        NewValue := Uppercase(NewValue);
        if NewValue <> '' then
  