![]() |
|
|
#1
|
|||
|
|||
|
Есть формы, на каждой кнопка со св-ом 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
|
||||
|
||||
|
Цитата:
|
|
#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
|
||||
|
||||
|
Суть вопроса ясна. Но Вы так и не привели минимальный пример для воспроизведения косяка. Догадки строить - неблагодарное дело. Вам тут (и на любом другом портале) насочинять могут тысячи причин. Упростите и себе и нам процедуру поиска ответа на ваш вопрос - предоставьте код на тесты.
|
|
#11
|
|||
|
|||
|
Цитата:
Запускать проект групп. |
|
#12
|
||||
|
||||
|
Если не воспроизводится ошибка в тестовом проекте, то зачем тогда выкладывать его? А вообще, зачем Вам создавать/уничтожать в "другом" месте модальную форму? Может сделать как-нибудь так:
Код:
procedure SomeButtonClick(Sender: TObject);
begin
with TMyModalForm.Create do
try
if ShowModal = mrYes then
begin
// do something
end;
finally
Free;
end;
end; |
|
#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; |
| Этот пользователь сказал Спасибо dr. F.I.N. за это полезное сообщение: | ||
nixon232 (15.03.2018)
| ||