anchor.diff:  begin
     FDataProvider := nil;
     FDisplayLabelFieldName := '';
  +  FAlternativeKeyFieldName:= '';
     FFieldsForLookup := TStringList.Create;
     FBooleanProvider := nil;
     FCaption:= '';
  
positive.code:     Result := aCaption + ' *'
    else
      Result := aCaption;
  end;
  
  procedure TmEditingPanel.AddLine_(const aName: string; const aCaption: string; const aDefaultDisplayValue: string; const aDefaultActualValue: variant; const aEditorKind : TmEditorLineKind; const aReadOnly : boolean = false; const aMandatory: boolean = false; const aChangedValueDestination : TAbstractNullable=nil);
  var
    tmp : TEditorLine;
  begin
    tmp := TEditorLine.Create;
    FLines.Add(tmp);
    FLinesByName.Add(aName, tmp);
    tmp.Configuration.FEditorKind:= aEditorKind;
    tmp.Name := aName;
    tmp.Configuration.Caption := aCaption;
    tmp.Index:= FValueListEditor.InsertRow(ComposeCaption(aCaption, aMandatory), aDefaultDisplayValue, true);
    tmp.ActualValue:= aDefaultActualValue;
    tmp.Configuration.ReadOnly:= aReadOnly;
    tmp.Configuration.Mandatory:= aMandatory;
    tmp.Configuration.ChangedValueDestination := aChangedValueDestination;
    FLinesByRowIndex.Add(tmp.RowIndex, tmp);
    FValueListEditor.ItemProps[tmp.Index].ReadOnly:= tmp.Configuration.ReadOnly;
    if (not tmp.Configuration.ReadOnly) and ((aEditorKind = ekDate) or (aEditorKind = ekLookupFloat) or (aEditorKind = ekLookupInteger) or (aEditorKind = ekLookupText)) then
      FValueListEditor.ItemProps[tmp.Index].EditStyle:=esEllipsis;
  end;
  
  procedure TmEditingPanel.AddLineForNullable_(const aName: string; const aCaption: String; aValue: TAbstractNullable;
    const aEditorKind: TmEditorLineKind; const aReadOnly, aMandatory: boolean; const aDisplayValue : variant);
  var
    tmp : TEditorLine;
    str : string;
  begin
    tmp := TEditorLine.Create;
    FLines.Add(tmp);
    FLinesByName.Add(aName, tmp);
    tmp.Configuration.EditorKind:= aEditorKind;
    tmp.Name := aName;
    tmp.Configuration.Caption := aCaption;
    if VarIsNull(aDisplayValue) then
    begin
      if (aEditorKind = ekDate) and (aValue is TNullableDateTime) then
        str := (aValue as TNullableDateTime).AsString(false)
      else if (aEditorKind = ekTime) and (aValue is TNullableTime) then
        str := (aValue as TNullableTime).AsString
      else
        str := aValue.AsString;
    end
    else
      str := VarToStr(aDisplayValue);
    tmp.Index:= FValueListEditor.InsertRow(ComposeCaption(aCaption, aMandatory), str, true);
    tmp.ActualValue:= aValue.AsVariant;
    tmp.Configuration.ReadOnly:= aReadOnly;
    tmp.Configuration.Mandatory:= aMandatory;
    tmp.Configuration.ChangedValueDestination := aValue;
    FLinesByRowIndex.Add(tmp.RowIndex, tmp);
    FValueListEditor.ItemProps[tmp.Index].ReadOnly:= tmp.Configuration.ReadOnly;
    if (not tmp.Configuration.ReadOnly) and ((aEditorKind = ekDate) or (aEditorKind = ekLookupFloat) or (aEditorKind = ekLookupInteger) or (aEditorKind = ekLookupText)) then
      FValueListEditor.ItemProps[tmp.Index].EditStyle:=esEllipsis;
  end;
  
  procedure TmEditingPanel.AddMemo(const aName: string; const aCaption: string;const aDefaultValue: string; const aMemoHeightPercent : double; const aChangedValueDestination : TAbstractNullable = nil);
  
negative.code: 
          tmpDataset.Active:= true;
          tmpDataset.Refresh;
  
          if curLine.Configuration.AlternativeKeyFieldName <> '' then
            keyFieldName := curLine.Configuration.AlternativeKeyFieldName
          else
            keyFieldName := curLine.Configuration.DataProvider.GetKeyFieldName;
  
          lookupFrm.Init(tmpDataset, curLine.Configuration.FieldsForLookup,
            keyFieldName, curLine.Configuration.DisplayLabelFieldName);
          if lookupFrm.ShowModal = mrOk then
          begin
            aNewDisplayValue:= lookupFrm.SelectedDisplayLabel;
  