powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как узнать форма вызвана из другой формы или из MainMenu?
17 сообщений из 42, страница 2 из 2
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610466
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubu,

авторНа Form1 есть датасет(Query, clientdataset) и Form3 использует её для параметра своего запроса или для присвоения значения переменным или свойствам свойх компонентов.

Все датасеты и коннекты лучше вынести на отдельный датамодуль. Который создавать по мере необхиодимости. Либо, проще, на старте.
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610707
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем большое спасибо. Вы мне очень помогли.
На счеть модульности: общие датасети все вынесены в отдельный датамодуль, просто датасет Form1 никем не используется кроме Form2.
krapotkin Отгадайте что будет, если ваша form1 уже будет уничтожена, а вторая полезет в query? Никак.Form2 модальная, наверх Form1.
Вопрос был о том как написать условие - форма вызывается из другой формы или из главного меню.
Или, например, из нескольких форм вызываю общую процедуру и проверяю условия так:

Код: 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.
IF (sender as TForm).Name='Fproducer' then 
  begin                                                            
       FProducer.Edit1.Font.Name:=.......;
       FProducer.Searchbox1.Font.Name:='Sylfaen';
       FProducer.Button1.Visible:=false;
       FProducer.Button2.Enabled:=true;  //и т.д.
   end
else
IF (sender as TForm).Name='Fgroup' then begin                                                                 
       Fgroup..........;
   end
end
else
IF (sender as TForm).Name='FInventoryName' then 
begin                                                                                  
   FInventoryName......;
   FInventoryName......;
end
else
IF (sender as TForm).Name='Fcountry' then begin                                                                                                      
   begin
   Fcountry......;
   Fcountry......;
   end;
end
else
IF (sender as TForm).Name='FUnit' then begin                                                                                                      
   begin
   FUnit......;
   FUnit.....;
   end;
end;



но, каr видите здесь приведения выполняются к типу TForm, а вот при TMenuItem не могу код правильно написать.
Код: pascal
1.
IF (sender as TMenuItem).Name='N1' then begin ...

ругается Undeclared identifier TMenuItem.
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610924
LoneFast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Семён Семёныч! Ну очевидно же что в Uses нету модуля, в котором описаны TMenuItem!
Либо вспоминать в каком и добавлять руками, либо вариант для ленивых - кидаем с палитры на форму (на модуле которой ругается) компонент TMainMenu, нажимаем компилировать, и оно само добавит модуль. После этого можно удалять TMainMenu.
У меня, если что, добавляет "Vcl.Menus".

Почему "sender" и "as"? Проверка говорю через "is", а передавать через "Owner".
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39610945
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LoneFast , в Uses вместо Vcl.Menus был включен Menus. Не compile не build ни помог. Поменял на Vcl.Menus и заработал. :)
Кстати, пока форму создавал где владелец Application (Form1 := TForm1.Create(Application)) проверка с помощью owner не работал поскольку всегда owner-ом был appllication. Как только поменял на Form1 := TForm1.Create(self) уже заработал. :)
Спасибо всем.
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39611249
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubuПоменял на Vcl.Menus и заработал

или можно было в настрйоках проекта префиксы стандартные настроить
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39611317
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubu,

Надёжнее всего создавать формы так:
Код: pascal
1.
Application.CreateForm(TForm1, Form1)


Другие варианты могут привести к разным спецэффектам рано или поздно. Вместо проверки на Owner что-то другое придумать.

Код: pascal
1.
IF (sender as TForm).Name='Fproducer'


Лучше проверять на конкретный класс формы: Sender Is TForm1, либо на экземпляр формы (если она одна, случаи всякие бывают): Sender = Form1. Правда, придётся тянуть в uses все модули. Но если они и так там уже, то разницы нет.
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39611320
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubu,

автор можно было в настрйоках проекта префиксы стандартные настроить

настраивать тут, если что: Delphi compiler > Unit scope names.
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39611418
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaonbastibubu,

Надёжнее всего создавать формы так:
Код: pascal
1.
Application.CreateForm(TForm1, Form1)


Другие варианты могут привести к разным спецэффектам рано или поздно.
makhaon , я всегда и так создаю формы и когда не нужны уничтожаю (action:=caFree). Просто сейчас экспериментирую, изучаю параметры sender, owner и на этом этапе, если владелец формы Application тогда условия проверки(if owner.name is 'Fmain'... ) не сработает поскольку всегда owner-ом будет Application откуда бы форму не вызывал. Поэтому временно поменял application на self.


makhaon Вместо проверки на Owner что-то другое придумать.

Код: pascal
1.
IF (sender as TForm).Name='Fproducer'


Лучше проверять на конкретный класс формы: Sender Is TForm1, либо на экземпляр формы (если она одна, случаи всякие бывают): Sender = Form1.
Да, вы правы. Тем более имена форм иногда меняю.

P.S. Всё-таки никак не смог написать условие "if форму вызывает MainMenu главной формы тогда...". Всегда owner-ом является главная форма а не MenuItem. Правильно советовали что это путь ведущий в некуда...
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39611425
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubuПравильно советовали что это путь ведущий в некуда...

плакалъ
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39611434
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubuформу вызывает MainMenu

начнём с того, что эта фраза дважды бессмыслена

ни форма ни меню не являются функциями, поэтому не возможно их вызывать и поэтому они тоже никого не могут вызывать

программирование начинается с "объясни тупому комьпютеру, на понимаемом им дебильском язык,Е что ты от него всё-таки хочешь"

а для этого сначала это надо объяснить себе, разжевать

соответственно, пока вы проихносите бесмысленные фразы вроде процитированных - то и программировать вы не можете

пока обдумывая её и спрашивая себя что же реальное вы могли бы иметь в виду, вы её не замените на другую фразу, имеющую какой-то практический смысл

https://habrahabr.ru/company/alconost/blog/344652/
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39611624
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubu P.S. Всё-таки никак не смог написать условие "if форму вызывает MainMenu главной формы тогда...". Всегда owner-ом является главная форма а не MenuItem. Правильно советовали что это путь ведущий в некуда...
имхо, у тебя два выхода: либо используешь какое-нибудь стандартное свойство формы (owner, tag), либо заводишь дополнительное поле типа FCaller: TControl, создаешь шаблон и наследуешься от этой формы.
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39611778
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,
что за "шаблон", о каком "наследовании" баишь?
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39611857
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДчто за "шаблон", о каком "наследовании" баишь?
прикалываешься? :)
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39611926
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на коленке
Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
  unit CallerForm;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs;

type

  { TMyCallerFrm }

  TMyCallerFrm = class(TForm)
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormShow(Sender: TObject);
  private
    FCaller: String;
    procedure SetCaller(AValue: String);
  public
    constructor Create(AOwner: TComponent; ACaller: TWinControl);
    property Caller: String read FCaller write SetCaller;
  end;

var
  MyCallerFrm: TMyCallerFrm;

implementation

{$R *.lfm}

{ TMyCallerFrm }

procedure TMyCallerFrm.FormClose(Sender: TObject; var CloseAction: TCloseAction
  );
begin
  CloseAction:= caFree;
end;

procedure TMyCallerFrm.FormShow(Sender: TObject);
begin
  if Caller = 'Button1'
    then
      Self.Caption:= 'Я вызвана кнопкой "Button1"'
    else
      Self.Caption:= 'Я вызвана чем-то другим';
end;

procedure TMyCallerFrm.SetCaller(AValue: String);
begin
  if FCaller = AValue then Exit;
  FCaller:= AValue;
end;

constructor TMyCallerFrm.Create(AOwner: TComponent; ACaller: TWinControl);
begin
  Caller:= TWinControl(ACaller).Name;
  inherited Create(AOwner);
end;

end.         




Передаваемая строка может быть не уникальна, тут уже думать надо
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39611944
kep-ko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ariochначнём с того, что эта фраза дважды бессмыслена
Шикарно!

Возьму на вооружение. Тебе, наверное, часто приходится 'внушать' заказчику что он идиот не прав?
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39611952
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kep-koAriochначнём с того, что эта фраза дважды бессмыслена
Шикарно!

Возьму на вооружение. Тебе, наверное, часто приходится 'внушать' заказчику что он идиот не прав?
Ну конечно же, ТС - "заказчик".
...
Рейтинг: 0 / 0
Как узнать форма вызвана из другой формы или из MainMenu?
    #39612060
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо LoneFast, FreeDoom, Softwarer, Док за предложенные варианты.
...
Рейтинг: 0 / 0
17 сообщений из 42, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как узнать форма вызвана из другой формы или из MainMenu?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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