delphi - SmartTabs 运行时事件错误

标签 delphi runtime delphi-xe2

这是我收到错误的代码部分:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, cefvcl, Vcl.ExtCtrls, Vcl.StdCtrls, ceflib,
  Vcl.ComCtrls, Vcl.ImgList, Vcl.Imaging.pngimage, Vcl.Buttons, JvSpeedButton, Themes,
  JvExComCtrls, JvComCtrls, JvgPage, Vcl.ToolWin, JvToolBar, Vcl.Menus,
  Vcl.Mask, JvExMask, JvToolEdit, JvExButtons, JvButtons, rkSmartTabs, rkAeroTabs;

type
  TForm1 = class(TForm)
    {....}
    procedure FormCreate(Sender: TObject);
    procedure addnewtab (Sender: TObject);
    procedure closetab (Sender: TObject);

private
  { Private declarations }
public
  { Public declarations }
end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

{....}

procedure TForm1.closetab (Sender: TObject);
var
  smarttabs: TrkAeroTabs;
begin
  smarttabs := Sender as TrkAeroTabs;
  smarttabs.DeleteTab(smarttabs.ActiveTab);
end;

procedure TForm1.addnewtab (Sender: TObject);
var
  smarttabs: TrkAeroTabs;
begin
  smarttabs := Sender as TrkAeroTabs;
  smarttabs.AddTab('New Tab');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
with TrkAeroTabs.Create(self) do
  begin
    OnCloseTab := closetab;  //***ERROR HERE***
    OnAddClick := addnewtab;
    Parent := Self;
    Align := alClient;
    AddTab('New Tab');
    if ClassType = TrkAeroTabs then
    begin
      ColorBackground := clBlack;
      with Self do
      begin
        GlassFrame.Top     := 25;
        GlassFrame.Enabled := True;
      end;
    end;
    ShowButton   := True;
    AllowTabDrag := True;
  end;
end;

这是错误:

[DCC Error] Unit1.pas(90): E2009 Incompatible types: 'Parameter lists differ'

addnewtab() 工作正常。我不明白为什么 closetab() 不起作用。谢谢。

最佳答案

不起作用,因为该事件是使用与 TNotifyEvent 不同的类型声明的,并且您的方法参数必须与所使用的类型中声明的内容匹配(参数的数量和类型)。

导航到事件声明,您会发现:

  TrkAeroTabs = class(TCustomControl)
  ..
  published
  ..
    property OnCloseTab: TOnTabCloseEvent read FOnCloseTab write FOnCloseTab;

然后,导航到 TOnTabClos​​eEvent 声明,您会发现:

TOnTabCloseEvent = procedure(Sender: TObject; Index: Integer;
  var Close: Boolean) of object;

所以,你必须像这样声明你的方法:

  TForm1 = class(TForm)
    ..
    procedure closetab (Sender: TObject; Index: Integer; var CanClose: Boolean);


procedure TForm1.closetab (Sender: TObject; Index: Integer; var CanClose: Boolean);
var
  smarttabs: TrkAeroTabs;
begin
  smarttabs := Sender as TrkAeroTabs;
  smarttabs.DeleteTab(smarttabs.ActiveTab);
end;

现在,您可以成功将此方法分配给事件。

关于delphi - SmartTabs 运行时事件错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14167864/

相关文章:

sql-server - 如何检查数据库是否存在?

Java:杀死 unix 上的所有子进程

.net - 为什么安装了 .NET 4 的计算机无法运行针对 .NET 4.5 的 exe,而它们使用相同的 CLR 版本?

xml - HTML 内部 XML 的 EDOMParseError

delphi - .NET 4.0 中的 P/Invoke 环境是否发生了变化?

delphi - 我可以内联声明变量而不是在函数顶部声明变量吗?

C 编程,指针运行时错误

delphi - 保证堆栈记录的初始化

delphi - 继承在类运算符的上下文中意味着什么

python - 我可以使用 zipimport 来发送嵌入式 python 吗?