tw26773.pp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. program SourceBug;
  2. {$APPTYPE CONSOLE}
  3. {$ifdef FPC}
  4. {$MODE Delphi}
  5. {$endif}
  6. uses
  7. Variants,
  8. SysUtils;
  9. type
  10. TSampleVariant = class(TInvokeableVariantType)
  11. protected
  12. {$ifndef FPC}
  13. function FixupIdent(const AText: string): string; override;
  14. {$endif}
  15. public
  16. procedure Clear(var V: TVarData); override;
  17. procedure Copy(var Dest: TVarData; const Source: TVarData; const Indirect: Boolean ); override;
  18. function GetProperty(var Dest: TVarData; const V: TVarData;
  19. const Name: string): Boolean; override;
  20. function SetProperty(var V: TVarData; const Name: string;
  21. const Value: TVarData): Boolean; override;
  22. end;
  23. procedure TSampleVariant.Clear(var V: TVarData);
  24. begin
  25. V.VType:=varEmpty;
  26. end;
  27. procedure TSampleVariant.Copy(var Dest: TVarData; const Source: TVarData; const Indirect: Boolean);
  28. begin
  29. if Indirect and VarDataIsByRef(Source) then
  30. VarDataCopyNoInd(Dest, Source)
  31. else with Dest do
  32. VType:=Source.VType;
  33. end;
  34. {$ifndef FPC}
  35. function TSampleVariant.FixupIdent(const AText: string): string;
  36. begin
  37. result := AText; // we do not want any uppercase names
  38. end;
  39. {$endif}
  40. function TSampleVariant.GetProperty(var Dest: TVarData; const V: TVarData;
  41. const Name: string): Boolean;
  42. begin
  43. assert(V.VType=varType);
  44. if Name='AnyField' then begin
  45. variant(Dest) := V.VInt64;
  46. result := true;
  47. end else
  48. result := false;
  49. end;
  50. function TSampleVariant.SetProperty(var V: TVarData; const Name: string;
  51. const Value: TVarData): Boolean;
  52. begin
  53. assert(V.VType=varType);
  54. if Name='AnyField' then begin
  55. PVarData(@V)^.VInt64 := variant(Value);
  56. result := true;
  57. end else
  58. result := false;
  59. end;
  60. var
  61. SampleVariant: TSampleVariant;
  62. v: Variant;
  63. begin
  64. SampleVariant:=TSampleVariant.Create;
  65. v := null;
  66. TVarData(v).VType:=SampleVariant.VarType;
  67. v.AnyField := 100;
  68. if v.AnyField=100 then
  69. writeln('ok') else
  70. writeln('ERROR: v.AnyField=',v.AnyField);
  71. readln;
  72. end.