我有以下方法:
InstanceOfMyType(const Name: String; const Modifiers: array of TFunc<TProc<TMyType>>);
Run Code Online (Sandbox Code Playgroud)
这个想法是在单元测试中允许流畅的设置代码.
当我尝试调用该方法时会发生此问题:
// in test helper methods
function TTest.WithSomeProperty: TProc<TMyType>
begin
Result :=
procedure (MyType: TMyType)
begin
// modify MyType instance
end;
end;
// in the test
Given;
InstanceOfMyType('Name', WithSomeProperty);
Run Code Online (Sandbox Code Playgroud)
有没有办法强制编译器不评估传递TFunc并产生编译时错误?
[DCC Error] IndexerTests.pas(257): E2010 Incompatible types: 'array of System.SysUtils.TFunc<System.SysUtils.TProc<TMyType>>' and 'System.SysUtils.TProc<TMyType>'
Run Code Online (Sandbox Code Playgroud)
WithSomeProperty显然是一个TFunc<TProc<TMyType>>但是编译器总是对它进行求值并尝试将结果传递TProc<TMyType>给自然不通过编译时检查的方法.
如果在Shift按下键的同时使用鼠标滚轮,我想实现水平滚动.但WM_MOUSEWHEEL在这种情况下我没有收到任何消息:
procedure WMMouseWheel(var Msg: TMessage); message WM_MOUSEWHEEL; // is not called
Run Code Online (Sandbox Code Playgroud)
根据文档,WPARAM 应该有一条WM_MOUSEWHEEL消息MK_SHIFT.
有任何想法吗?
在发布模式下构建应用程序时,我在其中一个文件的末尾出现内部错误URW1135.我搜索了互联网,发现(这里)它可能是关于泛型类型的数组
MyClass <T> = class
FArray : array of T;
end;
Run Code Online (Sandbox Code Playgroud)
因此,我在整个代码库中应用了建议的解决方法(声明类型TArrayType = T的数组).
但不幸的是,错误仍然存在.什么想法可能是错的?
令人惊讶的是,在调试模式下一切正常.
提前致谢.
我正在使用Delphi 2009并使用以下代码段获得一些奇怪的错误:
var
Str : AnsiString;
CharPtr : PAnsiChar;
...
CharPtr := PAnsiChar (Str);
ExecuteInBackgroundThread (
procedure
begin
DoSomething (CharPtr);
end);
Run Code Online (Sandbox Code Playgroud)
我猜测字符串在超出范围时会被破坏,并且在某些时间条件下,DoSomething会产生最奇怪的结果.所以第一个问题是:我是对的吗?
第二个问题是:我如何规避被破坏的字符串?这样做的正确方法是什么?
提前致谢.
Bob Jenkins哈希函数是否存在不区分大小写的变体?
Generics.Defaults.BobJenkinsHash
Run Code Online (Sandbox Code Playgroud)
提供快速哈希函数.不幸的是,它不能与不区分大小写的比较函数结合使用
TCustomStringComparer = class (TEqualityComparer <String>)
function Equals(const Left, Right: String): Boolean; override;
function GetHashCode(const Value: String): Integer; override;
end;
function TCustomStringComparer.Equals (const Left, Right : String) : Boolean;
begin
Result := CompareText (Left, Right) = 0;
end;
function TCustomStringComparer.GetHashCode (const Value : String) : Integer;
begin
Result := Generics.Defaults.BobJenkinsHash (Value [1], Length (Value) * SizeOf (Char), 0);
end;
Run Code Online (Sandbox Code Playgroud)
这是因为TDictionary首先比较哈希码,然后在检查相等性时使用提供的比较器.
当然我可以在我的GetHashCode函数中使用UpperCase ,但我想知道如果我能以某种方式修改哈希函数本身会更快.
是否有可能将通用类型约束为两个不同的类?
像这样:
TSomeClass<T: FirstClass; T: SecondClass> = class
// ...
end;
Run Code Online (Sandbox Code Playgroud)
(抱歉没有格式化 - SO工具栏已从我的浏览器中消失).我知道上面的内容不会编译,它的编写只是为了给你们一个想法.我试过了
TSomeClass<T: FirstClass, SecondClass> = class
// ...
end;
Run Code Online (Sandbox Code Playgroud)
但后来我不被允许写
procedure TSomeClass.SomeMethod<T> (Param1: string);
Run Code Online (Sandbox Code Playgroud)
这甚至可能吗?
是否可以使用Indy模拟传入的消息(如果它有任何重要性:我使用的是Indy 10和Delphi 2009)?我希望能够在本地创建这些消息,我希望Indy相信它们来自网络中的特定客户端.所有内部Indy处理(接收消息的线程的选择和类似的东西)应该与消息通过网络到达时完全相同.
有什么想法吗?提前感谢任何提示.
我正在尝试VCL样式.这可能是一个愚蠢的问题,但是在使用样式时是否可以使用不同背景的表单?似乎表单背景(客户区)在VCL样式设计器中指定,它覆盖了表单的Color属性.
如何获得不同背景颜色的表格?例如,我希望我的模态对话框具有与主窗体不同的背景颜色.
我需要检测何时最小化表单(隐藏叠加表单).我拦截WM_SYSCOMMAND消息,如果我单击表单的最小化按钮它可以正常工作,但如果我使用[Windows] + [M],这个事件似乎不会被触发.此外,WM_ACTIVATE和WM_ACTIVATEAPP没有在这种情况下触发.
我可以使用什么事件,还有其他我需要检测的情况吗?
delphi ×10
delphi-xe2 ×3
delphi-2009 ×2
generics ×2
class ×1
constraints ×1
delphi-2010 ×1
hash ×1
indy ×1
networking ×1
vcl-styles ×1
windows ×1