Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Сообщение о закрытии формы


Автор: Kuper 1.2.2006, 14:35
У меня есть форма fsMDIForm и две формы fsMDIChild.
Проблема в следующем: мне необходимо узнать о закрытии одной из форм fsMDIChild и в зависимости от того, по нажатию на какую кнопку она была закрыта, выполнить одно из двух действий на другой fsMDIChild форме.
Подскажите какие-нибудь варианты, как это сделать.

Автор: Rennigth 1.2.2006, 14:42
Цитата(Kuper @ 1.2.2006, 14:35 Найти цитируемый пост)

по нажатию на какую кнопку она была закрыта

то есть? из систем меню или твоя кнопка?

а вообще вариантов много:
- если одна форма знает о другой то можно на Event сажать.
- если одна форма знает о другой то можно посылать ей сообщения.
- можно сообщения слать Broadcast-ом.
- можно что бы Main форма управляла ею
- итд...
...
Все зависит от конкретной ситуации.

Автор: Kuper 1.2.2006, 15:00
Одна форма fsMDIChild отображает данные из БД.
Другая fsMDIChild форма вызывается из первой fsMDIChild для редактирования одной записи.
На второй форме есть две кнопки "Ok" и "Cancel".
Мне необходимо при нажатии на кнопку "Ok" обновить на первой форме fsMDIChild данные, при условии что она ещё нее закрыта.
Если она закрыта или нажата кнопка "Cancel", то ничего не делать.

Автор: Rennigth 1.2.2006, 15:07
Вторую форму вызывай модально (ShowModal), т.е.:
На кнопку Ок ModalResult := mrOK, на Cancel соответственно mrCancel.

на дальше:
Код

  if fmMDIChildDialog.ShowModal = mrOK then
  begin
    {твои действия при "ОК"}
  end else
    {твои действия при "Cancel"}
  end;

Добавлено @ 15:08
fmMDIChildDialog твоя вторая форма с кнопочками OK и Cancel.

Автор: Kuper 1.2.2006, 15:13
Так было первоначально. Но трудность в том, что первая форма в этом случае недоступна, то есть на ней нельзя ничего посмотреть.
А это бывает необходимо, т.к. на первой fsMDIChild отображаютя иерархично несколько справочников из БД.

Автор: Rennigth 1.2.2006, 15:21
Тогда вешать Event-ы на нажатие кнопок. а формы вызывать StayOnTop.
Добавлено @ 15:21
Сейчас если хочешь набросаю код.

Автор: Kuper 1.2.2006, 15:24
Если не трудно, но приведи пример!

Автор: Rennigth 1.2.2006, 15:35
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit2, StdCtrls;

type
  TfmMain = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  protected
    procedure btnOKClick(ASender: TObject);
    procedure btnCancelClick(ASender: TObject);
  end;

var
  fmMain: TfmMain;

implementation

{$R *.dfm}

procedure TfmMain.btnCancelClick(ASender: TObject);
begin
  fmChild.Hide;
  ShowMessage('Íàæàòà ÎÊ');
end;

procedure TfmMain.btnOKClick(ASender: TObject);
begin
  fmChild.Hide;
  ShowMessage('Íàæàòà Cancel');
end;

procedure TfmMain.Button1Click(Sender: TObject);
begin
  if not Assigned(fmChild) then
    fmChild := TfmChild.Create(Application);

  fmChild.btnOK.OnClick := btnOKClick;
  fmChild.btnCancel.OnClick := btnCancelClick;

  fmChild.FormStyle := fsStayOnTop;
  fmChild.Show;
end;

end.


Код


unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfmChild = class(TForm)
    btnOK: TButton;
    btnCancel: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fmChild: TfmChild;

implementation

{$R *.dfm}

end.


Автор: Kuper 1.2.2006, 15:51
Это мне не подходит.
Так как если будет вызываться не одна форма fsMDIChild, а несколько (поочереди или сразу не имеет значения), то для них нужно будет в Unit1
описывать нажатие данных кнопок. А нажатие данных кнопок на этих формах сопровождается не только закрытием формы, но и сохранением данных в БД.
Проблема ещё в том, что форма отображения данных разрабатывал я, а формы редактирования разрабатывают другие люди и у каждого свои способы сохранения изменений. Мне лишь остаётся подключить даные формы к себе в модуль и вызывать обновления при закрытии форм редактирования по нажатии на кнопки "Ok".
Поэтому мне и требуется отловить как-нибудь закрытие форм редактирования и определить как они закрыты: "Ok" - с сохранением изменений; "Cancel" - без сохранения изменений.
Связи между моей формой и формами редактирования никакой нет, кроме вызова.

Автор: Rennigth 1.2.2006, 16:19
подругому никак, или Event-ы тебе все равно должны отдавать или на всех дочерних формах (лутше пронаследоваться от одной) должна быть property какая-нибудь с OK или Cancel и ловить Onclose этих форм и проверять Property каким образом закрывали. Ну еще как вариант FindWindow, искать кнопки по Caption, кастить и также выдирать OnClick, кстати вполне реально но если честно то извращение жуткое. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)