anchor.diff:  begin
     FDataProvider := nil;
     FDisplayLabelFieldName := '';
  +  FAlternativeKeyFieldName:= '';
     FFieldsForLookup := TStringList.Create;
     FBooleanProvider := nil;
     FCaption:= '';
  
positive.code:   if aValue then
    begin
      if not Assigned(FBooleanProvider) then
        FBooleanProvider:= TBooleanDataProvider.Create;
      FDataProvider := FBooleanProvider;
    end
    else
  
negative.code:     Result := nil;
  end;
  
  procedure TmEditingPanel.Run;
  var
    i, k : integer;
    curLine : TEditorLine;
    str : String;
    curDatum : IVDDatum;
    curValue : Variant;
  begin
    for i := 0 to FLines.Count - 1 do
    begin
      curLine := FLines.Items[i] as TEditorLine;
      if Assigned(curLine.Configuration.ChangedValueDestination) then
        curLine.ActualValue:= curLine.Configuration.ChangedValueDestination.AsVariant;
  
      if (curLine.Configuration.EditorKind = ekDate) and (curLine.Configuration.ChangedValueDestination is TNullableDateTime) then
        str := (curLine.Configuration.ChangedValueDestination as TNullableDateTime).AsString(false)
      else if (curLine.Configuration.EditorKind = ekTime) and (curLine.Configuration.ChangedValueDestination is TNullableTime) then
        str := (curLine.Configuration.ChangedValueDestination as TNullableTime).AsString
      else if (curLine.Configuration.EditorKind = ekLookupText) and (curLine.Configuration.ChangedValueDestination.NotNull) then
      begin
        assert (Assigned(curLine.Configuration.DataProvider));
        if curLine.Configuration.AlternativeKeyFieldName = '' then
          curDatum := curLine.Configuration.DataProvider.FindDatumByStringKey(curLine.Configuration.ChangedValueDestination.AsString)
        else
        begin
          curDatum := nil;
          for k := 0 to curLine.Configuration.DataProvider.Count - 1 do
          begin
            curValue := curLine.Configuration.DataProvider.GetDatum(k).GetPropertyByFieldName(curLine.Configuration.AlternativeKeyFieldName);
            if CompareVariants(curValue, curLine.Configuration.ChangedValueDestination.AsVariant) = 0 then
            begin
              curDatum := curLine.Configuration.DataProvider.GetDatum(k);
              break;
            end;
          end;
        end;
        if Assigned(curDatum) then
        begin
          curValue := curDatum.GetPropertyByFieldName(curLine.Configuration.DisplayLabelFieldName);
          if not VarIsNull(curValue) then
            str := VarToStr(curValue)
          else
            str := '';
        end
        else
          str := curLine.Configuration.ChangedValueDestination.AsString;
      end
      else
        str := curLine.Configuration.ChangedValueDestination.AsString;
  
      curLine.Index:= FValueListEditor.InsertRow(ComposeCaption(curLine.Configuration.Caption, curLine.Configuration.Mandatory), str, true);
  
      FLinesByRowIndex.Add(curLine.RowIndex, curLine);
      FValueListEditor.ItemProps[curLine.Index].ReadOnly:= curLine.Configuration.ReadOnly;
      if (not curLine.Configuration.ReadOnly) and ((curLine.Configuration.EditorKind = ekDate) or (curLine.Configuration.EditorKind = ekLookupFloat)
        or (curLine.Configuration.EditorKind = ekLookupInteger) or (curLine.Configuration.EditorKind = ekLookupText)) then
        FValueListEditor.ItemProps[curLine.Index].EditStyle:=esEllipsis;
    end;
  end;
  
  