Delphi - неправильный код обратного вызова - PullRequest
1 голос
/ 29 января 2011

Я считаю, что я слишком устал, и я не понимаю, почему небольшой обратный вызов не работает У меня есть 2 кадра, которые создаются динамически, я показываю первый и одним щелчком показываю второй. Когда я закончу работу со вторым, я хочу показать первый кадр и освободить второй кадр. Код ниже:

код для первого кадра:

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 ]

4 голосов
/ 29 января 2011

Кстати, это плохая практика - освободить объект от собственного кода.Попробуйте сделать это с помощью обработчика сообщений через 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;

И вызов PostponedFreePS Код может быть неточным - я не запустил Delphi сейчас.К сожалению.

3 голосов
/ 29 января 2011

Вы звоните CommingBackFromFrame.Поэтому, если тип возвращаемого значения не равен TCallBack, очевидно, что он не компилируется.

Вместо этого вы можете захотеть сделать GoBack:=CommingBackFromFrame;, который подписывает метод CommingBackFromFrame на четный GoBack.Или, возможно, GoBack:=wFrm.CommingBackFromFrame; в зависимости от того, где объявлено CommingBackFromFrame.

SideNote: У вас есть опечатка, слово "идет", а не comming

2 голосов
/ 29 января 2011

+ 1 ко всем. Спасибо за ваши ответы, особенно Abelisto et Jeroen, теперь я решил все проблемы. Пока Абелисто не предложил 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;

второй кадр или кадр 'child'

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 как «Release», существующий в реализации TForm.

С уважением,
1012 * Radu *

2 голосов
/ 29 января 2011

Укажите, откуда CommingBackFromFrame и что он делает;без этого CodeInChaos` answer - лучшее, что вы можете получить.

Является ли это частью wFrmDblDet или частью вашей охватывающей области (использование with скрывает это)?

В вашем текущем коде ComingBackFromFrame(wFrm) должен вернуть TCallBack, но я думаю, что это не было вашим намерением.

- jeroen

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...