小编Ian*_*oyd的帖子

Delphi:如何使用非连续的子范围枚举类型?

以下子范围枚举声明有效:

type
   TReceiptCode = 'A'..'F';
Run Code Online (Sandbox Code Playgroud)

这不是:

type
   TReceiptCode = ' ','A'..'F', 'R';
Run Code Online (Sandbox Code Playgroud)

也没有

type
    TReceiptCode = ' ','A','B','C','D','E','F','R';
Run Code Online (Sandbox Code Playgroud)

如何声明具有非连续值的子范围类型?

delphi enums pascal range

3
推荐指数
2
解决办法
1562
查看次数

Win32:不必安装或发送的报告技术

我正在寻找一个报告引擎来取代Delphi 5的QuickReports.

要求

  • 免费(我不付钱找出它是否有效)
  • 开源(文档总是缺乏)
  • 不必在客户端计算机上注册(无COM)(单个可执行的depoyment)
  • 不作为seaparate文件(没有dll)发送(单个可执行部署)

我看过的一些事情:

  • MSHTML
  • 水晶
  • nevrona狂欢

delphi reporting

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

Delphi:如何响应WM_SettingChange/WM_WinIniChange?

我需要知道我的应用程序什么时候收到一条WM_SETTINGCHANGE消息(以前称为WM_WININICHANGE).

问题是TApplication中的消息泵在我有机会看到它之前将其发送到黑洞(默认处理程序):

procedure TApplication.WndProc(var Message: TMessage);
...
begin
   Message.Result := 0;

   for I := 0 to FWindowHooks.Count - 1 do
      if TWindowHook(FWindowHooks[I]^)(Message) then Exit;

   CheckIniChange(Message);

   with Message do
      case Msg of
      WM_SETTINGCHANGE:
         begin
            Mouse.SettingChanged(wParam);
            Default;   <----------------------*poof* down the sink hole
         end;
      ...
      end;
      ...
end;
Run Code Online (Sandbox Code Playgroud)

该程序CheckIniChange()不会抛出我能处理的任何事件,也不会抛出Mouse.SettingChanged().

一旦代码路径到达Default,就会沿着DefWindowProc排水孔向下发送,永远不会再被看到(因为WndProc所做的第一件事就是设置Message.Result为零.

我希望为TApplicationEvents.OnMessage事件分配一个处理程序:

procedure TdmGlobal.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
   case Msg.message of
   WM_SETTINGCHANGE:
      begin
         // Code
      end; …
Run Code Online (Sandbox Code Playgroud)

windows delphi winapi messages delphi-5

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

Delphi:如何获取事件变量的地址?

如何获取持有事件处理程序的变量的地址?

例如

TExample = class(TObject)
private
    FOnChange: TNotifyEvent;
end;
Run Code Online (Sandbox Code Playgroud)

我想要的地址的的FOnChange私有成员,事件处理函数,变量.


为什么?

我试图找出谁FOnChange用垃圾覆盖我的处理程序变量.

我正在逐步完成代码:

if Assigned(FOnChange) then
    FOnChange(Self);
Run Code Online (Sandbox Code Playgroud)

任何事件处理程序曾经分配,以及一段时间FOnChange变量是nil在观察窗口:

@FOnChange: nil
Addr(FOnChange): nil
Run Code Online (Sandbox Code Playgroud)

但后来这个FOnChange变量变成了垃圾:

@FOnChange: $2C
Addr(FOnChange): $2C
Run Code Online (Sandbox Code Playgroud)

所以我想FOnChange在CPU窗口的数据窗格中观察变量,以便我可以从以下位置观看:

00410018 00000000
Run Code Online (Sandbox Code Playgroud)

00410018 0000002C
Run Code Online (Sandbox Code Playgroud)

除了我不知道的地址FOnChange; 我刚刚编造了$410018.

如何找到事件变量的地址


我试过的事情

观察名单

OnChange: nil
@OnChange: nil
@@OnChange: Variable required
@FOnChange: nil
Assigned(OnChange): False
Assigned(FOnChange): False
@@FOnChange: $253B588
addr(addr(FOnChange)): $253B588
Run Code Online (Sandbox Code Playgroud)

Alt …

delphi debugging delphi-5 disassembly

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

一些支持格式为“\Device\Xxx”的 NT 命名空间绝对路径的 API

在本文档中, http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#paths

为了使 Windows 应用程序可以访问这些设备对象,设备驱动程序在 Win32 命名空间“Global??”中创建了一个符号链接(symlink),指向它们各自的设备对象。例如“Global??”下的COM0 和COM1 子目录只是指向 Serial0 和 Serial1 的符号链接,“C:”是指向 HarddiskVolume1 的符号链接,“Physicaldrive0”是指向 DR0 的符号链接,依此类推。如果没有符号链接,使用 Win32 命名空间约定的任何 Windows 应用程序将无法使用指定的设备“Xxx”,如前所述。但是,可以使用任何支持格式为“\Device\Xxx”的 NT 命名空间绝对路径的 API 打开该设备的句柄。

什么是 API?请让我知道一些这样的功能。


例如,我们可以在GLOBAL??命名空间中放置一个设备:

GLOBAL??\
   COM227
Run Code Online (Sandbox Code Playgroud)

我们可以使用CreateFile以下方法成功打开此设备:

//Note: we have to prefix it with \\.\ in order to tell CreateFile that
//we want to open something from the Global device namespace.
//Otherwise it will try to open a file
HANDLE hdev = CreateFile("\\.\COM227", GENERIC_READ, 0, null, OPEN_EXISTING, 0, 0);
if (hdev …
Run Code Online (Sandbox Code Playgroud)

windows filesystems winapi device device-driver

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

德尔福:如何将一个类移出一个单元;避免循环引用

问题:我想将两个类拆分为自己的文件,同时避免循环引用.

我有一个单元有一些类(和一些枚举和常量).任何人都会认出Click and Clack挺杆兄弟:

unit Cartalk;

interface

type
   TSolution = (solTransmission, solBrakes, solGremlins);

   TTappetBrother = class(TObject)
   public
      function GetSolution: TSolution; virtual; abstract;
   end;

   TClick = class(TTappetBrother)
   public      
      function GetSolution: TSolution; override;
   end;

   TClack = class(TTapperBrother)
   public
      function GetSolution: TSolution; override;
   end;

implementation

function TClick.GetSolution: TSolution;
begin
   Result := solTransmission;
end;

function TClack.GetSoltution: TSolution;
begin
   Result := solGremlins;
end;

end.
Run Code Online (Sandbox Code Playgroud)

现在显然是我的两个班级TClick并且TClick相当复杂.对于管理,我想分裂TClickTClack出自己的单位而没有违反任何现有的外部代码.

我的第一个问题是:

unit Cartalk;

interface

uses
   Cartalk_Click, Cartalk_Clack; …
Run Code Online (Sandbox Code Playgroud)

delphi refactoring circular-dependency delphi-5 circular-reference

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

cmpxchg 和 btr bts 之间的区别

btr,bts指令简单,可以锁定共享资源。

为什么该指令cmpxchg存在?这两个指令有什么不同?

x86 locking

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

需要很多辅助方法来帮助我的单元测试课 - 这是正常的吗?

我有一个通过WMI安装软件驱动程序的类.但是,我注意到在编写单元测试时,为了执行断言,我需要额外的辅助方法.例如,为了确保添加驱动程序,我需要确保驱动程序的数量增加了一个,这不是被测试类中的方法.

单元测试这是正常的,还是我做错了什么?我将采用所有这些辅助方法并将它们提取到静态类.

谢谢

nunit unit-testing

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

如何跳过Lua中的可选参数?

我一直在调用一种方法:

t1, t2 = LSL:GetDiffItem(item)
Run Code Online (Sandbox Code Playgroud)

方法声明为:

GetDiffID(item, ignoreEnchant, ignoreGem, red, yellow, blue, meta, ignorePris)
Run Code Online (Sandbox Code Playgroud)

现在我想传递其他参数,跳过一些:

项目,ignoreEnchant,ignoreGem,,,,,ignorePris

我试着跳过参数:

t1, t2 = LSL:GetDiffItem(item, ignore, ignore, , , , , ignore)
Run Code Online (Sandbox Code Playgroud)

但当然这不起作用:

'附近的意外符号'

那么,如何跳过Lua中的可选参数?


也可以看看

lua optional-parameters

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

在sql developer中执行异步存储过程

我想使用Oracle SQL Developer多次异步执行存储过程.

伪代码

var pStatus number
var pOraErrCd varchar2
var pOraErrMsg varchar2
for i 1 .. 1000 -- do async
loop 
    exec myproc('test',:pStatus ,:pOraErrCd ,:pOraErrMsg);
end loop;
Run Code Online (Sandbox Code Playgroud)

存储过程的目的是进行一些插入.对于测试,我只想异步执行存储过程很多次.我不关心任何返回值.

有一种"简单"的方法吗?

sql oracle plsql asynchronous

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