函数的返回值可能未定义

时间:2009-06-10 18:49:47

标签: delphi

好的,我有以下功能:

function TfPackagedItemEdit.GetRTFDescription: TStringList;
begin
  Result.Text := richDescription.Lines.Text; //stringlist
end;

编译器会对此行生成以下警告:

[DCC警告] W1035函数'GetRTFDescription'的返回值可能未定义

有关如何清除此警告的任何想法?(除了在项目选项中将其关闭)

我试过了:

function TfPackagedItemEdit.GetRTFDescription: TStringList;
begin
  Result.Text := '';
  Result.Text := richDescription.Lines.Text;
end;

但这也不起作用。

3 个答案:

答案 0 :(得分:21)

默认情况下,Result变量未初始化。它不会自动引用某些编译器生成的TStringList实例。您需要为Result指定一个值。这意味着在代码中的某处有一行代码:

Result := ...;

Result.X这样的表达式正在读取 Result的值,以便获得对其X成员的引用,因此您需要{ {1}}已经有了一个值。 Larry's answer演示了如何做到这一点。它会生成 new Result实例,因此此函数的调用者需要在某个时间对该对象调用TStringList

但是在评论中,您提到您正在使用此功能作为属性访问器。对于呼叫者来说,每次阅读财产时必须释放对象是不方便的,因此您的整个计划可能不合适。由于您似乎正在尝试公开描述文本,因此您可能需要考虑这一点:

Free

首先请注意,我已将返回类型更改为function TfPackagedItemEdit.GetRTFDescription: TStrings; begin Result := richDescription.Lines; end; ,这实际上是整个VCL中各种字符串列表的抽象基类。 TStrings是一个后代,但TStringList不使用TRichEdit.Lines。相反,它使用专门的TStringList后代,知道如何与底层的富编辑控件进行交互。

接下来,请注意我没有创建任何新对象。相反,我已将引用直接返回到控件的TStrings属性。 Lines属性的用户不再需要担心释放他们获得的对象。

答案 1 :(得分:14)

编译器是正确的。默认情况下不会初始化结果。尝试

function TfPackagedItemEdit.GetRTFDescription: TStringList;
begin
  Result = TStringList.Create();
  Result.Text := richDescription.Lines.Text;
end;

更新: 在回顾评论之后,我认为原始海报实际上需要这样的东西。

function TfPackagedItemEdit.GetRTFDescription: String;
begin
  Result := richDescription.Lines.Text;
end;

答案 2 :(得分:2)

我同意返回一个简单的String可能是最好的解决方案,或者至少使用它会很友好。

或者,您可以返回TStringList的引用,如果您有大量文本,这是最快的解决方案。

function TfPackagedItemEdit.GetRTFDescription: TStringList;
begin
  Result := richDescription.Lines; 
end;