anchor.diff:    FLinesByName.Add(aName, tmp);
     tmp.EditorKind:= aEditorKind;
     tmp.Name := aName;
  -  tmp.Index:= FValueListEditor.InsertRow(aCaption, aDefaultValue, true);
  +  tmp.Caption := aCaption;
  +  tmp.Index:= FValueListEditor.InsertRow(ComposeCaption(aCaption, aMandatory), aDefaultValue, true);
     tmp.ReadOnly:= aReadOnly;
  +  tmp.Mandatory:= aMandatory;
     FLinesByIndex.Add(tmp.Index + 1, tmp);
     FValueListEditor.ItemProps[tmp.Index].ReadOnly:= tmp.ReadOnly;
     if (not tmp.ReadOnly) and ((aEditorKind = ekDate) or (aEditorKind = ekLookupFloat) or (aEditorKind = ekLookupInteger) or (aEditorKind = ekLookupText)) then
  
positive.code: type
    TEditorLine = class
    public
      Name : String;
      EditorKind : TmEditingFrameEditorKind;
      Index : integer;
      ReadOnly : boolean;
    end;
  
  { TmEditingFrame }
  
negative.code:   FValueListEditor.EditorMode:= true;
  end;
  
  function TmEditingFrame.CheckMandatoryLines(var aMissingValues: string): boolean;
  var
    i : integer;
    tmpLine : TEditorLine;
    comma : string;
  begin
    Result := true;
    aMissingValues:= '';
    comma := '';
    for i:= 0 to FLines.Count - 1 do
    begin
      tmpLine:= FLines.Items[i] as TEditorLine;
      if tmpLine.Mandatory then
      begin
        if VarIsNull(GetValue(tmpLine.Name)) then
        begin
          aMissingValues:= aMissingValues + comma + tmpLine.Caption;
          comma := ',' + sLineBreak;
          Result := false;
        end;
      end;
    end;
  end;
  
  end.
  