我正在使用Delphi 10.2。我在调用TList <>。Last时遇到问题。 “评估”窗口告诉我该函数的代码已被链接器消除。
代码段:
uses
ModelObjects,
ProximitySearch,
System.Classes,
System.UITypes,
System.Generics.Collections,
Winsoft.FireMonkey.FPdfView,
Winsoft.FireMonkey.PDFium;
...
type
TWidgetFinder = class(TObject)
private
fFieldInfos: TList<TFieldInfo>;
fPAnnotation: FPDF_ANNOTATION;
...
procedure TWidgetFinder.ConfigureFieldInfo;
var
key: String;
buffer: TBytes;
textLen: LongWord;
temp: String;
begin
...
SetLength(buffer, KShortBufferLength);
textLen := FPDFAnnot_GetStringValue(fPAnnotation, ToStringType(key), buffer, Length(buffer))
temp := TEncoding.Unicode.GetString(buffer, 0, textLen - 2);
fFieldInfos.Last.Name := TEncoding.Unicode.GetString(buffer, 0, textLen - 2);
...
问题是fFieldInfos.Last.Name为空。我以为我没有正确地将缓冲区转换为字符串。但是将正确的字符串写入temp。分配给fFieldInfos.Last.Name后,对它进行评估时,会收到以下消息:
Function to be called, {System.Generics.Collections}TList<ModelObjects.TFieldInfo>.Last, was eliminated by linker
我已经看到了SO解决方案,这些解决方案建议我在初始化期间无害地调用消除函数。但是不可能是Delphi随机消除了代码,我必须发现每次消除都是一个错误。我不明白告诉链接器TList <>的操作。当我清楚地使用它时,最后一个没有被使用。有人可以帮我理解吗?
谢谢
答案 0 :(得分:2)
TList<T>.Last
是标记为内联的函数。此类方法通常不包含在二进制文件中,因此您不能在调试期间在评估器中使用它们。如果您键入fFieldInfos[fFieldInfos.Count-1]
,则最可能出现这种情况,因为GetItem
(index属性后面的getter)也被标记为内联。
您可以在评估器中输入fFieldInfos.List[fFieldInfos.Count-1]
以获得列表中的最后一项。
P.S。至于Name
为空的问题-如果TFieldInfo
是记录,则分配将无法进行,因为.Last
将返回该记录的副本并将Name
分配给那个不会影响列表中的那个。