anchor.diff:    if fAction <> nil then
       ActStr := fAction.ClassName;
     if fTask <> nil then
  -    TaskStr := fTask.ClassName;
  -
  -  Result := Format('UID = %d%sType = %s%sAction = %s%sTask = %s%sCurrPosition = %s',
  +    TaskStr := fTask.ObjToString;
  +
  +  Result := Format('UID = %d%sType = %s%sAction = %s%sTask = [%s]%sCurrPosition = %s',
                      [fUID, aSeparator,
                       GetEnumName(TypeInfo(TKMUnitType), Integer(fType)), aSeparator,
                       ActStr, aSeparator,
  
positive.code: end;
  
  
  procedure TKMUnitTask.Save(SaveStream: TKMemoryStream);
  begin
    SaveStream.Write(fType, SizeOf(fType)); //Save task type before anything else for it will be used on loading to create specific task type
  
negative.code:     function WalkShouldAbandon: Boolean; dynamic;
  
      function CouldBeCancelled: Boolean; virtual;
  
      function ObjToString(aSeparator: String = ', '): String; virtual;
  
      function Execute: TKMTaskResult; virtual; abstract;
      procedure Save(SaveStream: TKMemoryStream); virtual;
  