powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Форма не закрывается по Close
4 сообщений из 4, страница 1 из 1
Форма не закрывается по Close
    #39794453
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

У меня несколько форм, которые должны вызываться по очереди или не по очереди по разным условиям.
Создаю их сразу при запуске, переменные форм - глобальные. (по умолчанию).

На MainForm разместил таймеры, которые запускают формы. У них interval = 100; Специально таймерами, чтобы события от Close нормально отрабатывали.

Пример таймера
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TMainForm.TimerShowNamesTimer(Sender: TObject);
begin
  TimerShowNames.Enabled := False;
  frmSelectName.AJSONText := AJSONText;
  frmSelectName.ReadNames;
  frmSelectName.ShowModal;
end;



Когда какую форму надо вызвать, делаю в любой форме так:
Close;
MainForm.<Таймернужнойформы>.Enabled := True;

И вот какой-то странный глюк, одна форма не хочет закрываться на этом тексте:

в этом тексте
Код: 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.
procedure TfrmConfirm.BCancelClick(Sender: TObject);
begin
  if IDTransaction > 0 then
  begin
    PollCommit;
  end;
//   else //это я уже экспериментировал
  begin
    Self.Close;
    MainForm.TimerShowDigits.Enabled := True;
  end;
end;


procedure TfrmConfirm.PollCommit;
var ..
begin
  try
    //тут блок, который пишет всякое в базу по условиям

  finally
    if not PollFailed then
    begin
      Self.Close;
      MainForm.TimerShowDigits.Enabled := True;
    end;
  end;
end;



Вот если PollCommit вызывается из другого места (не по нажатию клавиши отмена), то форма отлично правильно закрывается (с записью в базу).
Если я нажимаю BCancel в момент, когда блок ничего не должен прописать в базу, то форма тоже закрывается.
Но если я нажимаю BCancel в момент, когда должна быть выполнена запись - то форма виснет открытой, сколько бы Close я не вызвал.

В блоке глюков нет (наверное).
вся процедура
Код: 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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
procedure TfrmConfirm.PollCommit;
var
  IDPayment: Integer;

  procedure CommitPoll;
  var
    o: Integer;
    IsExcepted: Boolean;
    AParams: TStringList;
    Ans: String;

    AJSON: TJSONObject;
    ID, i: Integer;
  begin
    try
      Randomize; o := Random(1000);
      AParams := TStringList.Create;
      AParams.AddPair('id', IntToStr(IDTransaction)); //TENum.Tag содержит ID SPACCOUNTS
      AParams.AddPair('summ', IntToStr(SummPolled));
      AParams.AddPair('isfailed', IntToStr(Integer(PollFailed)));
      AParams.AddPair('check', IntToStr(o));
      Ans := MainForm.GetHTTPPost('/api/commitpoll', AParams, 'check', IsExcepted);

      if IsExcepted then
      begin
        { TODO : разрыв связи или ошибка сервера при сохранении, сообщить }
        MainForm.WriteLogError('TfrmConfirm.PollCommit'+'.7', Ans);
        MainForm.ShowMsg(' Ошибка ', Ans+#13#10+'Код 7');
      end else
      begin
          try
            try
              AJSON := TJSONObject.ParseJSONValue(Ans) as TJSONObject;
              if not Assigned(AJSON) then
              begin
                MainForm.WriteLogError('TfrmConfirm.PollCommit'+'.11', 'JSON not assigned');
                MainForm.ShowMsg(' Ошибка ', 'Сервер ответил неверно, попробуйте позже.'#13#10'Код 11');
                Exit;
              end;

              ID := -1;
              for i := 0 to AJSON.Count - 1 do
                if lowercase(AJSON.Pairs[i].JsonString.Value) = lowercase('result') then ID := i; //StrToIntDef(AJSON.Pairs[i].JsonValue.Value, 0);

              if ID = -1 then
              begin
                MainForm.WriteLogError('TfrmConfirm.PollCommit'+'.12', 'JSON wo result pair');
                MainForm.ShowMsg(' Ошибка ', 'Сервер ответил неверно, попробуйте позже'#13#10'Код 12');
                Exit;
              end;

              if not (LowerCase(AJSON.Pairs[id].JsonValue.Value) = 'success') then
              begin
                MainForm.WriteLogError('TfrmConfirm.PollCommit'+'.13', 'JSON wo result success: '+AJSON.Pairs[id+2].JsonValue.Value);
                MainForm.ShowMsg(' Ошибка ', 'Сервер ответил:'#13#10'Код 13'#13#10+AJSON.Pairs[id+2].JsonValue.Value);
                Exit;
              end;

              ID := -1;
              for i := 0 to AJSON.Count - 1 do
                if lowercase(AJSON.Pairs[i].JsonString.Value) = lowercase('data') then ID := i;// StrToIntDef(AJSON.Pairs[i].JsonValue.Value, 0);

              if ID = -1 then
              begin
                MainForm.WriteLogError('TfrmConfirm.PollCommit'+'.14', 'JSON wo data pair');
                MainForm.ShowMsg(' Ошибка ', 'Сервер ответил неверно, попробуйте позже'#13#10'Код 14');
                Exit;
              end;


              if (AJSON.Pairs[id].JsonValue as TJSONArray).Count = 0 then
              begin
                MainForm.WriteLogError('TfrmConfirm.PollCommit', 'IDTrans '+IntToStr(IDTransaction)+' was queried. No search results');
                if SummPolled > 0 then
                MainForm.ShowMsg(' Информация ', 'Отсутствуют данные о сохранении платежа');
                IDTransaction := 0;
                Exit;
              end;

              IDTransaction := 0;
              IDPayment := StrToIntDef(((AJSON.Pairs[id].JsonValue as TJSONArray).Items[0] as TJSONObject).Pairs[0].JsonValue.Value, 0);

            except
              on e:exception do
              begin
                MainForm.WriteLogError('TfrmConfirm.PollCommit'+'.8', E.Message);
                MainForm.ShowMsg(' Ошибка ', E.Message+#13#10'Код 8');
                Exit;
              end;

            end;
          finally
            AJSON.Destroy;
          end;
      end;

    finally
      FreeAndNil(AParams);
    end;
  end;

begin
  try
    IDPayment := 0;
    {$IFNDEF DEBUG}
    if CashBillerStarted then
    begin
      CashCodeBillValidatorCCNET.Reset;
      CashBillerStarted := False;
    end;
    {$ENDIF}
    CommitPoll;

    if PollFailed then //не прошло
    begin
      LGTab.ItemIndex := LGCCnetLog.Index;
  //    if SummPolled > 0 then
      MemoCCNet.Lines.Add('-- ПРИНЯТАЯ СУММА: '+IntToStr(SummPolled));
      MainForm.WriteLogPoll('FAILURE', MemoCCNet.Lines.Text);
      Exit;
    end else
    if PollCommitPressed then //нажали закинуть на счет
    begin
      MainForm.WriteLogPoll('SUCCESS', MemoCCNet.Lines.Text);
      try
        Application.CreateForm(TfrmReceipt, frmReceipt);
        frmReceipt.Summ := SummPolled;
        frmReceipt.Room := StrToIntDef( TENum.Text, 0 );
        frmReceipt.IDAcc := TENum.Tag;
        frmReceipt.IDPayment := IDPayment;
        frmReceipt.FIO := TEFIO.Text;
        frmReceipt.ADT := Now();
        frmReceipt.ShowModal;
      finally
        FreeAndNil(frmReceipt);
      end;
    end else
    begin //нажали отмену
  //    MessageDlg('Иду в commit', mtInformation, [mbok], 0);
//      CommitPoll;
//      Close;
  //    MainForm.TimerShowDigits.Enabled := True;
    end;

  //  Close;  //уже все испробовал (
  finally
    if not PollFailed then
    begin
      Self.Close;  
      MainForm.TimerShowDigits.Enabled := True;
    end;
  end;
end;



Помогите, пожалуйста, не понимаю ЧЯДНТ
Спасибо!
...
Рейтинг: 0 / 0
Форма не закрывается по Close
    #39794480
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем такой геморрой с таймерами?

не лучше ли сделать отдельный объект, конечный автомат, который будет по очереди запускать формы, принимать от них коды результата работы и по нему определять, какую дальше форму вызывать

Ты ведь по сути Мастер (Wizard) создаёшь, только в разных окнах, а не в одном
...
Рейтинг: 0 / 0
Форма не закрывается по Close
    #39794611
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

Wizard в нескольких формах (да еще и не дай бог не диалогах) - та еще угадайка. +100500 за конечный автомат.
...
Рейтинг: 0 / 0
Форма не закрывается по Close
    #39794745
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Потоки надо использовать
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Форма не закрывается по Close
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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