4

これは、エラーが発生するコードの一部です。

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()が機能しない理由がわかりません。ありがとう。

4

1 に答える 1

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;

これで、このメソッドをイベントに正常に割り当てることができます。

于 2013-01-05T02:26:36.170 に答える