代码之家  ›  专栏  ›  技术社区  ›  HX_unbanned

Delphi设计时双击对象时出现不合理错误

  •  0
  • HX_unbanned  · 技术社区  · 14 年前

    好的,问题是: 最近我遇到了一个问题,我不能使用加速键(A.K.A. HotKey s)在GROPBOX内部的按钮上。就在一分钟前,我发现了原因,但现在唯一的问题是,这个原因使我比以前更加困惑,也就是说 窗体上找不到带加速器的按钮 . 效果是当我在设计时双击受影响的按钮时,我得到错误“属性和方法不兼容”。

    MethodName is VKPInputBtnClick ,实际声明为函数,而不是单元中的方法。

    令我困惑的是我没有分配 OnClick VKPinputbtn到任何方法的事件处理程序!

    我可以编译程序,没有运行时问题……但在设计阶段,双击按钮会出现一些令人讨厌的问题……

    有什么解决办法吗?重新安装IDE?

    任何帮助都非常感谢…

    6 回复  |  直到 14 年前
        1
  •  4
  •   Rob Kennedy    14 年前

    双击未设置默认事件属性的控件会导致IDE分配该属性。(这不仅仅是访问代码编辑器的快捷方式;这是 F12 .)IDE在源代码中搜索具有所需名称的函数。如果找不到方法,则以包含形式创建一个方法,并将其分配给组件的事件属性。但是如果 找到具有正确名称的内容,它尝试在不创建任何新内容的情况下分配它。

    很明显,问题在于,在您的案例中,IDE发现的内容与它所显示的事件不兼容。可能是一个错误,它不应该选择非方法,但很少遇到这样的错误,因为人们为独立函数选择与IDE为事件处理程序选择相同的名称的频率很低。

    您有几个选项:

    • 重命名 VKPInputBtnClick 所以看起来不像是 OnClick 的事件处理程序 VKPInputBtn 控制。
    • 制作 VK输入按钮 是窗体类的方法。
    • 手动声明 新的 VK输入按钮 方法,可能IDE会选择它而不是独立函数。
    • 将其他名称输入 点击 对象检查器中的属性,以及 然后 双击它(或按 进入 )IDE将使用该名称创建一个方法。
        2
  •  1
  •   Toby Allen mercator    14 年前

    尝试从.pas文件中从声明和实现节中删除处理程序(如果它们包含代码,则复制到其他地方)。然后尝试重新创建按钮的处理程序。有时,IDE可能会失去同步,所能做的就是重置为已知状态。

    如果这不起作用,请查看是否可以关闭窗体并重新打开,或者从.dfm文件中删除处理程序。

        3
  •  0
  •   Toon Krijthe    14 年前

    组件在设计和运行时的工作方式不同。双击DesginTime中的按钮可创建并添加onclick处理程序。这就解释了行为不同的原因。

    希望我能正确理解你的问题。您的窗体上有一个组件,并且无法分配正确的事件处理程序,因为自动创建的事件处理程序与预期的事件处理程序的类型不同?

    在这种情况下,创建自己的事件处理程序并分配它。甚至可以在表单的onCreate中分配它。如果通过DFM分配失败。

        4
  •  0
  •   Gregor Brandt    14 年前

    如果这是一个真正的bug,不要忘记将其提交给Embarcadero。您可以通过IDE中的工具菜单访问QA应用程序,也可以访问网站。

        5
  •  0
  •   HX_unbanned    14 年前

    不管怎样,问题得到了回答,很明显这个错误消息应该是一个rad studio xe bug,因为IDE以错误的方式比较对象的实际属性和所需属性。

    非常感谢大家的参与。

    EDN质量控制案例:89543


    笔记:

    这是我用于vkpinputbtnick函数使用加速器功能的方法。
    -使用此代码截图中的消息: Alt key handling algorithm
    -将vk_选项卡更改为vk_lmenu(左Alt)
    -捕获alt消息后,将全局唯一值设置为变量
    -在FormKeyPress事件处理程序中,检查唯一全局变量值是否与我之前设置的值匹配。 -执行函数。

    希望它能帮助那些愿意这样做的人。此外,也欢迎使用一些更圆滑、干净的方法来实现此功能。

    尚未将问题设置为已回答。

        6
  •  0
  •   gabr    14 年前

    实际上声明为函数,而不是单元中的方法。

    方法处理程序必须是过程,而不是函数。因此它不起作用。

    就像托比很久以前说的(但你显然没有听):

    尝试从.pas文件中删除处理程序… 然后尝试重新创建按钮的处理程序。