小编jpf*_*ius的帖子

当作为方法参数传递时,如何避免评估TFunc <TProc <T >>?

我有以下方法:

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>给自然不通过编译时检查的方法.

delphi delphi-xe2

2
推荐指数
1
解决办法
567
查看次数

按下shift键处理鼠标滚轮事件

如果在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.

有任何想法吗?

delphi delphi-10.1-berlin

2
推荐指数
1
解决办法
415
查看次数

内部错误URW1135

在发布模式下构建应用程序时,我在其中一个文件的末尾出现内部错误URW1135.我搜索了互联网,发现(这里)它可能是关于泛型类型的数组

MyClass <T> = class
  FArray : array of T;
end;
Run Code Online (Sandbox Code Playgroud)

因此,我在整个代码库中应用了建议的解决方法(声明类型TArrayType = T的数组).

但不幸的是,错误仍然存​​在.什么想法可能是错的?

令人惊讶的是,在调试模式下一切正常.

提前致谢.

delphi generics delphi-2009

1
推荐指数
1
解决办法
1104
查看次数

过早的弦破坏以及如何避免它?

我正在使用Delphi 2009并使用以下代码段获得一些奇怪的错误:

var
  Str     : AnsiString;
  CharPtr : PAnsiChar;
...
CharPtr := PAnsiChar (Str);
ExecuteInBackgroundThread (
  procedure
  begin
  DoSomething (CharPtr);
  end);
Run Code Online (Sandbox Code Playgroud)

我猜测字符串在超出范围时会被破坏,并且在某些时间条件下,DoSomething会产生最奇怪的结果.所以第一个问题是:我是对的吗?

第二个问题是:我如何规避被破坏的字符串?这样做的正确方法是什么?

提前致谢.

delphi multithreading anonymous-methods delphi-2009

1
推荐指数
1
解决办法
200
查看次数

不区分大小写的Bob Jenkins哈希?

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 ,但我想知道如果我能以某种方式修改哈希函数本身会更快.

delphi hash delphi-2010

1
推荐指数
2
解决办法
1824
查看次数

Delphi:泛型和类型约束

是否有可能将通用类型约束为两个不同的类?

像这样:

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)

这甚至可能吗?

delphi generics constraints class

1
推荐指数
1
解决办法
2857
查看次数

模拟Indy的传入网络消息

是否可以使用Indy模拟传入的消息(如果它有任何重要性:我使用的是Indy 10和Delphi 2009)?我希望能够在本地创建这些消息,我希望Indy相信它们来自网络中的特定客户端.所有内部Indy处理(接收消息的线程的选择和类似的东西)应该与消息通过网络到达时完全相同.

有什么想法吗?提前感谢任何提示.

delphi networking indy

0
推荐指数
1
解决办法
416
查看次数

使用VCL样式形成背景颜色?

我正在尝试VCL样式.这可能是一个愚蠢的问题,但是在使用样式时是否可以使用不同背景的表单?似乎表单背景(客户区)在VCL样式设计器中指定,它覆盖了表单的Color属性.

如何获得不同背景颜色的表格?例如,我希望我的模态对话框具有与主窗体不同的背景颜色.

delphi delphi-xe2 vcl-styles

0
推荐指数
1
解决办法
2192
查看次数

检测窗体最小化的所有情况

我需要检测何时最小化表单(隐藏叠加表单).我拦截WM_SYSCOMMAND消息,如果我单击表单的最小化按钮它可以正常工作,但如果我使用[Windows] + [M],这个事件似乎不会被触发.此外,WM_ACTIVATE和WM_ACTIVATEAPP没有在这种情况下触发.

我可以使用什么事件,还有其他我需要检测的情况吗?

windows delphi delphi-xe2

0
推荐指数
2
解决办法
1236
查看次数

围绕png图像delphi整形表格

我想在我加载到我的PNG图像周围塑造我的形状,所以桌面上只有一个IPhone而不是边框​​.

就像这样: 在此输入图像描述

delphi

0
推荐指数
1
解决办法
1025
查看次数