Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.03.2018, 14:37
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию ModalResult

Есть формы, на каждой кнопка со св-ом ModalResult= mrYes
Образовалась странная, наверняка детская, проблема при вызове одной из форм.
Код:
begin
  if SomeFRM.ShowModal = mrYes then
  begin
    .....
  end;
end;

Если поставить брейк на if SomeFRM.ShowModal = mrYes then, то в одном случае, он срабатывает (как и задумано) после клика по кнопке и попадает в блок с условием, а в ином случае сразу при вызове формы, и, соответственно, результат не ждет. Где что забыл? OnClose etc ни где не обрабатывается.

Последний раз редактировалось nixon232, 12.03.2018 в 16:52.
Ответить с цитированием
  #2  
Старый 13.03.2018, 02:56
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 339
Версия Delphi: 10.4
Репутация: 429
Сообщение

По идее Вы не должны получить ModalResult, так как форма показанная с помощью ShowModal будет ждать своего закрытия и соответственно дальнейший код вызвавшей ее процедуры продолжен не будет. Где-то, что-то, вероятнее всего, у Вас не так написано.
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #3  
Старый 13.03.2018, 12:32
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

В том, то и вопрос, что не так. Такое ощущение, что форма создается повторно, хотя ранее создана уже
Код:
SomeFRM := TSomeFRM.Create(self);

Причем, если прописать переменную, то проблема уходит. Но в этом же проекте работает код и без переменной. По этому, хочется понять причину
Код:
var r: TModalResult;
begin
   r:= SomeFRM.ShowModal;
  if r= mrYes then
     begin
      ....
      end;
end;

Последний раз редактировалось nixon232, 13.03.2018 в 12:35.
Ответить с цитированием
  #4  
Старый 13.03.2018, 14:08
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Цитата:
Сообщение от nixon232
Причем, если прописать переменную, то проблема уходит. Но в этом же проекте работает код и без переменной. По этому, хочется понять причину
Приведите минимальный пример кода воспроизводящий проблему. Ну или если проект не большой (не секретный) и не переполнен нестандартными компонетами, то можете его и выложить.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #5  
Старый 13.03.2018, 14:48
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Попробую, но что-то мне подсказывает, что в новом проекте будет все хорошо.
Ответить с цитированием
  #6  
Старый 13.03.2018, 15:47
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от nixon232
...Если поставить брейк на if SomeFRM.ShowModal = mrYes then, то в одном случае, он срабатывает (как и задумано) после клика по кнопке и попадает в блок с условием, а в ином случае сразу при вызове формы, и, соответственно, результат не ждет...
Ну а что, вполне логично - если вылетает из блока следовательно ShowModal отличается от mrYes, тогда можно явно при жиме кнопки результат указывать ModalResult:= mrYes; до обработки и Close
Ответить с цитированием
  #7  
Старый 13.03.2018, 21:16
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Alegun
Ну а что, вполне логично - если вылетает из блока следовательно ShowModal отличается от mrYes, тогда можно явно при жиме кнопки результат указывать ModalResult:= mrYes; до обработки и Close
Так то да, вот только в коде нигде не используется close и никак не обрабатываются соответствующие события.
К тому же я писал, что в проблемном случае Бряк срабатывает как бы при открытии модальной формы. То есть мы по сути не ждем модалку как если бы прописали SomeFRM.Show, a не ShowModal. Так что там никакой Close не перекрывается. На форме 2 события и 3 кнопки.
Ничего не обычного OnCreate, Кнопка Save с MrYes, и таким кодом
Код:
var
  ini: tinifile;
begin
  ini := tinifile.Create(ExtractFilePath(Application.ExeName) + 'data.ini');
  try
    ini.WriteInteger();
    ...
  finally
    ini.Free;
  end;

end;
и кнопка Close Без события, но с mrCancel
Вот собственно все, что есть на модальной форме.
В OnCreate Главной формы
Код:
SomeFRM := TSomeFRM.Create(self);
  Application.OnRestore := AppRestore;
  Application.OnMinimize := AppHide;
 ....
  LoadFromINIparam; // Заполняем SomeFRM с того же data.ini
  ...

end;
Само собой, все формы создаются вручную.

Последний раз редактировалось nixon232, 13.03.2018 в 21:25.
Ответить с цитированием
  #8  
Старый 13.03.2018, 23:23
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от nixon232
...Само собой, все формы создаются вручную.
Вручную модалка вот так создаётся и показывается
Код:
 SomeFRM:= TSomeFRM.Create(Self);
 try
 SomeFRM.ShowModal;
finally 
 SomeFRM.Free;
end;
а если нужна реакция на закрытие, событие OnCloseQuery используется для этого, чтоб спросить пользователя - уверен ли он, возможно остались несохранённые данные
Код:
procedure TSomeFRM.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if MessageDlg('Закрыть окно, уверены?', 
  mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then
  CanClose:= false;
end;
перевод CanClose в true, продолжит выполнение Close
Ответить с цитированием
  #9  
Старый 14.03.2018, 12:01
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Ну я ее (модалку) так и создаю, но по своим причинам не освобождаю. В этом же и вопрос чего в одном куске кода оно работает хорошо, а в другом не ждет модальный ответ
Код:
begin
if SomeFRM.ShowModal = mrYes then
begin
.....
end;
end;
в тоже время если переписать код выше на
Код:
var r: TModalResult;
begin
   r:= SomeFRM.ShowModal;
  if r= mrYes then
     begin
      ....
      end;
end;
Надеюсь, что теперь ясна суть вопроса.
Ответить с цитированием
  #10  
Старый 14.03.2018, 14:24
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Суть вопроса ясна. Но Вы так и не привели минимальный пример для воспроизведения косяка. Догадки строить - неблагодарное дело. Вам тут (и на любом другом портале) насочинять могут тысячи причин. Упростите и себе и нам процедуру поиска ответа на ваш вопрос - предоставьте код на тесты.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #11  
Старый 14.03.2018, 20:20
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Цитата:
Сообщение от dr. F.I.N.
Суть вопроса ясна. Но Вы так и не привели минимальный пример для воспроизведения косяка. Догадки строить - неблагодарное дело. Вам тут (и на любом другом портале) насочинять могут тысячи причин. Упростите и себе и нам процедуру поиска ответа на ваш вопрос - предоставьте код на тесты.
В том то и дело, что не воспроизводится в другом проекте. все равно кидаю проект. скелет передан точно. возможно из-за дублей имен юнита, не знаю.
Запускать проект групп.
Вложения
Тип файла: rar TestModal.rar (166.0 Кбайт, 3 просмотров)
Ответить с цитированием
  #12  
Старый 14.03.2018, 20:29
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Если не воспроизводится ошибка в тестовом проекте, то зачем тогда выкладывать его? А вообще, зачем Вам создавать/уничтожать в "другом" месте модальную форму? Может сделать как-нибудь так:
Код:
procedure SomeButtonClick(Sender: TObject);
begin
  with TMyModalForm.Create do
  try
    if ShowModal = mrYes then
    begin
      // do something
    end;
  finally
    Free;  
  end;
end;
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #13  
Старый 15.03.2018, 09:32
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Цитата:
Сообщение от dr. F.I.N.
Если не воспроизводится ошибка в тестовом проекте, то зачем тогда выкладывать его?

Наверное, незачем, но время на его создание не вернуть.
Цитата:
Сообщение от dr. F.I.N.
А вообще, зачем Вам создавать/уничтожать в "другом" месте модальную форму?
я там храню параметры и обращаюсь к ним из главной формы типо:
Код:
SomeObj.str:=SomeFRM.SomeEdit.text

в таком случае, пожалуй, что целесообразнее подгружать из ini по надобности?, чем хранить в форме?
Ответить с цитированием
  #14  
Старый 15.03.2018, 10:04
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Цитата:
Сообщение от nixon232
в таком случае, пожалуй, что целесообразнее подгружать из ini по надобности?, чем хранить в форме?
Так может тогда эти переменные объявить в глобальном var модуля модальной формы и тогда код будет примерно таким:
Код:
unit uMyModalForm;
..
type 
  TMyModalForm = class(TForm)
  ...
  end;

var
  modalform_value_int: Integer;
  modalfoem_value_str: string;
  ...
implementation

procedure TMyModalForm.ButtonYesClick(Sender: TObject);
begin
  modalform_value_int := ....// например ComboboxN.ItemIndex;
  modalform_value_str := ...// например EditM.Text;
  ...
end;

end;

А в другом модуле просто обращаетесь к переменным:
Код:
unit uMain;
...
procedure TFormMain.SomeButtonClick(Sender: TObject);
begin
  with TMyModalForm.Create do
  try
    if ShowModal = mrYes then
    begin
      ....
      ShowMessage(uMyModalForm.modalform_value_str);
      ....
    end;
  finally
    Free;  
  end;
end;
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
Этот пользователь сказал Спасибо dr. F.I.N. за это полезное сообщение:
nixon232 (15.03.2018)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:32.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter