大佬教程收集整理的这篇文章主要介绍了德尔福TPair例外,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
任何的想法 ?
谢谢.
program Project1; {$APPTYPE CONSOLE} uses SysUtils,Generics.Defaults,Generics.Collections; type TProduct = class private FName: String; procedure SetName(const Value: String); published public property Name: String read FName write SetName; end; type TListOfProducts = TObjectDictionary<TProduct,Integer>; { TProduct } procedure TProduct.SetName(const Value: String); begin FName := Value; end; var MyDict: TListOfProducts; MyProduct1: TProduct; MyProduct2: TProduct; MyProduct3: TProduct; APair: TPair<TProduct,Integer>; aKey: String; begin try MyDict := TListOfProducts.Create([doOwnsKeys]); MyProduct1 := TProduct.Create; MyProduct1.name := 'P1'; MyProduct2 := TProduct.Create; MyProducT2.NAME := 'P2'; MyProduct3 := TProduct.Create; MyProduct3.Name := 'P3'; MyDict.Add(MyProduct1,1); MyDict.Add(MyProduct2,2); MyDict.Add(MyProduct3,3); APair := MyDict.ExtractPair(MyProduct1); Writeln(APair.Key.Name); // <--- Error is Here. Writeln(IntToStr(APair.value)); Readln(aKey); except on E: Exception do Writeln(E.ClassName,': ',E.messagE); end; end.
RRUZ位于bug in QC.
代码如下:
function TDictionary<TKey,TValue>.ExtractPair(const Key: TKey): TPair<TKey,TValue>; var hc,index: Integer; begin hc := Hash(Key); index := GetBuckeTindex(Key,hc); if index < 0 then Exit(TPair<TKey,TValue>.Create(Key,Default(Tvalue))); DoRemove(Key,hc,cnExtracted); end;
在调用DoRemove时应该分配结果.
解决这个bug很难. ExtractPair是在不破坏密钥的情况下从字典中获取项目的唯一方法,因此您必须调用它.但由于它不会返回提取的项目,因此您需要先读取该项目,记住该值,然后调用ExtractPair.
以上是大佬教程为你收集整理的德尔福TPair例外全部内容,希望文章能够帮你解决德尔福TPair例外所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。