powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как написать общую для всех форм процедуру закрытия формы?
40 сообщений из 40, показаны все 2 страниц
Как написать общую для всех форм процедуру закрытия формы?
    #32357172
Hel975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
???
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357180
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для одной (FormFirst) формы пишешь OnCloseQuery (или что там нравится) , из истальных делаешь доступной эту форму через USES, и в обработчиках события OnCloseQuery этих форм указываешь FormFirst.OnCloseQuery

Или тебе код нужен?
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357189
Hel975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я создаю actionlist, расположил его в главной форме и хочу, что во всех дочерних формочках по нажатию кнопочки Close, вызывался этот action. Так вот мне нужно написать процедуру для этого action. У меня MDI приложение.
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357239
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То же самое, только вопрос у тебя, наверное, "Как убить дочернюю MDI - форму"?
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357255
Создайте форму, с кнопкой Close. В обработчике нажатия этой кнопки вызывайте нужный action. Все дочерние формы унаследуйте не от TForm, а от созданной формы.
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357261
pima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А убить MDI-форму - в OnClose Action := caFree
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357496
Hel975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неа, Дмитрий Лобань прав. А по-другому можно сделать? Еще раз. Я не хочу писать в каждой из 20 форм обработчик события по нажатию кпонки Закрыть. И спрашивал можно ли написать универсальную процедуру, подходящую для всех форм.
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357501
Berg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Hel975:
А что просто сделать USES MainForm в дочерних формах и, скажем в OnCreate дочерней формы: OnClose := MainForm.OnCloseQuery не проходит?
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357513
Hel975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не подходит. Причем тут MainForm.OnCloseQuery?
Еще раз. У меня есть action - actClose. Я его цепляю к кнопочки - Закрыть форму. Пишу обработчик. Что типа:

procedure TfrmMain.actCloseExecute(Sender: TObject);
begin
....
Close;
end;

Во всех формах, где есть аналогичная кнопочка вызывается этот action.
Так вот что вместо Close надо написать, чтобы у меня закрывалась не та форма, где находиться ActionList, а форма, где нажата кнопка Закрыть?
Или я не понимаю ваше решение?
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357532
А если не использовать action?
Все действия которые у вас выполняются в actione выполняйте в обработчике нажатия кнопки Close формы предка.
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357537
Hel975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий ваш метод хорош я не спорю. А по другому можно сделать или это единственное решение?
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357561
LexusR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
- Обратится в Action-е к компоненту который его вызвал
- спросить у него кто его родительская форма
- закрыть ее
Код: plaintext
1.
2.
3.
4.
5.
procedure TForm1.acCloseFormExecute(Sender: TObject);
begin
  TForm(TButton(TAction(sender).ActionComponent).Parent).Close;
end;

...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357581
Фотография KirillovA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Создать форму и прописать все че надо.
2. Унаследовать прочие формы от нее.
если другие формы уже есть - делаем 1 и в описании других форм меняем class.
over.
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357586
Hel975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это решение я и хотел услышать. Только у меня компилятор выдает ошибку - [Error] uMAIN.pas(106): Undeclared identifier: 'ActionComponent'
Заменил вместо ActionComponent ActionList, TButton - TSpeedButton. Программа запискается, но формы не закрываются, хотя в эту процедуру заходят. Посмотрел в дебугере. :-(
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357595
LexusR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем ActionList
нужно именно ActionComponent - это и будет ваша кнопка
а уже от кнопки идете выше
если кнопка лежит непосредственно на форме то будет как в моем примере
если есть промежуточные контролы то нужно будет дальше проходить по Parent-ам
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357602
Фотография KirillovA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> all
через одно место и в рай ...
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357609
Hel975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть промежуточный - панель
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357610
Hel975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 KirillovA,
Не хами...
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357628
Hel975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 LexusR,
Выдает всю ту же ошибку. Что добавить то?
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357629
LexusR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда
Код: plaintext
1.
2.
3.
4.
5.
procedure TForm1.acCloseFormExecute(Sender: TObject);
begin
  TForm(TPanel(TSpeedButton(TActio(sender).ActionComponent).Parent).Parent).Close;
end;

...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357632
LexusR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
procedure TForm1.acCloseFormExecute(Sender: TObject);
begin
TForm(TPanel(TSpeedButton(TAction(sender).ActionComponent).Parent).Parent).Close;
end;
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357636
LexusR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня в Delphi6 все работает
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357638
Hel975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понимаю. Именно так и сделал, компилятор выдает ту же ошибку - [Error] uMAIN.pas(106): Undeclared identifier: 'ActionComponent'
Может какой то библиотеки не хватает?
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357642
Фотография KirillovA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
компонента не хватает
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357647
LexusR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ActionComponent - это свойство TAction - и всяко должно быть
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357655
Hel975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня Дельфи 5. Мож поэтому?
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357669
LexusR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот тестовые формы
проверь у себя соответствие взаимосвязи форм и uses-ы
главная
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ActnList, Menus,ExtCtrls;
type
  TForm1 = class(TForm)
    ActionList1: TActionList;
    Button1: TButton;
    acCloseForm: TAction;
    procedure Button1Click(Sender: TObject);
    procedure acCloseFormExecute(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation

uses Unit2, Unit3;

{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
  with TForm2.Create(self) do
   begin
     Show;
   end;
end;
procedure TForm1.acCloseFormExecute(Sender: TObject);
begin
  acCloseForm.ac
  TForm(TPanel(TButton(TAction(sender).ActionComponent).Parent).Parent).Close;
end;
end.

дочерняя
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons;
type
  TForm2 = class(TForm)
    Panel1: TPanel;
    SpeedButton1: TSpeedButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form2: TForm2;
implementation

uses Unit1;

{$R *.dfm}
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;
end.
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357674
LexusR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
соответственно

SpeedButton1.Action := Form1.acCloseForm
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357678
LexusR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотри в Helpe
может правда у Delphi5 нет e TAction свойства ActionComponent
или оно по другому называется
или есть что-нить в этом же роде
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357684
LexusR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или попробуй к нему обратиться через базовый компонент типа
Код: plaintext
1.
2.
3.
4.
procedure TForm1.acCloseFormExecute(Sender: TObject);
begin
  TForm(TPanel(TButton(TBasicAction(sender).ActionComponent).Parent).Parent).Close;
end;
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357688
Hel975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 5-м нет, в 7-м есть. Сейчас попробую
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357695
Hel975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь выдает ошибку - Access violation at ...
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357702
Hel975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Через базовый тоже выдает Access violation. Ладно следаем по-тупому. Скопирую ваш код.
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357720
Hel975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваш пример пошел. Буду разбираться со своим проектом. Спасибо.
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357757
LexusR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть еще вариант -
у кнопок в дочерних формах не выставлять свойство Action
а Action вызывать на OnClick
при этом передавая в Action идентификатор формы типа так
Код: plaintext
1.
2.
3.
4.
5.
procedure TForm2.SpeedButton1Click(Sender: TObject);
begin
  Form1.acCloseForm.Tag := Integer(Pointer(Self));
  Form1.acCloseForm.Execute;
end;

такой обработчик во всех дочерних формах одинаковый
а в главной закрываешь форму по переданному идентификатору
Код: plaintext
1.
2.
3.
4.
procedure TForm1.acCloseFormExecute(Sender: TObject);
begin
  TForm(Pointer(TComponent(sender).Tag)).Close;
end;
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357789
LexusR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
procedure TForm1.acCloseFormExecute(Sender: TObject);
begin
  TForm(TComponent(sender).Tag).Close;
end;
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357801
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЯ создаю actionlist, расположил его в главной форме и хочу, что во всех дочерних формочках по нажатию кнопочки Close, вызывался этот action. Так вот мне нужно написать процедуру для этого action. У меня MDI приложение.

Я вот как я делаю. На главной MDI форме есть акшен acClose, к которой привязан пункт меню и кнопка на тулбаре. В обработчике OnUpdate написано:

Код: plaintext
1.
2.
3.
procedure TfrmMDI.acCloseUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := (ActiveMDIChild <> nil);
end;


Дабы действие было доступно, когда открыта хотя бы одна дочерняя форма.

А в обработчике OnExecute:

Код: plaintext
1.
2.
3.
procedure TfrmMDI.acCloseExecute(Sender: TObject);
begin
  ActiveMDIChild.Close;
end;


Чтоб все формы уничтожались при закрытии все дочернии я наследую от базовой TfrmBaseMDIChild. В обработчике OnClose которой написано:

Код: plaintext
1.
2.
3.
procedure TfrmBaseMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;


Все, что касается acClose тянеться еще с 4 Delphi. В 7 есть стандартный акшен TWindowClose, который делает тоже самое, но без написания обработчиков.
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357807
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а Sendmessage ???
____
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357862
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 JibSkeart

автора Sendmessage ???

Всмысле послать сообщение текущей активной дочерней форме?! :-) Нет, теоретически и так можно. Но, IMHO, мой вариант проще.
...
Рейтинг: 0 / 0
Как написать общую для всех форм процедуру закрытия формы?
    #32357892
Hel975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 LexusR второй вариант не катит, я пытаюсь не писать лишнего кода.

2 pkarklin
И изящно, и просто.
ч.т.д
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как написать общую для всех форм процедуру закрытия формы?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]