小编Mar*_*orf的帖子

为什么我的TFrame没有"看到"发布的消息?

我刚刚开始大量使用TFrames(好吧,是的,我一直生活在摇滚......).我认为框架支持消息处理程序声明 - 我已经看到很多这样的例子.那么为什么这个用于TFrame的简单测试单元永远不会看到它发布给自己的消息?(当我发现在我的大型应用程序中没有调用消息处理程序时,我创建了测试.)

unit JunkFrame;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

const
  DO_FORM_INITS = WM_USER + 99;

type
  TFrame1 = class(TFrame)
    Panel1: TPanel;
  private
    procedure DoFormInits(var Msg: TMessage); message DO_FORM_INITS;
  public
    constructor Create(AOwner: TComponent); override;
  end;

implementation

{$R *.dfm}

constructor TFrame1.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  PostMessage(self.Handle, DO_FORM_INITS, 0, 0);
end;

procedure TFrame1.DoFormInits(var Msg: TMessage);
begin
  ShowMessage('In DoFormInits!');
end;

end.
Run Code Online (Sandbox Code Playgroud)

此框架仅包含TPanel,框架用于仅包含框架和关闭按钮的简单主文件.

我错过了什么?

delphi message postmessage handler tframe

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

如何调试(可能的)RTL问题?

我问这个是因为我没有好主意......希望别人有新观点.

我有一个用户在Windows 7 64位系统上运行我们的32位Delphi应用程序(使用BDS 2006编译).我们的软件"工作正常"直到几周前.现在突然不是:它在初始化(实例化对象)时抛出了访问冲突.

我们让他重新安装了我们所有的软件 - 从头开始​​.相同的AV错误.我们禁用了他的反病毒软件; 同样的错误.

我们的堆栈跟踪代码(madExcept)由于某种原因无法为错误行提供堆栈跟踪,因此我们发送了几个错误日志版本供用户安装和运行,以隔离生成的行错误...

事实证明,它是一个实例,它是一个简单的TStringList后代(没有重写的Create构造函数等等) - 基本上Create只是实例化一个TStringList,它有一些与后代类关联的自定义方法.)

我很想向用户发送另一个测试.EXE; 只是一个普通的TStringList实例,看看会发生什么.但是在这一点上,我觉得我在风车上挣扎,如果我发送了太多"尝试的东西",那么冒着让用户忍耐的风险.

有关更好地调试此用户问题的方法的任何新想法?(我不喜欢挽救一个用户的问题......那些被忽视的人突然变成了其他5个用户突然"找到"的流行病.)

按照Lasse的要求编辑:

procedure T_fmMain.AfterConstruction;
begin
  inherited;
      //Logging shows that we return from the Inherited call above,
      //then AV in the following line...
  FActionList := TAActionList.Create;
  ...other code here...
end;
Run Code Online (Sandbox Code Playgroud)

这是创建对象的定义......

type
  TAActionList = class(TStringList)
  private
    FShadowList: TStringList;              //UPPERCASE shadow list
    FIsDataLoaded : boolean;
  public
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;
    procedure DataLoaded;
    function Add(const S: string): Integer; override;
    procedure Delete(Index : integer); override; …
Run Code Online (Sandbox Code Playgroud)

delphi debugging

7
推荐指数
1
解决办法
792
查看次数

SendInput与keybd_event

MSDN声明keybd_event已被SendInput取代.在重写期间,我切换到使用SendInput ... 除了尝试发送Alt-key组合时,这很好.在Win7 64位系统上(尚未在其他地方尝试过),在目标应用程序中显示击键之前,发送Alt键会导致长时间延迟.

有什么想法吗?或者我做错了什么?现在,我已经回到了keybd_event - 下面的第二个版本.

//Keyboard input from this version appears only after a ~4-5 second
//time lag...
procedure SendAltM;
var
  KeyInputs: array of TInput;
  KeyInputCount: Integer;
  //--------------------------------------------
  procedure KeybdInput(VKey: Byte; Flags: DWORD);
  begin
    Inc(KeyInputCount);
    SetLength(KeyInputs, KeyInputCount);
    KeyInputs[KeyInputCount - 1].Itype := INPUT_KEYBOARD;
    with  KeyInputs[KeyInputCount - 1].ki do
    begin
      wVk := VKey;
      wScan := MapVirtualKey(wVk, 0);
      dwFlags := KEYEVENTF_EXTENDEDKEY;
      dwFlags := Flags or dwFlags;
      time := 0;
      dwExtraInfo := 0;
    end;
  end;
begin
  KeybdInput(VK_MENU, 0);                 // Alt
  KeybdInput(Ord('M'), …
Run Code Online (Sandbox Code Playgroud)

delphi keyboard-events sendinput

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