好的,我有以下功能:
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;
但这也不起作用。
答案 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;