delphi子窗体关闭时如何触发主窗体的事件

我习惯用事件驱动。

MDI子窗体里申明一个事件,在主窗体里实现这个事件过程。然后在创建MDI子窗体的时候,赋值这个事件。
MDI退出的时候,触发一下这个事件。

例如:
TMDIForm = ...
private
  FOnMDIEvent : TNotifyEvent;

public
  property FOnMDIEvent : TNOtifyEvent read FOnMDIEvent write FOnMDIEvent;
end;

procedure TMdiForm.OnClose(...);
begin
  if Assigned(FOnMDIEvent ) then FOnMDIEvent (Self);
end;

在主窗体的代码中实现一个过程,就像给控件动态赋值一样,应该就可以了

 

 

procedure TfrmCaiGouShouLiao.ZDYItemClick(Sender: TObject);  //自定义TNotifyEvent事件
var
  issize, date1, date2: string;
begin
  inherited;
   vou_no := DataSet1 .FieldByName('vou_no').AsString ;//先记住单据号
  if cxCheckBox2.Checked then
    issize := 'Y'
  else
    issize := 'N';
  date1 := FormatDateTime('yyyy-mm-dd', cxDateEdit1.Date);
  date2 := FormatDateTime('yyyy-mm-dd', cxDateEdit2.Date);
  with DataSet2 do
  begin
    Close;
    ParamByName('store_pno').AsString := cxButtonEdit1.text;
    ParamByName('issize').AsString := issize;
    ParamByName('date1').AsString := date1;
    ParamByName('date2').AsString := date2;
    ParamByName('ofac_no').AsString := Self.ofac_no;
    Open;
  end;
  //定位到原来的记录
   DataSet1 .Locate('vou_no',vou_no,[loCaseInsensitive]) ;//精确匹配
end;

 

子窗体

 private
    { Private declarations }
    FOnMDIEvent: TNOtifyEvent;
   {子窗体里申明一个事件,在主窗体里实现这个事件过程。然后在创建MDI子窗体的时候,赋值这个事件。
MDI退出的时候,触发一下这个事件。}
  public
    { Public declarations }
    property OnMDIClose: TNOtifyEvent  read FOnMDIEvent write FOnMDIEvent;
  end;

procedure ShowfrmCaiGouShouLiouRuKuXuanZe(vou_no,ofac_no: string;OnMDIClose:TNotifyEvent);

var
  frmCaiGouShouLiouRuKuXuanZe: TfrmCaiGouShouLiouRuKuXuanZe;

implementation

procedure ShowfrmCaiGouShouLiouRuKuXuanZe(vou_no,ofac_no: string;OnMDIClose:TNotifyEvent);
begin
  if Assigned(frmCaiGouShouLiouRuKuXuanZe) then
  begin

   frmCaiGouShouLiouRuKuXuanZe.FOnMDIEvent:=OnMDIClose;
    frmCaiGouShouLiouRuKuXuanZe.vou_no := vou_no;
    frmCaiGouShouLiouRuKuXuanZe.ofac_no := ofac_no;
    frmCaiGouShouLiouRuKuXuanZe.Visible := True;
    frmCaiGouShouLiouRuKuXuanZe.BringToFront;

  end
  else
  begin
    frmCaiGouShouLiouRuKuXuanZe := TfrmCaiGouShouLiouRuKuXuanZe.Create(Application);

    frmCaiGouShouLiouRuKuXuanZe.FOnMDIEvent:=OnMDIClose;
    frmCaiGouShouLiouRuKuXuanZe.vou_no := vou_no;
    frmCaiGouShouLiouRuKuXuanZe.ofac_no := ofac_no;
    frmCaiGouShouLiouRuKuXuanZe.ShowModal;  //用show需要在窗体的Close事件里面加nil释放语句;
    frmCaiGouShouLiouRuKuXuanZe.BringToFront;

  end;

end;

procedure TfrmCaiGouShouLiouRuKuXuanZe.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  DST_CAILIAO.Close;
   if Assigned(FOnMDIEvent) then FOnMDIEvent(Self);

end;
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi 中,可以使用以下步骤将窗体的值传递给父窗体: 1. 在窗体中定义一个公共的属性,用于保存要传递的值。 2. 在窗体中创建一个公共的方法,用于将需要传递的值设置到属性中。 3. 在父窗体中创建一个公共的方法,用于接收窗体传递的值。 4. 在父窗体中创建窗体的实例,并调用窗体的设置值方法。 5. 在窗体关闭,调用父窗体的接收值方法,以便在父窗体中更新相应的控件。 以下是示例代码: 在窗体中定义公共属性和方法: ```delphi type TChildForm = class(TForm) private FValue: Integer; public procedure SetValue(AValue: Integer); end; implementation procedure TChildForm.SetValue(AValue: Integer); begin FValue := AValue; end; ``` 在父窗体中定义公共方法: ```delphi type TMainForm = class(TForm) public procedure UpdateValue(AValue: Integer); end; implementation procedure TMainForm.UpdateValue(AValue: Integer); begin // 在这里更新父窗体中需要显示窗体值的控件 end; ``` 在父窗体创建窗体实例并调用设置值方法: ```delphi var ChildForm: TChildForm; begin ChildForm := TChildForm.Create(Self); ChildForm.SetValue(123); ChildForm.Show; end; ``` 在窗体关闭,调用父窗体的接收值方法: ```delphi procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction); begin if Assigned(Owner) and (Owner is TMainForm) then TMainForm(Owner).UpdateValue(FValue); end; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值