2013-01-05 24 views
4

這是代碼的一部分,我得到的錯誤:SmartTabs運行時事件錯誤

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()不起作用。謝謝。

+2

我可以建議您嘗試使用TChromeTabs(http://www.easy-ip.net/tchrometabs.html)嗎?它完全免費,比SmartTabs還有更多功能,並且仍在積極開發中。它還附帶一個非常全面的演示應用程序。 – norgepaul

+0

@norgepaul:+1。如果我沒有弄錯,你是(TChromeTabs的開發人員之一)。 SO通常會披露這一點。不是每個人都會看到你之前關於這個組件的消息並且知道它。哦,披露並不需要什麼特別的。簡單地插入我/我們的'嘗試我/我們的TChromeTab'應該綽綽有餘。 –

+0

@MarjanVenema - 好點,我會確保我在將來做到這一點。感謝您指出。 – norgepaul

回答

3

不起作用因爲事件聲明的類型與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; 

現在,您可以成功地分配此方法t o事件。

+0

感謝編輯@Marjan;) – jachguate