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


Автор: ТоляМБА 9.6.2015, 12:36
Есть Form1 с двумя пунктами меню MenuItem1,2
Есть Form2 с двумя едитами Edit1,2
Надо чтобы при нажатии на MenuItem1 открывалась Form2 с Edit2.visible:=false, а при нажатии на MenuItem2 открывалась Form2 c Edit1.visible:=false;

Можно сделать на процедуру нажатия меню Menuitem1 код
Код
Form2.Edit2.visible:=false;
Form2.ShowModal;
для MenuItem2 аналогично

Но мне надо знать из формы 2 при открытии формы (например в procedure TForm2.FormShow(Sender: TObject); ) каким пунктом меню было вызвано Form2.ShowModal;

Подозреваю что можно через Sender но не знаю как.

Автор: superVad 9.6.2015, 17:02
Собственно, чего тут знать? если Edit2.Visible = false то Menuitem1 и наоборот.

Автор: ТоляМБА 9.6.2015, 17:21
superVad, это если я из Form1 это значение задам. Я же хочу задавать это значение из Form2 в зависимости от того пункта меню на Form1 которым была открыта Form2.

Автор: Poseidon 10.6.2015, 09:09
В Form2 создаешь property. До вызова ShowModal заполняешь эту пропертю. В FormShow считываешь. Как-то так:

Form1
Код

{Можно "повесить" на OnClick обоих MenuItem}
procedure TForm1.MenuItemClick(Sender: TObject);
begin
  Form2.MenuItem := Sender as TMenuItem;
  Form2.ShowModal;
end;


Form2
Код

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    procedure FormShow(Sender: TObject);
  private
    FMenuItem: TMenuItem;
  public
    property MenuItem: TMenuItem write FMenuItem;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormShow(Sender: TObject);
begin
  if FMenuItem = Form1.MenuItem1 then
    Edit2.Visible := False;

  if FMenuItem = Form1.MenuItem2 then
    Edit1.Visible := False;
end;


Правда мне не очень нравится обращение к Form1 из метода TForm2.FormShow. Возможно я бы сделал через Tag или еще как-нибудь. Но общий принцип, думаю. понятен.

Автор: superVad 10.6.2015, 15:50
Цитата(ТоляМБА @  9.6.2015,  16:21 Найти цитируемый пост)
superVad, это если я из Form1 это значение задам. Я же хочу задавать это значение из Form2 в зависимости от того пункта меню на Form1 которым была открыта Form2.


Как я понял - надо всю логику перенести в Form2. Тут я могу только какие то свои мысли написать.

Привязываться к Menuitem - плохо. Есть две причины. Возможно, потом надо будет этот же экшн (желательно, что бы айтим вызывал экшн из ЭкшнМенеджера или ЭкшнЛиста) вызывать еще и из контекстного меню и с панельки и с клавиатуры... Формы не должны знать ничего друг про друга - инкапсуляция, такое всякое... Т.е. плохо когда Form1 обращается к эдитам Form2 и плохо когда Form2 знает про Menuitem Form1.

Как сделал бы я:
Убрал Form2 из автосоздания.
Создавал и показывал Form2 через классовый метод (если интересно могу подробнее, я тут где то про это уже писал).
Ну и собственно для каждого варианта вызова: или передавал разные параметры в этот классовый метод, или сделал несколько классовых методов для каждого случая.

Автор: Агрох 16.6.2015, 17:58
В Form2 добавь процедуру
Код

procedure TForm2.MyShowModal(Param: Integer);
begin
  case Param of
    1: Edit1.Visible := false;
    2: Edit2.Visible := false;
  end;
  ShowModal;
end;


Ну и из Form1 вызывай не Form2.ShowModal а Form2.MyShowModal(SomeIndex);

Можно аналогично предложенному Poseidonом:
Код

procedure TForm2.MyShowModal(Sender: TObject);
begin
  if Sender = Form1.Button1 then Edit1.Visible := false else
  if Sender = Form1.Button2 then Edit2.Visible := false;
  ShowModal;
end;


Ну и вызов при нажатии кнопки будет
Код

procedure TForm1.Button2Click(Sender: TObject);
begin
  Form2.MyShowModal(Sender);
end;

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