我相信我太累了,我不明白为什么小回调不起作用。我有两个框架,动态创建,我显示第一个框架,只需单击一下,我就会显示第二个框架。当我完成第二个工作时,我想显示第一帧并释放第二帧。代码如下:
第一帧的代码:
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);
任何人都可以帮我这个简单的事吗?
答案 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'。
祝你好运,
拉杜