这个问题可能已经得到解答,但我一直无法找到正确的答案.我正试图在表单中按下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) 我正在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; …