小编Jen*_*off的帖子

如何终止具有单独消息循环的线程?

我正在为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)

delphi multithreading delphi-2007 message-loop

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

如何不使用使用它的应用程序每次重新编译已安装的软件包?

当我在 IDE 中安装一个包并在项目中使用它时,每次编译我的项目时都会重新编译它(替换 DCU)。

我无法想象这是故意的 - RTL 和 VCL 也不是每次都编译,是吗?

我对工具> 选项> 环境选项> Delphi 选项> 库中的路径进行了一些操作,但没有成功。

我发现了一种结构,它允许编译我的项目,而无需重新编译在不同路径中具有 DCU 和 PAS 的包,但在此结构中,Delphi 根本无法从代码编辑器(例如按住 SHIFT 单击)中找到源代码,因此这不是一个选择。

delphi delphi-ide

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

是否有键盘快捷键在对象检查器和表单设计器之间切换?

您可以使用F11键从表单设计器转到对象检查器到圆形的源编辑器:

Code - > Inspector - > Design - > Inspector - > Code - > Inspector - > ...

但大部分时间在设计表格时我只想要:

检查员< - >设计

我在Delphi的帮助下搜索过,没有找到合适的键盘快捷方式.

是否有键盘快捷键可以做到这一点?

ide delphi keyboard-shortcuts delphi-xe7

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

优势数据库索引整理顺序

我正在将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

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

在Vapi定义中用于通过引用传递数组的参数

我有以下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)

modbus vala vapi

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

如何在构建事件中使用&符号?

我试图弄清楚如何调用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构建事件中调用包含空格的文件需要什么呢?

delphi powershell build-events delphi-xe2

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

如何在 TDBCtrlGrid 上启用鼠标滚轮滚动?

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

delphi datagrid scroll vcl delphi-xe2

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

如果主线程完成,我是否必须发出匿名线程的信号?

假设我有一个匿名线程进行一些后台处理:

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

delphi multithreading synchronization terminate delphi-xe2

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

构造函数运行后如何设置CreateParams?

  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)

delphi vcl window delphi-xe2

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

使用 Vala 的默认应用程序打开文件?

在 Vala 的默认应用程序中打开文件的最佳方式是什么?有点像如何xdg-open运作。

vala xdgutils freedesktop.org

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