mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 22:14:25 +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