小编Ric*_*h R的帖子

键盘钩子用delphi寻找F12

这个问题可能已经得到解答,但我一直无法找到正确的答案.我正试图在表单中按下F12键时切换调试开关.我无法使用onkeydown事件,因为我必须为每个字段设置一个单独的函数以及表单.所以我研究并发现了SetWindowsHookEx函数来设置键盘钩子.这个工作得很好,除了我得到两个指示F12键每次按下时都按下:

2014/05/21 14:16:43.334
Code: 0
Key: 123
KeyStroke: 5767169
KeyStroke to Hex: 00580001
2014/05/21 14:16:43.446
Code: 0
Key: 123
KeyStroke: -1067974655
KeyStroke to Hex: C0580001  Note: this should be the keystroke that reflects KEYDOWN
Run Code Online (Sandbox Code Playgroud)

我看到Keystroke是检查keydown的可能方法(WM_KEYDOWN $ 0100).我的问题是如何为WM_KEYDOWN测试击键?

这是我的回调函数:

function KeyboardHookProc(Code: Integer; Key: Word; KeyStroke: LongInt) : LongInt;
begin
  Result := 0;
  if Code = HC_NOREMOVE then exit;
  Result := CallNextHookEx(FkbHook, Code,Key,KeyStroke);
  if Code < 0  then exit;

{
WM_KEYDOWN

}
  if (KeyStroke and WM_KEYDOWN) = 0 then { this is …
Run Code Online (Sandbox Code Playgroud)

delphi setwindowshookex

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

尝试释放FSQL时,Delphi XE3指针无效(TStringList)

我正在XE3中创建一个新的应用程序,但使用在D2007中创建的一些单位.

我在释放TStringList数据项时遇到错误.这是创建数据项FSQL的代码:

procedure TPayorDM.DataModuleCreate(Sender: TObject);
begin
  FPayorDRM := TDRM.Create;
  FSQL := TStringList.Create;
end;
Run Code Online (Sandbox Code Playgroud)

这是获取错误的代码:

procedure TPayorDM.DataModuleDestroy(Sender: TObject);
begin
  FreeAndNil(FSQL);
  if T_Payor.Active then T_Payor.Close;
  FreeAndNil(FPayorDRM);
end;
Run Code Online (Sandbox Code Playgroud)

错误发生在'FreeAndNil(FSQL);'上.我尝试了'FSQL.Free',我得到了相同的结果.

这是我得到的错误:

项目:PayorUpdate.exe引发异常类EInvalidPointer,消息为"无效指针操作".

当我打破蓝色箭头(调试模式)指向_FreeMem(指针(Self)); 在System单元中的TObject.FreeInstance过程中如下:

procedure TObject.FreeInstance;
begin
  CleanupInstance;
  _FreeMem(Pointer(Self));
end;
Run Code Online (Sandbox Code Playgroud)

如果我没有释放TStringList数据项,我会在应用程序中出现内存泄漏.

是否可能需要设置配置选项?我搜索谷歌并没有找到任何解释我做错的事情,除了三种可能之一:

  • 它是由其他一些内存管理器分配的.
  • 它曾经被释放过一次.
  • 它从未被任何东西分配过.

如果我试一试......除了......我能解决这个问题,但我不想这样做.

顺便说一下,我有另一个TStringList在不同的单位,我创建和FreeAndNil,我没有得到任何错误.

这是完整的来源:


    unit PayorDataMgr;

    interface

    uses
      SysUtils,
      Classes,
      Dialogs,
      NativeXML,
      adscnnct,
      DB,
      adsdata,
      adsfunc,
      adstable,
      ace,
      cbs.drm,
      cbs.utils,
      cbs.LogFiles;

    const
      POLICY_TYPES: array[1..3] of string = ('Primary','Secondary','Tertiary');

    type
      TPayorRecord = Record
        ASSIGNBENEFITS: Boolean;
        AUTHORIZE: Boolean;
        BATCHBILL: Boolean;
        CLAIMMAX: Integer; …

delphi object-destruction delphi-xe3 invalid-pointer

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