相关疑难解决方法(0)

Delphi>请解释一下:类型...对象的过程

我遇到了一些对我来说很新的代码......

我从来没有真正看到过对象过程的类型声明,我只是没有看到这一点.为什么开发人员不能只保留Boolean类型的字段?

interface

    type
      TFinishedCaptureEvent = procedure(AFinished: Boolean) of object;

      TFrameCard = class(TFrame)
      ...
      private
        FOnFinishedCapture: TFinishedCaptureEvent;
        procedure DoUpdateMessage(AMessageType: TMessageType);
      public
        property OnFinishedCapture: TFinishedCaptureEvent read FOnFinishedCapture write FOnFinishedCapture;
      end;    

implementation

...

procedure TFrameCard.DoUpdateMessage(AMessageType: TMessageType);
begin
  if Assigned(FOnFinishedCapture) then
    FOnFinishedCapture(False);
  ...
end;

end.
Run Code Online (Sandbox Code Playgroud)

delphi

9
推荐指数
2
解决办法
1万
查看次数

保存和恢复事件处理程序

我的班级包含数据集 (TDataSet)。我班的用户可以为此数据集分配事件处理程序:

ds.FieldByName('ID').OnChange := @ID_OnChange;
Run Code Online (Sandbox Code Playgroud)

然后我必须重新打开数据集:

ds.Close;
ds.Open;
Run Code Online (Sandbox Code Playgroud)

在此之后,所有事件处理程序都消失了:

if Assigned(ds.FieldByName('ID').OnChange) //returns false
Run Code Online (Sandbox Code Playgroud)

所以,我需要保存处理程序并在重新打开后恢复它们。我使用 TStringList :

var
  EventHandlers: TStringList;
...
  //I do this for every event of every field
  if Assigned(ds.FieldByName('ID').OnChange) then
    EventHandlers.AddObject('ID', @ds.FieldByName('ID').OnChange);
Run Code Online (Sandbox Code Playgroud)

问题是如何恢复处理程序:

ds.FieldByName('ID').OnChange := TFieldNotifyEvent(ObjToInt(EventHandlers.Objects[0]));//Invalid typecast error
Run Code Online (Sandbox Code Playgroud)

如何将存储的地址分配给事件处理程序?谢谢。

delphi events delphi-6

4
推荐指数
1
解决办法
2306
查看次数

标签 统计

delphi ×2

delphi-6 ×1

events ×1