mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-12 22:49:34 +02:00
91 lines
1.8 KiB
ObjectPascal
91 lines
1.8 KiB
ObjectPascal
{ Source provided for Free Pascal Bug Report 3899 }
|
|
{ Submitted by "Stefan Glienke" on 2005-04-19 }
|
|
{ e-mail: glienke@cpa.de }
|
|
program project2;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
uses
|
|
Classes;
|
|
|
|
type
|
|
TZVariant = packed record
|
|
VInteger: Int64;
|
|
end;
|
|
|
|
IZInterface = IUnknown;
|
|
|
|
IZObject = interface(IZInterface)
|
|
['{EF46E5F7-00CF-4DDA-BED0-057D6686AEE0}']
|
|
function Equals(const Value: IZInterface): Boolean;
|
|
end;
|
|
|
|
IZClonnable = interface(IZObject)
|
|
['{ECB7F3A4-7B2E-4130-BA66-54A2D43C0149}']
|
|
end;
|
|
|
|
IZAnyValue = interface (IZClonnable)
|
|
['{E81988B3-FD0E-4524-B658-B309B02F0B6A}']
|
|
end;
|
|
|
|
TZAbstractObject = class(TInterfacedObject, IZObject)
|
|
public
|
|
function Equals(const Value: IZInterface): Boolean; virtual;
|
|
end;
|
|
|
|
TZAnyValue = class(TZAbstractObject, IZAnyValue)
|
|
private
|
|
FValue: TZVariant;
|
|
public
|
|
constructor Create(Value: TZVariant);
|
|
function Equals(const Value: IZInterface): Boolean; override;
|
|
end;
|
|
|
|
constructor TZAnyValue.Create(Value: TZVariant);
|
|
begin
|
|
FValue := Value;
|
|
end;
|
|
|
|
function TZAnyValue.Equals(const Value: IZInterface): Boolean;
|
|
var
|
|
Temp: IZAnyValue;
|
|
begin
|
|
if Value <> nil then
|
|
begin
|
|
if Value.QueryInterface(IZAnyValue, Temp) = 0 then
|
|
begin
|
|
Result := False;
|
|
Temp := nil;
|
|
end
|
|
else
|
|
Result := inherited Equals(Value);
|
|
end
|
|
else
|
|
Result := False;
|
|
end;
|
|
|
|
function TZAbstractObject.Equals(const Value: IZInterface): Boolean;
|
|
begin
|
|
if Value <> nil then
|
|
begin
|
|
Result := (IZInterface(Self) = Value)
|
|
or ((Self as IZInterface) = (Value as IZInterface));
|
|
end
|
|
else
|
|
Result := False;
|
|
end;
|
|
|
|
|
|
var
|
|
ARecord: TZVariant;
|
|
AValue: IZAnyValue;
|
|
|
|
begin
|
|
ARecord.VInteger := 42;
|
|
AValue := TZAnyValue.Create(ARecord);
|
|
|
|
AValue.Equals(AValue);
|
|
AValue.Equals(AValue); // <-- this call produces av
|
|
|
|
end.
|