mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-17 07:19:37 +02:00
no message
This commit is contained in:
parent
c36eadddf7
commit
e9b8c080bf
90
tests/webtbs/tw3899.pp
Normal file
90
tests/webtbs/tw3899.pp
Normal file
@ -0,0 +1,90 @@
|
||||
{ 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.
|
Loading…
Reference in New Issue
Block a user