|
#1
|
|||
|
|||
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
|
||||
|
||||
По идее Вы не должны получить ModalResult, так как форма показанная с помощью ShowModal будет ждать своего закрытия и соответственно дальнейший код вызвавшей ее процедуры продолжен не будет. Где-то, что-то, вероятнее всего, у Вас не так написано.
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете. |
#3
|
|||
|
|||
В том, то и вопрос, что не так. Такое ощущение, что форма создается повторно, хотя ранее создана уже
Код:
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
|
||||
|
||||
Цитата:
Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#5
|
|||
|
|||
Попробую, но что-то мне подсказывает, что в новом проекте будет все хорошо.
|
#6
|
||||
|
||||
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#7
|
|||
|
|||
Цитата:
К тому же я писал, что в проблемном случае Бряк срабатывает как бы при открытии модальной формы. То есть мы по сути не ждем модалку как если бы прописали 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; Вот собственно все, что есть на модальной форме. В OnCreate Главной формы Код:
SomeFRM := TSomeFRM.Create(self); Application.OnRestore := AppRestore; Application.OnMinimize := AppHide; .... LoadFromINIparam; // Заполняем SomeFRM с того же data.ini ... end; Последний раз редактировалось nixon232, 13.03.2018 в 21:25. |
#8
|
||||
|
||||
Цитата:
Код:
SomeFRM:= TSomeFRM.Create(Self); try SomeFRM.ShowModal; finally SomeFRM.Free; end; Код:
procedure TSomeFRM.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if MessageDlg('Закрыть окно, уверены?', mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then CanClose:= false; end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#9
|
|||
|
|||
Ну я ее (модалку) так и создаю, но по своим причинам не освобождаю. В этом же и вопрос чего в одном куске кода оно работает хорошо, а в другом не ждет модальный ответ
Код:
begin if SomeFRM.ShowModal = mrYes then begin ..... end; end; Код:
var r: TModalResult; begin r:= SomeFRM.ShowModal; if r= mrYes then begin .... end; end; |
#10
|
||||
|
||||
Суть вопроса ясна. Но Вы так и не привели минимальный пример для воспроизведения косяка. Догадки строить - неблагодарное дело. Вам тут (и на любом другом портале) насочинять могут тысячи причин. Упростите и себе и нам процедуру поиска ответа на ваш вопрос - предоставьте код на тесты.
Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#11
|
|||
|
|||
Цитата:
Запускать проект групп. |
#12
|
||||
|
||||
Если не воспроизводится ошибка в тестовом проекте, то зачем тогда выкладывать его? А вообще, зачем Вам создавать/уничтожать в "другом" месте модальную форму? Может сделать как-нибудь так:
Код:
procedure SomeButtonClick(Sender: TObject); begin with TMyModalForm.Create do try if ShowModal = mrYes then begin // do something end; finally Free; end; end; Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#13
|
|||
|
|||
Цитата:
Наверное, незачем, но время на его создание не вернуть. Цитата:
Код:
SomeObj.str:=SomeFRM.SomeEdit.text в таком случае, пожалуй, что целесообразнее подгружать из ini по надобности?, чем хранить в форме? |
#14
|
||||
|
||||
Цитата:
Код:
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)
|