Перейти к содержанию
Fire Monkey от А до Я
  • 0

Закрыть форму диалога


Kitty

Вопрос

Создала свое диалоговое окно из прозрачной формы. Посередине лайаут с ректенглом и на нем две кнопки.

Вызываю этот окно-диалог из главной формы:

//показать форму диалог в событии TForm1::Beacon1BeaconEnter
 FormDialog = new TFormDialog(this);
 FormDialog->Label1->Text = L"fire-monkey.ru";
 FormDialog->Show();

В коде формы диалога:

void __fastcall TFormDialog::FormShow(TObject *Sender)
{
 Button1->SetFocus();
}
//---------------------------------------------------------------------------

void __fastcall TFormDialog::Button2Click(TObject *Sender)
{
 Close();
}

Так вот чтобы сработало событие закрытие формы при нажатии Button2 надо нажать на кнопку дважды. При первом нажатии форма оживает и при втором нажатии на кнопку уже срабатывает закрытие формы. Как сделать чтобы после показа формы достаточно было закрыть ее одним щелчком по кнопке, а не двумя?

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Выяснилось, что если вызвать форму диалога из события нажатия кнопки, то форма диалога затем нормально закрывается - одним щелчком.

Если вызвать создание формы в событии Beacon1BeaconEnter, то чтобы закрыть затем эту форму диалога надо щелкать два раза.

С чем это может быть связано?

Ссылка на комментарий
  • 0

Удалось победить.

1. Привела внешний вид формы iOS как у ZuBy:

http://fire-monkey.ru/topic/2669-диалоговое-окно-на-андроид/#comment-15282

2. Перевела в опциях проекта форму диалог в Available forms.

3. И вызов:

void CreateMyDialog(String MES)
{
 if(FormDialog == NULL)
 {
  FormDialog = new TFormDialog(0);
  FormDialog->Text1->Text = MES;
  FormDialog->ShowModal();
  if(FormDialog != NULL)
	  {
	   delete FormDialog;
       FormDialog = NULL;
	  }
 }
}

//вход в зону маячка
void __fastcall TForm1::Beacon1BeaconEnter(TObject * const Sender, IBeacon * const ABeacon,
		  const TBeaconList CurrentBeaconList)
{

 Word Major = ABeacon->GetMajor();
 Word Minor = ABeacon->GetMinor();

 if(Major != 10 || Minor != 1)
 {
   return;
 }

	 String MES = L"fire-monkey.ru";
	 CreateMyDialog(MES);
}

Теперь закрывается одним щелчком...

Изменено пользователем Kitty
Ссылка на комментарий
  • 0

Кто нибудь сталкивался с такой проблемой - если очень долго держать окно диалога открытым и ничего с ним не делать, то иногда оно перестает реагировать на нажатия кнопок, просто "замерзает".

Может есть рецепты?

Ссылка на комментарий
  • 0
  • Модераторы
3 часа назад, Kitty сказал:

Кто нибудь сталкивался с такой проблемой - если очень долго держать окно диалога открытым и ничего с ним не делать, то иногда оно перестает реагировать на нажатия кнопок, просто "замерзает".

Может есть рецепты?

прозрачность используется? если да, то нужно скрывать при сворачивании, при активации снова показывать форму

Ссылка на комментарий
  • 0

Можно ли дать объяснение такому факту поведения диалоговой формы в iOS?:

1. Вызываем диалоговую форму по событию нажатия кнопки на главной форме и оставляем  висеть эту диалоговую форму на экране сколь угодно долго. Затем нажимаем на любую кнопку в этой диалоговой форме и все работает как надо.

2. Создаем эту диалоговую форму в событии TForm1::Beacon1BeaconEnter и оставляем ничего не трогая висеть ее также на экране. Для надежности ставим глобальную переменную чтобы событие TForm1::Beacon1BeaconEnter произошло только один раз. В диапазоне примерно 40-300 секунд диалоговая форма созданная в событии TForm1::Beacon1BeaconEnter перестает отвечать на любое нажатие кнопок и просто замерзает.

Что посоветуете? Спасибо.

 

Ссылка на комментарий
  • 0
  • Модераторы
23 минуты назад, Kitty сказал:

Можно ли дать объяснение такому факту поведения диалоговой формы в iOS?:

1. Вызываем диалоговую форму по событию нажатия кнопки на главной форме и оставляем  висеть эту диалоговую форму на экране сколь угодно долго. Затем нажимаем на любую кнопку в этой диалоговой форме и все работает как надо.

2. Создаем эту диалоговую форму в событии TForm1::Beacon1BeaconEnter и оставляем ничего не трогая висеть ее также на экране. Для надежности ставим глобальную переменную чтобы событие TForm1::Beacon1BeaconEnter произошло только один раз. В диапазоне примерно 40-300 секунд диалоговая форма созданная в событии TForm1::Beacon1BeaconEnter перестает отвечать на любое нажатие кнопок и просто замерзает.

Что посоветуете? Спасибо.

точно повторного вызова этой формы не происходит? 

иначе там ошибка будет что форма с таким именем уже создана

Ссылка на комментарий
  • 0
  • Модераторы
1 минуту назад, Kitty сказал:

На iOS 32 дебаг не работает...

тогда я склоняюсь к тому что у вас форма создается повторно.

поведение похоже

Ссылка на комментарий
  • 0

Не понимаю жизненный цикл формы при вызове ее из события таймера...
В диалоговой форме есть кнопка с кодом  Close();
При таком вызове этой диалоговой формы из главной формы и затем ее закрытия я вижу ShowMessage(L"Закрыли"); один раз и форма закрывается.
Все четко работает.

#include "UnitDialog.h"
void __fastcall TForm1::CreateMyDialog(String MES)
{
	FormDialog = new TFormDialog(0);
	FormDialog->Text1->Text = MES;
	FormDialog->ShowModal();
	delete FormDialog;
	FormDialog = NULL;
	Application->ProcessMessages();
	ShowMessage(L"Закрыли");
}

void __fastcall TForm1::Button6Click(TObject *Sender)
{
 TDateTime DataInLogTable = Now();
 String FormatDATA = FormatDateTime("dd-mm-yyyy", DataInLogTable);
 String MES = L"Привет " + FormatDATA + L" мой свет :)";

 CreateMyDialog(MES);
}

Если написать так как ниже, то чтобы закрыть форму мне надо два раза нажать на ней кнопкой и соответственно я два раза вижу ShowMessage(L"Закрыли");
Почему и где ошибка? Как создать форму из таймера и чтобы она отработала один раз?

#include "UnitDialog.h"
void __fastcall TForm1::CreateMyDialog(String MES)
{
	FormDialog = new TFormDialog(0);
	FormDialog->Text1->Text = MES;
	FormDialog->ShowModal();
	delete FormDialog;
	FormDialog = NULL;
	Application->ProcessMessages();
	ShowMessage(L"Закрыли");
}

__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
 //запускаем таймер, период 1 секунда  
 TimerStart->Enabled = true;
}

void __fastcall TForm1::TimerStartTimer(TObject *Sender)
{
 //сразу отключам таймер чтобы CreateMyDialog(MES) вызвалось только один раз!
 TimerStart->Enabled = false;
 TDateTime DataInLogTable = Now();
 String FormatDATA = FormatDateTime("dd-mm-yyyy", DataInLogTable);
 String MES = L"Привет " + FormatDATA + L" мой свет :)";

 CreateMyDialog(MES);

}

 

Изменено пользователем Kitty
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...