The function TTMSFNCGanttProject.GetTaskByTaskId always returns nil. To fix this, either convert FindInSubTasks into a procedure or assign the result of every FindInSubTasks call to the Result variable.
function TTMSFNCGanttProject.GetTaskByTaskId(ATaskId: string): TTMSFNCGanttTask;
function FindInSubtasks(ATasks: TTMSFNCGanttTasks): TTMSFNCGanttTask;
var
I: Integer;
begin
Result := nil;
for I := 0 to ATasks.Count - 1 do
begin
if ATasks[I].TaskId = ATaskId then
begin
Result := ATasks[I];
Exit;
end;
if ATasks[I].SubTasks.Count > 0 then
Result := FindInSubtasks(ATasks[I].SubTasks);
end;
end;
begin
Result := FindInSubtasks(Tasks);
end;
There are other functions like TTMSFNCGanttProject.GetTaskByTaskId, TTMSFNCGanttProject.GetTaskByTaskName, TTMSFNCGanttProject.DeleteTask, TTMSFNCGanttProject.DeleteTaskByTaskId or TTMSFNCGanttProject.DeleteTaskByTaskId which have the same issue.