type
  TRetureValueEvent = procedure of (Sender: TObject; var sValue: String);type
  TSeek = class(TButton)
  private
    FOnReturnValue: TReturnValueEvent; // 事件
  protected
    procedure ReturnValue(Sender: TObject; var sValue: String); dynamic; // 函数声明
  public  published
    property OnReturnValue: TRetuanValueEvent read FOnReturnValue write ReturnValue; // 事件属性
  end;procedure register;implementationprocedure register;
begin
  RegisterComponents('MyCon', [TSeek]);
end;{ TSeek }procedure TSeek.Click;
var
  sValue: string;
begin
  inherited;
  ...
  ReturnValue(Self, 'Good');
end;procedure TSeek.ReturnValue(Sender: TObject; var sValue: string);
begin
  if Assigned(FOnReturnValue) then FOnReturnValue(Self);
end;编译错误:
[Error] SeekUtils.pas(15): 'OBJECT' expected but '(' found
[Error] SeekUtils.pas(15): ';' expected but ')' found
[Error] SeekUtils.pas(23): Undeclared identifier: 'TReturnValueEvent'
[Error] SeekUtils.pas(41): Undeclared identifier: 'TRetuanValueEvent'
[Error] SeekUtils.pas(41): Dynamic method or message handler not allowed here
[Error] SeekUtils.pas(109): Constant object cannot be passed as var parameter

解决方案 »

  1.   

    property OnReturnValue: TRetuanValueEvent read GetOnReturnValue write SetReturnValue;然后按ctrl+shlit+C
      

  2.   

    谢谢,
    但问题还是同样出错在这:
    TRetureValueEvent = procedure of (Sender: TObject; var sValue: String);
      

  3.   

    1.你的代码错误太多
    2.返回值是返回来的,必须是变量。
      你这样肯定是错的 ReturnValue(self,'good') // 'good'是常量
      你需要这样定义:
        s: string;
        s := 'good';
        ReturnValue(self,s); // 在函数里你可以对s修改并重新赋值
        ... // 现在对s操作,已经发生了变化
      

  4.   

    TRetureValueEvent = procedure of (Sender: TObject; var sValue: String) of object;
      

  5.   

    type
      TRetureValueEvent = procedure of (Sender: TObject; var sValue: String);  <----- 事件类型必须是类方法, 不能是普通过程. 所以必须定义成:
    TXXXEvent = procedure (xxx...) of object;...procedure TSeek.Click;
    var
      sValue: string;
    begin
      inherited;
      ...
      ReturnValue(Self, 'Good');  <------ var 参数不能传常量, 所以传'Good'编译通不过
    end;procedure TSeek.ReturnValue(Sender: TObject; var sValue: string);
    begin
      if Assigned(FOnReturnValue) then FOnReturnValue(Self);   <----  调用FOnReturnValue传的参数比定义的少
    end;建议楼主先找本delphi语法方面的基础书看看