基本上,我希望一个类能够实现相同通用接口的两个不同版本.
考虑这段代码
type
// a generic interface
ITest<T> = interface
['{6901FE04-8FCC-4181-9E92-85B73264B5DA}']
function Val: T;
end;
// a class that purports to implement two different types of that interface
TTest<T1, T2> = class(TInterfacedObject, ITest<T1>, ITest<T2>)
protected
fV1: T1;
fV2: T2;
public
constructor Create(aV1: T1; aV2: T2);
function Val: T1; // Val() for ITest<T1>
function T2Val: T2; // Val() for ITest<T2>
function ITest<T2>.Val = T2Val; // mapping
end;
constructor TTest<T1, T2>.Create(aV1: T1; aV2: T2);
begin
inherited Create;
fV1 := aV1;
fV2 := …Run Code Online (Sandbox Code Playgroud) 写一个游戏,我想在中间的一些过场动画.在窗口模式下,DirectShow类可以完美地工作并且易于使用.但是当游戏全屏时,我无法让DirectShow显示全屏过场动画.
基本上,当我初始化D3D设备时,即使使用IVideoWindow.put_Fullscreen(true),也无法显示视频.我猜测DirectShow不能用D3D设备做全屏.
所以,我尝试释放我的D3D设备,而过场动画播放后再重新初始化它.这似乎工作得很好,但是当DirectShow播放全屏时,它似乎从我的应用程序的主窗口窃取焦点而不是在它完成时将其恢复.然后导致DirectInput无法再次获取设备(给我一个"拒绝访问"错误代码).我在获取之前尝试过SetForegroundWindow(),但这并没有解决它,所以这可能不是问题.
无论如何,长话短说,我想要的只是在我的D3D应用程序中间的全屏过场动画.有没有一种首选的方法来实现这一目标?我可以通过将DirectShow输出到D3D主表面来实现吗?我认为这样可以解决我遇到的问题.
我有一个用D2007编译的DLL,它具有返回AnsiStrings的函数.
我的申请是在D2009编制的.当它调用AnsiString函数时,它会返回垃圾.
我创建了一个小测试app/dll进行实验,发现如果app和dll都使用相同版本的Delphi(2007或2009)进行编译,则没有问题.但是当一个在2009年和另一个2007年编译时,我得到了垃圾.
我已经尝试在这两个项目中包含最新版本的FastMM,但即使这样,2009应用程序也无法从2007 dll中读取AnsiStrings.
这里出了什么问题的想法?有办法解决这个问题吗?
给定一个包含类型名称的文本字符串,是否有某种方法可以获得适当的类型?
我想做这样的事情:
type
TSomeType<T> = class
// yadda yadda
end;
procedure DoSomething;
var
obj : TObject;
begin
o := TSomeType<GetTypeByName('integer')>.Create;
// do stuff with obj
end;
Run Code Online (Sandbox Code Playgroud)
我在网上查看了几个RTTI解释,并查看了Delphi单元,看不到我在寻找什么.这可能吗?
使用D2010,我想做这样的事情:
procedure SizeArray(var aArr: array of integer; aSize: integer);
begin
SetLength(aArr,aSize);
end;
Run Code Online (Sandbox Code Playgroud)
但这无法编译.因为我的"aArr"参数不是动态数组,所以它是一个开放数组参数.并且无法调用SetLength.我知道强制参数为动态数组的唯一方法是给它一个类型名称,如下所示:
type
TIntArray = array of integer;
procedure SizeArray(var aArr: TIntArray; aSize: integer);
begin
SetLength(aArr,aSize);
end;
Run Code Online (Sandbox Code Playgroud)
现在代码编译.它在大多数情况下工作正常,但这失败了:
procedure Test;
var
a : array of integer;
begin
SizeArray(a,5);
end;
Run Code Online (Sandbox Code Playgroud)
因为实际和正式var参数的类型必须相同,并且编译器不会将"整数数组"和"TIntArray"识别为相同类型.
所以,这是我的问题:有没有办法让编译器将我的var参数识别为动态数组而不是开放数组,以便调用者可以声明一个简单的"整数数组"而不是某些命名类型?
提前致谢.
delphi ×5
delphi-2010 ×3
ansistring ×1
delphi-2009 ×1
directshow ×1
directx ×1
dll ×1
generics ×1
rtti ×1
string ×1