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

Как правильно добавить форму в мобильный проект?


Kitty

Вопрос

Я хочу использовать вторую форму в андроид проекте. Чтобы не расходовалась память, я хочу вызывать эту форму в момент необходимости. Мои действия:

1. Добавляю новую форму в андроид проект через File->New...

2. В опциях проекта переношу эту форму в Project->Options->Forms переношу в Avaible forms.

3. Добавляю в проект #include "Unit2.h"

4. Пишу код вызова:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 //создаем вторую форму
 TForm *Form2 = new TForm(0);//здесь надо this или лучше 0 для андроид проекта?
 Form2->Show();//здесь можно ShowModal?
 delete Form2;
 Form2 = NULL;
}

Получаю ошибку:

First chance exception at $4A1C41E9. Exception class EResNotFound with message 'Resource TForm not found'. Process ProjectForm.apk (849)

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

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

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

  • 0

Большое спасибо! Моя невнимательность.

Я так понимаю в моем коде правильнее использовать this?

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 //создаем вторую форму
 TForm *Form2 = new TForm2(this);
 Form2->Show();
 if(Form2)
   {
	delete Form2;
	Form2 = NULL;
   }
}

ShowModal не поддерживается. Правильно ли удаляю после вызова Show?

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

Не синен я в плюсах, а на Delphi делаю так

procedure TForm1.Button1Click(Sender: TObject);
var
  f: TForm2;
begin
   f := TForm2.Create( nil );
   f.Show;
   f.Free; // или f.Destroy
end;

1. В плюсах вместо nil скорее всего надо писать NULL

2. Из за использования в мобильной платформе автоматического подсчета ссылок (ARC), удалять возможно следует так

f := nil // или NULL в плюсах (без delete Form2, но тут пусть лучше разработчики скажут)
Ссылка на комментарий
  • 0

Если бы поддерживался ShowModal, то я бы считала свой код правильный. Сейчас мне не понятно как работает новая форма для мобильного приложения.

Проход по точкам останова показал, что сразу за Show вызывается мой delete, тем не менее, форма остается на экране. Я ее затем закрываю отдельной кнопкой кодом Close(). В принципе это то, что мне нужно.

Я решила пока оставить свой код как есть, наверное, он правильный.

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

Я решила пока оставить свой код как есть, наверное, он правильный.

 

Ну как он может быть правильным? После создания и отображения форма сразу уничтожается (по коду), но продолжает отображаться на экране и нормально функционировать... В голове не укладывается, это из разряда - удивительно, но факт! Ярослав, пролейте свет на этот вопрос, самому уже интересно стало. А я бы сделал так:

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, Unit2,
  FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  f: TForm2;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
   f := TForm2.Create( nil );
   f.Show;
end;

end.

unit Unit2;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls;

type
  TForm2 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.fmx}

uses
  Unit1;

procedure TForm2.Button1Click(Sender: TObject);
begin
   Close;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   f := nil;
end;

end.

То есть закрывающаяся форма сама уничтожает экземпляр объекта, связанного с ней (в момент закрытия формы мы точно знаем, что она нам больше не нужна). Это тоже не самый изящный код, но по сравнению с вашим этот мне кажется немного правильнее...

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

Да, ваш выглядит правильнее.

В С++ Builder нужен delete. Может это и не так для мобильной формы, но теперь я думаю с учетом ваших замечаний мне надо написать так:

#ifndef UnitMainFormH
#define UnitMainFormH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <FMX.Controls.hpp>
#include <FMX.Forms.hpp>
#include <FMX.StdCtrls.hpp>
#include <FMX.Types.hpp>

#include "UnitSecondForm.h"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
    TForm2 * SecondForm;
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

#include <fmx.h>
#pragma hdrstop

#include "UnitMainForm.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 //создаем вторую форму
 SecondForm = new TForm2(this);
 Form2->Show();
}

Во второй форме

#include <fmx.h>
#pragma hdrstop

#include "UnitSecondForm.h"
#include "UnitMainForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
 Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
 if(Form1->SecondForm)
	 {
	  delete Form1->SecondForm;
	  Form1->SecondForm = NULL;
     }
}
Ссылка на комментарий

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

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

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

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

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

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

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

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

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

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