Delphi - 回调错误的代码

时间:2011-01-29 11:56:26

标签: delphi callback frame

我相信我太累了,我不明白为什么小回调不起作用。我有两个框架,动态创建,我显示第一个框架,只需单击一下,我就会显示第二个框架。当我完成第二个工作时,我想显示第一帧并释放第二帧。代码如下:

第一帧的代码:

procedure CommingBackFromFrame(aFrame:TFrame);

procedure TfraMain.ComingBackFromFrame(aFrame:TFrame);
begin
 if Assigned(aFrame) then
 begin
 try
   aFrame.Hide;
   FreeAndNil(aFrame);
  except on e:Exception do
//make a log
  end;
 Self.Show;//first frame show
 end;



//code which creates the second frame
    wFrm := TFrameType.Create(Application);//create the second frame
      with wFrm do
      begin
        GoBack:=ComingBackFromFrame(wFrm);//error here
        parent:=Self;
        Show;
      end; //with
      Application.ProcessMessages;

第二帧的代码:

 TCallBack = procedure(aFrame:TFrame) of object;//callback declaration 
  TFrameType = class(Tframe)
...
  private
    FGoBack:TCallBack;
  public
    property GoBack:TCallBack read FGoBack write FGoBack;//publish callback
....
//at a moment, return to frame 1

 if Assigned(fgoback) then
 GoBack(Self);

任何人都可以帮我这个简单的事吗?

4 个答案:

答案 0 :(得分:4)

BTW这是不好的做法 - 从自己的代码中释放一个对象。尝试通过PostMessage()通过消息处理程序执行此操作,以确保VCL在释放对象之前完成所有工作 像这样:

TFrameType = class(TFrame)
protected
    procedure FreeMe(var Msg TMessage) message WM_FREE_MY_FRAME;
public
    procedure PostponedFree;
end;

procedure TFrameType.FreeMe(var Msg TMessage);
begin
    Free;
end;

procedure TFrameType.PostponedFree;
begin
    PostMessage(Self.Handle, WM_FREE_MY_FRAME, 0, 0);
end;

并致电PostponedFree。 PS代码可能不准确 - 我现在还没有启动Delphi。遗憾。

答案 1 :(得分:3)

您正在呼叫CommingBackFromFrame。所以,除非它的返回类型是TCallBack,否则很明显它不会编译。

您可能希望GoBack:=CommingBackFromFrame;代替方法CommingBackFromFrame订阅偶数GoBack。或者GoBack:=wFrm.CommingBackFromFrame;可能取决于CommingBackFromFrame的声明位置。

SideNote:你有一个拼写错误,这个词是“来了”而不是comming

答案 2 :(得分:2)

指定CommingBackFromFrame的来源及其作用;没有它,CodeInChaos` answer是你能得到的最好的。

它是wFrmDblDet的一部分,还是您所涵盖范围的一部分(with的使用模糊了那些?)

在您当前的代码中,ComingBackFromFrame(wFrm)应返回TCallBack,但我认为这不是您的意图。

- 的Jeroen

答案 3 :(得分:2)

+1给所有人。谢谢你的回答,特别是对Abelisto et Jeroen,我现在已经解决了所有的问题。直到Abelisto建议PostMessage我遇到了很多错误。整个解决方案如下:

第一帧,或FrmMain:

const WM_MY_MESSAGE = WM_USER + 0;
type
TfraMain = class(TFrame)
...
private 
  FFraChild        : TFraChild;//second frame
  procedure OnMyMessage(var Msg: TMessage); message WM_MY_MESSAGE;
  procedure ComingBackFromFrame(aFrame:TFrame);
....
//step when the second frame is created 
  FFraChild := TFraChild.Create(Application);
  with FFraChild do
  begin
    GoBack:= ComingBackFromFrame;
    parent:=Self;
    Show;  
  end; //with
....
procedure TfraMain.ComingBackFromFrame(aFrame:TFrame);
begin
 if aFrame<>nil then
 begin
 try
   aFrame.Hide;
   PostMessage(Self.Handle,WM_MY_MESSAGE,0,0);
  except on e:Exception do
//   log error
  end;
 end;
end;

procedure TfraMain.OnMyMessage(var Msg: TMessage);
begin
 FreeAndNil(FFraChild);
end;

第二帧或第二帧“孩子”

type
  TCallBack = procedure(aFrame:TFrame) of object;

  TFraChild = class(TFrame)
...
  private
    FGoBack:TCallBack;
  public
    property GoBack:TCallBack read FGoBack write FGoBack;
....
//after all operations with it are finished 
 if Assigned(fgoback) then
  FGoBack(Self);

@Jeroen,我没有找到与Frames相关的东西作为TForm实现中存在的'Release'。

祝你好运,
拉杜