Перейти к содержанию
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
Опубликовано
Цитата

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

Я просто ставлю глобальную переменную bool чтобы событие только раз отработало.

  • 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 пользователей онлайн

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