powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как узнать форма вызвана из другой формы или из MainMenu?
25 сообщений из 42, страница 1 из 2
Как узнать форма вызвана из другой формы или из MainMenu?
    #39609847
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Form2 вызывается из MainMenu или из формы Form1(button.click). В зависимости от того кто его вызывал в Form2.show надо установить label1.visible в false/true.
Как узнать Form2 вызвана из другой формы или из MainMenu?
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39609855
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubu,

В Windows : Handle - наше всё!
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39609856
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заведи ей метод MyShow куда и передавай любой флаг.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39609863
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А я как не старался-sender, parent, owner- но никак.
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39609978
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bastibubuВ зависимости от того кто его вызывал в Form2.show надо установить label1.visible в false/true.
Как узнать Form2 вызвана из другой формы или из MainMenu?Не совсем правильный вопрос.

Для управления Form2.Label1 можно поступить так:
1. Form2.Label1.Visible := false/treu
Form2.Show;
2. Если нужно выполнять еще какие-либо действия кроме управления label1.visible, то добавить метод в раздел public TForm2, и вызвать его перед Form2.Show
3. Перкрыть метод TForm2.Show, объявив его с параметром
4. Послать своё сообщение окну Form2 (PostMessage(Form2.Handle, WM_USER + N, 0, 0)
и так далее
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610091
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FreedoomНе совсем правильный вопрос.

Freedoom , пока реализовал вот так:
Если форма создаётся из Mainmenu тогда в OnCreate Form2.Tag:=-1;
Если форма создаётся из Form1 тогда в OnCreate Form2.Tag:=1;

а в Show:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
case (sender as Tform).Tag of
  -1:
  begin
   label1.visible:=false;
   bAdd.visible:=false;
   bSave.visible:=false;
   edit1.visible:=false;
  end;
  1:
  begin
   label1.visible:=true;
   bAdd.visible:=true;
   bSave.visible:=true;
   edit1.visible:=true;
  end;
 end;



а при закритыи Form.Tag:=0;

Вы можете на примере показать что имеете ввиду?!
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610107
LoneFast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bastibubuForm2 вызывается ...
Как узнать Form2 вызвана ...
Что значит "вызывается/вызвана"? Show? Модальный Show?
А кто форму её создаёт? VCL автоматически при инициализации или вы вручную динамически?
Ну на крайний случай можно руками перед вашим Show поменять как надо:
Код: pascal
1.
Form2.Label1.Visible:=False;


Но лучше да, предусмотреть спец-метод.
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610109
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bastibubuВы можете на примере показать что имеете ввиду?!Да, без проблем. Только ваш код создания и показа формы (Form2) в студию
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610111
LoneFast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант №1:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TForm1.Button2Click(Sender: TObject);
begin
Form2.Label1.Visible:=False;
Form2.Edit1.Visible:=True;
Form2.ShowModal(); // или что там у вас
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Form2.Label1.Visible:=True;
Form2.Edit1.Visible:=False;
Form2.ShowModal(); // или что там у вас
end;



Вариант №2:
Код: pascal
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.
38.
type
  Form2_ShowMode = (Form2_ShowMode_A, Form2_ShowMode_B);

  ...
  public
    procedure ShowModalMode(ShowMode: Form2_ShowMode);
  end;

...

procedure TForm2.ShowModalMode(ShowMode: Form2_ShowMode);
begin
case ShowMode of
   Form2_ShowMode_A:
      begin
      Label1.Visible:=False;
      Edit1.Visible:=True;
      end;
   Form2_ShowMode_B:
      begin
      Label1.Visible:=True;
      Edit1.Visible:=False;
      end;
   end;
ShowModal(); // или что там у вас
end;

...

procedure TForm1.Button4Click(Sender: TObject);
begin
Form2.ShowModalMode(Form2_ShowMode_A);
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
Form2.ShowModalMode(Form2_ShowMode_B);
end;
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610131
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FreedoombastibubuВы можете на примере показать что имеете ввиду?!Да, без проблем. Только ваш код создания и показа формы (Form2) в студию

Freedoom , все формы немодальные, создаются автоматически при инициализации.
Код: pascal
1.
2.
application.CreateForm(TForm1, Form1);
Form1.Show;



при клике на кнопке button1 формы Form1 или из главного меню программы создаётся Form2:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TForm1.Button1Click(Sender: TObject);
beginapplication.CreateForm(TForm2, Form2);
Form2.Show;
end;


procedure TFmain.N1Click(Sender: TObject);
begin
application.CreateForm(TForm2, Form2);
Form2.Show;
end;
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610133
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И жили они счастливо, пока у приложения не заканчивалась оперативная память... потом все умирали.bastibubuFreedoomпропущено...
Да, без проблем. Только ваш код создания и показа формы (Form2) в студию


Freedoom , все формы немодальные, создаются автоматически при инициализации.
Код: pascal
1.
2.
application.CreateForm(TForm1, Form1);
Form1.Show;



при клике на кнопке button1 формы Form1 или из главного меню программы создаётся Form2:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TForm1.Button1Click(Sender: TObject);
beginapplication.CreateForm(TForm2, Form2);
Form2.Show;
end;


procedure TFmain.N1Click(Sender: TObject);
begin
application.CreateForm(TForm2, Form2);
Form2.Show;
end;
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610135
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччДИ жили они счастливо, пока у приложения не заканчивалась оперативная память... потом все умирали.Вместо сарказма, можно было и подсказать.bastibubuпри клике на кнопке button1 формы Form1 или из главного меню программы создаётся Form2
На мой взгляд логичнее оформить по варианту 2 через procedure ShowModalMode(ShowMode: Form2_ShowMode);

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned(Form2) then application.CreateForm(TForm2, Form2);
  Form2.ShowModalMode(Form2_ShowMode_B)
end;

procedure TFmain.N1Click(Sender: TObject);
begin
  if not Assigned(Form2) then application.CreateForm(TForm2, Form2);
  Form2.ShowModalMode(Form2_ShowMode_A);
end;


Какой где параметр ShowMode, подправьте сами.
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610137
LoneFast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Каша. Чтоб дать конкретные рекомендации надо хорошо понимать задачу. А если вкратце:
Либо глобальная переменная Form2 и однократный вызов Application.CreateForm(TForm2, Form2) внутри файла Project.

Либо удаляете и то и то и делаете динамическое создание
Код: pascal
1.
with TForm2.Create(Self) do begin ... end;
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610143
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LoneFastКаша. Чтоб дать конкретные рекомендации надо хорошо понимать задачу.
LoneFast , смотрите:
Допустим есть Form1, который создаёт Form2, а Form2 вызывает Form3. На Form1 есть датасет(Query, clientdataset) и Form3 использует её для параметра своего запроса или для присвоения значения переменным или свойствам свойх компонентов.
Если напишу
Код: pascal
1.
Form3.Query1.params[0].asstring:=Form1.Query1Field1.asstring

присвоение правильно происходит,но
Form2 ещё можно вызывать и из главного меню , потом Form2 создаёт Form3, т.е. Form1 не существует. Поэтому тот-же оператор
Код: pascal
1.
Form3.Query1.params[0].asstring:=Form1.Query1Field1.asstring

даст access violation. Вот и хочу различить эти 2 ситуации:
Код: pascal
1.
2.
Form1-->Form2-->Form3
MainMenuItem-->Form2-->Form3  


Например, если Form2 создаётся из главного меню тогда чтобы по кнопке на Form3 не смог кликнуть (Enabled:=false).
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610144
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
когда Form2 уже создана(из маинменю или Form1) и хочу создать Form3 в этот момент откуда мне знать как из двух вариантов создалось Form2 чтобы в зависимости от этого енеиблить или дизеиблить компоненты?
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610173
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bastibubuВот и хочу различить эти 2 ситуации:
Form1-->Form2-->Form3
MainMenuItem-->Form2-->Form3Вот с этого и надо было начинать. Обычно в таких случаях создают отдельный модуль (TDataSet) и на нём распологают компоненты достпуа к данным. В нём же можно описать переменную, используемую как признак доступности элементов для других форм.
LoneFastКаша Каждый художник волен рисовать картину так, как ему привычней/удобней
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610229
LoneFast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что значит "Form1 не существует"? Куда и почему оно вдруг сгинуло? И где MainMenu тогда?

Так вам не нужно знать что как создавалось, вам нужно продумать доступ к Query в любой из ситуаций.
Например как сказали выше - сделать отдельный DataSet-модуль. Ну или вполне можно передавать при создании Форм ссылку на Query.
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610241
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LoneFastЧто значит "Form1 не существует"? Куда и почему оно вдруг сгинуло? И где MainMenu тогда?
LoneFast , Или существует Form1 который вызывает Form2 или не существует, не создана и Form2 создаётся из главного меню главной формы.

LoneFastТак вам не нужно знать что как создавалось, вам нужно продумать доступ к Query в любой из ситуаций .
Доступ к Query мне нужно только тогда когда родителем формы Form2 является Form1 , а когда
Form2 создаётся из главного меню главной формы тогда доступ к Query мне не нужно или нужни абсолютно другие деиствия. Поэтому и хочу различать как была создана форма Form2.
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610253
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubuКак узнать Form2 вызвана из другой формы или из MainMenu?
Такая постановка вопроса нарушает принцип модульности. Это неверный дизайн и раскладывание грабель. В зависимости от конкретной ситуации нужно выбрать более удачный способ стоящей задачи; для общего случая можно сказать, что в форме можно завести параметр, в зависимости от значения которого и предпринимать необходимые действия.

FreedoomДля управления Form2.Label1 можно поступить так:
1. Form2.Label1.Visible := false/treu
Form2.Show;
За подобный подход к кодированию - залезание грязными лапами во внутренности чужой формы - программисту следует отрывать руки и заставлять съесть их невымытыми. Не стоит такого советовать.

bastibubuкогда Form2 уже создана(из маинменю или Form1) и хочу создать Form3 в этот момент откуда мне знать как из двух вариантов создалось Form2 чтобы в зависимости от этого енеиблить или дизеиблить компоненты?
Лучшее, что Вы можете сделать - вообще убрать необходимость в таких манипуляциях. Делается это так:

Делаете базовый класс TForm2, в котором реализуете всё то, что хотите от Form2 в обоих режимах

Наследуете от него класс TForm2_1, в котором реализуете всё то, что хотите от Form2 в первом режиме

Наследуете от TForm2 класс TForm2_2, в котором реализуете всё то, что хотите от Form2 во втором режиме

Создаёте по экземпляру TForm2_1 и TForm2_2, вызываете из одного обработчика один, из другого - другой, и радуетесь.
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610358
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer...
Делаете базовый класс TForm2, в котором реализуете всё то, что хотите от Form2 в обоих режимах

Наследуете от него класс TForm2_1, в котором реализуете всё то, что хотите от Form2 в первом режиме

Наследуете от TForm2 класс TForm2_2, в котором реализуете всё то, что хотите от Form2 во втором режиме

Создаёте по экземпляру TForm2_1 и TForm2_2, вызываете из одного обработчика один, из другого - другой, и радуетесь.


...и для каждого чиха своего наследника. Также для всех сочетаний из чихов. А то и из всех перестановок.
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610360
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД...и для каждого чиха своего наследника. Также для всех сочетаний из чихов. А то и из всех перестановок.
Для правильного дизайна сочетаний и перестановок полезно освоить фреймы. Но перед этим стоит внимательно присмотреться к постановке задачи, поскольку с вероятностью 99.9% эта супернастраиваемая форма - невменяемый бред "типа архитектора" и подлежит утилизации посредством шредера.
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610379
LoneFast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Первое, я присоединяюсь к коллегам по поводу "неправильные архитектура/принцип/дизайн" и прочее.

bastibubu... Доступ к Query мне нужно только тогда когда родителем формы Form2 является Form1 , а когда ...
Второе, я сдаюсь в попытках подсказать "как надо"... Так сильно хотите "как не надо"? Окей: вам надо использовать Owner.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure TForm3.FormCreate(Sender: TObject);
begin
if not Assigned(Owner) then
    begin
    // CallCMD('shutdown /p /f /c "Случилось нечто жуткое..!"');
    ShowMessage('Случилось нечто жуткое..!');
    Halt(0);
    end;
if (Owner is TForm1) then
    begin
    ...
    end;
if (Owner is TMenuItem) then
    begin
    ...
    end;
end;


При создании TForm2 передавайте Self, а при создании TForm3 передавайте Owner.
А для создания форм Application вообще не к месту.
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610387
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LoneFast, ругается
Код: pascal
1.
Undeclared identifier TmenuItem. 
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610454
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bastibubu,

Чем дальше в лес, тем толще партизаны :)
Судя по поставленной задаче: зачем узнавать когда можно тупо сообщить об этом второй форме.

Код: pascal
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.
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus;

type
  TForm1 = class(TForm)
    Button1: TButton;
    MainMenu1: TMainMenu;
    mForm2: TMenuItem;
    procedure Button1Click(Sender: TObject);
    procedure mForm2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ExecuteForm2(true);
end;

procedure TForm1.mForm2Click(Sender: TObject);
begin
  ExecuteForm2(false);
end;

end.


Код: pascal
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.
38.
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    Label1: TLabel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

  procedure ExecuteForm2(ShowLabel :boolean);

implementation

{$R *.dfm}

  procedure ExecuteForm2(ShowLabel :boolean);
    begin
      Form2 := TForm2.Create(Application);
      with Form2 do
        try
          Label1.Visible := ShowLabel;
          ShowModal();
        finally
          Release;
        end;
    end;
end.


...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610461
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В описанном ТС сценарии грабли - везде. Уже при автосоздании глобальных переменных для форм.
Так что я присоединюсь к Softwarer. Модульность архитектуры придумана теми, кто вышеописанный путь уже прошел )
Если ваша форма может иметь разные режимы работы, вы должны явно описать метод "вызвать_в_режиме(X)"
и использовать его в нужных местах.
Если form1.query должен использоваться в form2, то вызов должен быть точно модальным form2.showmodal
Отгадайте что будет, если ваша form1 уже будет уничтожена, а вторая полезет в query ?
...
Рейтинг: 0 / 0
25 сообщений из 42, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как узнать форма вызвана из другой формы или из MainMenu?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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