我正在为SetWindowsHookExAPI 编写一个实用程序单元.
要使用它,我想要一个这样的界面:
var
Thread: TKeyboardHookThread;
begin
Thread := TKeyboardHookThread.Create(SomeForm.Handle, SomeMessageNumber);
try
Thread.Resume;
SomeForm.ShowModal;
finally
Thread.Free; // <-- Application hangs here
end;
end;
Run Code Online (Sandbox Code Playgroud)
在我当前的实现中,TKeyboardHookThread我无法正确退出线程.
代码是:
TKeyboardHookThread = class(TThread)
private
class var
FCreated : Boolean;
FKeyReceiverWindowHandle : HWND;
FMessage : Cardinal;
FHiddenWindow : TForm;
public
constructor Create(AKeyReceiverWindowHandle: HWND; AMessage: Cardinal);
destructor Destroy; override;
procedure Execute; override;
end;
function HookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
S: KBDLLHOOKSTRUCT;
begin
if nCode < 0 then begin
Result …Run Code Online (Sandbox Code Playgroud) 当我在 IDE 中安装一个包并在项目中使用它时,每次编译我的项目时都会重新编译它(替换 DCU)。
我无法想象这是故意的 - RTL 和 VCL 也不是每次都编译,是吗?
我对工具> 选项> 环境选项> Delphi 选项> 库中的路径进行了一些操作,但没有成功。
我发现了一种结构,它允许编译我的项目,而无需重新编译在不同路径中具有 DCU 和 PAS 的包,但在此结构中,Delphi 根本无法从代码编辑器(例如按住 SHIFT 单击)中找到源代码,因此这不是一个选择。
您可以使用F11键从表单设计器转到对象检查器到圆形的源编辑器:
Code - > Inspector - > Design - > Inspector - > Code - > Inspector - > ...
但大部分时间在设计表格时我只想要:
检查员< - >设计
我在Delphi的帮助下搜索过,没有找到合适的键盘快捷方式.
是否有键盘快捷键可以做到这一点?
我正在将Delphi程序从BDE转换为Advantage数据库.
在周末,我使用Delphi XE在Win 7机器上工作.在这一周,我使用Delphi 7在Win XP机器上工作.
优势表在Win 7机器上运行良好,但是当复制到XP机器时,它们无法访问 - Error 5175 the index was created with a different collation sequence
我搜索过网络,甚至进入了Advantage论坛,但找不到任何有用的东西.
XP和Win 7在位置等方面的设置相同.表属性将归类序列列为空白.
任何人都知道造成这种情况的原因以及如何解决.我试过删除并重新创建索引,但无济于事.
delphi indexing advantage-database-server collation codepages
我有以下C代码使用libmodbus使用ModbusTCP读取单个设备寄存器:
modbus_t *ctx;
uint16_t tab_reg[16];
ctx = modbus_new_tcp("10.0.1.77", 502);
modbus_read_registers(ctx, 0x20, 2, tab_reg);
printf("reg = %d (0x%X)\n", tab_reg[0], tab_reg[0]);
printf("reg = %d (0x%X)\n", tab_reg[1], tab_reg[1]);
Run Code Online (Sandbox Code Playgroud)
现在尝试使用我生成的Vapi将其切换到Vala,new和read的内容是:
[CCode (cheader_filename = "modbus.h", cname = "modbus_new_tcp")]
public static unowned Modbus.modbus_t create_tcp (string ip_address, int port);
public static int read_registers (Modbus.modbus_t ctx, int addr, int nb, uint16 dest);
[CCode (cheader_filename = "modbus.h")]
Run Code Online (Sandbox Code Playgroud)
翻译的Vala程序是:
class ModbusReadTest : GLib.Object {
unowned Modbus.modbus_t ctx;
public void run () {
uint16 reg = 0x00;
ctx = create_tcp ("10.0.1.77", …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何调用PowerShell脚本,在文件名中使用空格作为Delphi构建事件.
从CMD我必须打电话powershell.exe -Command "& 'Filename With Spaces.ps1'"哪个工作正常.
另一方面,Delphi将&符号加倍,并试图将命令转换为两个命令.
我试图将其设置为构建事件:
powershell.exe -Command "& '$(PROJECTDIR)\Prebuild.ps1' $(PROJECTDIR)"
Run Code Online (Sandbox Code Playgroud)
MSBuild执行的是:
powershell.exe -Command "&& 'D:\SVN\AccuLib 3.0\VCLUI\Prebuild.ps1' D:\SVN\AccuLib 3.0\VCLUI"
Run Code Online (Sandbox Code Playgroud)
那么ps1从Delphi构建事件中调用包含空格的文件需要什么呢?
TDBCtrlGrid对鼠标滚轮根本没有反应。
我试过这个:
procedure TForm1.FormMouseWheel(Sender: TObject;
Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
var Handled: Boolean);
begin
if DBCtrlGrid1.ClientRect.Contains(DBCtrlGrid1.ScreenToClient(MousePos)) then
begin
DBCtrlGrid1.ScrollBy(0, WheelDelta);
Handled := True;
end;
end;
Run Code Online (Sandbox Code Playgroud)
控制网格现在可以滚动,但它不会更改数据集中的位置,而是将其内容移出客户端矩形,这看起来非常难看。
如何启用鼠标滚轮滚动TDBCtrlGrid?
假设我有一个匿名线程进行一些后台处理:
procedure TForm1.FormCreate(Sender: TObject);
begin
TThread.CreateAnonymousThread(procedure begin
while True do begin
Sleep(500);
OutputDebugString('I am alive');
end;
end).Start;
end;
Run Code Online (Sandbox Code Playgroud)
该线程不与主线程共享任何资源,它只是坐在那里并"永远"运行.
由于没有像Terminate 匿名线程那样的内置机制,这是否意味着当进程的主线程退出时我不必通知线程?
如果您只是启动一个新的VCL应用程序,请在FormCreate事件中粘贴上面的代码,它将I am alive每隔半秒写入调试消息.当应用程序退出时(即通过关闭表单),似乎线程也退出,尽管它不检查任何信号.
没关系,还是我必须使用TEvent或类似的方式实现一些信号来通知线程?
或者编写自定义TThread后代并在以后保留对该线程的引用是否更好Thread.Free?
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
TForm2 = class(TForm)
private
FAppWindow: Boolean;
protected
procedure CreateParams(var Params: TCreateParams); override;
public
property AppWindow: Boolean read FAppWindow write FAppWindow;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Form2 := TForm2.Create(Self);
Form2.AppWindow := True;
Form2.Show;
end;
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
if FAppWindow then begin
Params.Style := Params.Style or WS_EX_APPWINDOW;
Params.WndParent := 0;
end;
end;
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为窗口句柄是在 TForm 的构造函数期间创建的,因此CreateParams运行得太早并且FAppWindow始终为False。
编写自定义构造函数也不起作用,因为您最终必须调用继承的构造函数来创建句柄,然后才能将任何数据保存到实例:
constructor TForm2.CreateAppWindow(AOwner: TComponent);
begin
inherited Create(AOwner);
FAppWindow := True;
end; …Run Code Online (Sandbox Code Playgroud) 在 Vala 的默认应用程序中打开文件的最佳方式是什么?有点像如何xdg-open运作。
delphi ×8
delphi-xe2 ×4
vala ×2
vcl ×2
build-events ×1
codepages ×1
collation ×1
datagrid ×1
delphi-2007 ×1
delphi-ide ×1
delphi-xe7 ×1
ide ×1
indexing ×1
message-loop ×1
modbus ×1
powershell ×1
scroll ×1
terminate ×1
vapi ×1
window ×1
xdgutils ×1