Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
FMX Android FormX.DisposeOf Exception
#1
merhaba

ekdeki demo neden windows da exception vermezken android de exception veriyor olabilir?

form2 button click ile kapanırken exception oluşuyor, nasıl çözebilirim


autocreated formlardan form2 çıkarttım


form1
unit Unit1;

interface

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

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

var
 Form1: TForm1;

implementation

{$R *.fmx}

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
if form2=nil then
begin
 form2:=tform2.Create(Application);
end;

form2.Show;
end;

end.

form2
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.Controls.Presentation, FMX.StdCtrls;

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

var
 Form2: TForm2;

implementation

{$R *.fmx}

procedure TForm2.FormHide(Sender: TObject);
begin
form2.DisposeOf;
form2:=Nil;
end;

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

end.
Cevapla
#2
(10-07-2020, Saat: 13:59)hayalyilmaz43 Adlı Kullanıcıdan Alıntı: merhaba

ekdeki demo neden windows da exception vermezken android de exception veriyor olabilir?

form2 button click ile kapanırken exception oluşuyor, nasıl çözebilirim


autocreated formlardan form2 çıkarttım


form1
unit Unit1;

interface

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

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

var
 Form1: TForm1;

implementation

{$R *.fmx}

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
if form2=nil then
begin
 form2:=tform2.Create(Application);
end;

form2.Show;
end;

end.

form2
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.Controls.Presentation, FMX.StdCtrls;

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

var
 Form2: TForm2;

implementation

{$R *.fmx}

procedure TForm2.FormHide(Sender: TObject);
begin
form2.DisposeOf;
form2:=Nil;
end;

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

end.

DisposeOf yerine Free kullanın.
Sorununuz düzelecektir.
Hata almanızın sebebi; DCCIOS32, DCCIOSARM derleyicilerde (mobil için kısaca) DisposeOf çalışma prensibinin farklı olması. Masaüstünde Free methoduna benzer bir prensip ile çalışırken, mobilde bu işi Free ile Automatic Reference Counting (Otomatik Referans Sayımı) yapmaktadır.

Bkz.
 http://docwiki.embarcadero.com/Libraries....DisposeOf
 http://docwiki.embarcadero.com/RADStudio..._Compilers
kisisel_logo_dark.png
WWW
Cevapla
#3
(10-07-2020, Saat: 16:30)Halil Han Badem Adlı Kullanıcıdan Alıntı:
(10-07-2020, Saat: 13:59)hayalyilmaz43 Adlı Kullanıcıdan Alıntı: merhaba

ekdeki demo neden windows da exception vermezken android de exception veriyor olabilir?

form2 button click ile kapanırken exception oluşuyor, nasıl çözebilirim


autocreated formlardan form2 çıkarttım


form1
unit Unit1;

interface

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

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

var
 Form1: TForm1;

implementation

{$R *.fmx}

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
if form2=nil then
begin
 form2:=tform2.Create(Application);
end;

form2.Show;
end;

end.

form2
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.Controls.Presentation, FMX.StdCtrls;

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

var
 Form2: TForm2;

implementation

{$R *.fmx}

procedure TForm2.FormHide(Sender: TObject);
begin
form2.DisposeOf;
form2:=Nil;
end;

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

end.

DisposeOf yerine Free kullanın.
Sorununuz düzelecektir.

cevabınız için teşekkürler, ancak ihtiyacımı karşılamıyor.

forma 10 tane 1mb lık jpg yüklü timage nesnesini ekleyin ve free den sonra taskmanager dan kullanılan bellek miktarına bakın,
sizin önerdiğiniz yol ile form 20 30 kez açıldıkdan sonra app crashlıyor malesef. genelde out of memory dialoğu görüntüleniyor.
cihaz telefon ram belliğinin limiti ile değişebilir tabi bu 20 30 kez kapatıp açma formu

disposeof kullanılmalı ancak exception u gizleyemedim
Cevapla
#4
(10-07-2020, Saat: 16:35)hayalyilmaz43 Adlı Kullanıcıdan Alıntı:
(10-07-2020, Saat: 16:30)Halil Han Badem Adlı Kullanıcıdan Alıntı: DisposeOf yerine Free kullanın.
Sorununuz düzelecektir.

cevabınız için teşekkürler, ancak ihtiyacımı karşılamıyor.

forma 10 tane 1mb lık jpg yüklü timage nesnesini ekleyin ve free den sonra taskmanager dan kullanılan bellek miktarına bakın,
sizin önerdiğiniz yol ile form 20 30 kez açıldıkdan sonra app crashlıyor malesef. genelde out of memory dialoğu görüntüleniyor.
cihaz telefon ram belliğinin limiti ile değişebilir tabi bu 20 30 kez kapatıp açma formu

disposeof kullanılmalı ancak exception u gizleyemedim

unit Unit1;

interface

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

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

var
 Form1: TForm1;

implementation

{$R *.fmx}

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
if not Assigned(Form2) then
begin
 form2:=tform2.Create(Application);
end;

form2.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.Controls.Presentation, FMX.StdCtrls;

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

var
 Form2: TForm2;

implementation

{$R *.fmx}

procedure TForm2.FormHide(Sender: TObject);
begin
Form2.Free;
form2:=Nil;
end;

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

end.


2GB ram miktarına sahip olan telefonumda denedim. 30 değil 40 değil tam 70 defa bastım ve herhangi bir hata almadım üstteki kodlar ile. Örneğimi test ederek tekrar deneyiniz.
kisisel_logo_dark.png
WWW
Cevapla
#5
(10-07-2020, Saat: 16:45)Halil Han Badem Adlı Kullanıcıdan Alıntı:
(10-07-2020, Saat: 16:35)hayalyilmaz43 Adlı Kullanıcıdan Alıntı: cevabınız için teşekkürler, ancak ihtiyacımı karşılamıyor.

forma 10 tane 1mb lık jpg yüklü timage nesnesini ekleyin ve free den sonra taskmanager dan kullanılan bellek miktarına bakın,
sizin önerdiğiniz yol ile form 20 30 kez açıldıkdan sonra app crashlıyor malesef. genelde out of memory dialoğu görüntüleniyor.
cihaz telefon ram belliğinin limiti ile değişebilir tabi bu 20 30 kez kapatıp açma formu

disposeof kullanılmalı ancak exception u gizleyemedim

unit Unit1;

interface

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

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

var
 Form1: TForm1;

implementation

{$R *.fmx}

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
if not Assigned(Form2) then
begin
 form2:=tform2.Create(Application);
end;

form2.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.Controls.Presentation, FMX.StdCtrls;

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

var
 Form2: TForm2;

implementation

{$R *.fmx}

procedure TForm2.FormHide(Sender: TObject);
begin
Form2.Free;
form2:=Nil;
end;

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

end.


2GB ram miktarına sahip olan telefonumda denedim. 30 değil 40 değil tam 70 defa bastım ve herhangi bir hata almadım üstteki kodlar ile. Örneğimi test ederek tekrar deneyiniz.

her clickden sonra kalan bellek durumuna bakıyorum görev listesinden şu menü tuşuna basılınca açılandan
ve sürekli kalan ram miktarı düşüyor.

video atabilirim isterseniz.

form.close ->  Action := TCloseAction.caFree;

ile test ediyorum şuan,

not: benim form2 imde demoda olmayan 20 30 kadar timage var ve her birinde 1mblık jpg yüklü.
Cevapla
#6
Şöyle bir akış işinizi görecektir.

Topu taca atarak bir dener misiniz... Idea Exclamation

   TThread.Queue(nil,
   procedure
   begin
     Self.DisposeOf;
   end);
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#7
(10-07-2020, Saat: 17:00)mrmarman Adlı Kullanıcıdan Alıntı: Şöyle bir akış işinizi görecektir.

Topu taca atarak bir dener misiniz... Idea Exclamation

   TThread.Queue(nil,
   procedure
   begin
     Self.DisposeOf;
   end);

cevap için teşekkürler,

şöyle bir durum oluşuyor gibi, button1 in android efekti şu dalga efekti fmx.controls den sonra form dispose edildiğinden ötürü
exception yaratıyor.
Cevapla
#8
Direkt kendini değil de main thread'e sıraya koyan bir komut ile ana form focus olunca thread free eder mi diye düşündüm.

Şu an sahadayım, bilgisayar başına geçince bir de ben denemek isterim.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#9
(10-07-2020, Saat: 17:06)mrmarman Adlı Kullanıcıdan Alıntı: Direkt kendini değil de main thread'e sıraya koyan bir komut ile ana form focus olunca thread free eder mi diye düşündüm.

Şu an sahadayım, bilgisayar başına geçince bir de ben denemek isterim.

peki ana form yok ise değişiyorsa, sürekli yeni dynamic formlar yaratılıyorsa, mesela
tiktok adlı programda profilden profile geçiliyor ve geri tuşuna basılınca bir önceki profil ekranı
scoll ları bıraktığınız konumu ile birlikde geri geliyor, yani aslında sürekli dynamic form yaratılıyor,
taki cihaz belleği bu açık formlarla tükenene kadar.

diğer türlü statik formlar autocreate ile yaratılanlar, çok fazla cihaz belliği tüketirler ise
yeni bir form u show yaptığınız an outofmemory veya direk crash,

basit bellek tüketmeyen formlarla uğraşıldığı için bu durum göz ardı ediliyor.
Cevapla
#10
@hayalyilmaz43

"Ana form yoksa" derken üstadım ? Anlayamadım. 

* Önerim basit Thread Quene idi. Yani procedure kendini yok edemiyorsan, içerisinden bir çağrı yap. Yapılan çağrı bekletici olmayacak, pocedure sona erecek, akışı ana form devralacak ve free işlemini gerçekleştirecek. 

* Burada denemek isteyeceğiniz çözüm sadece "SELF" yerine "FORM2" yazmak olacaktır.

Ana form dediğimiz main thread ( Application Process )  Bir form açılır diğerleri onun üzerine Layout gibi gelir gider.

TikTok'da dinamik form yarattığını değerlendirdiğiniz şey sakın TLayout veya TScaledLayout olmasın ? Nasıl ayırt edebiliyorsunuz ?

Bir TLayout dinamik olarak create edilebilir, üzerindeki bileşenler de... Kompleks bir durum varsa form oluşturur, işi bitince ana form yakasında free edilir.

Senaryo size ait zaten "ya yoksa" diye bir şey sizin hayal gücünüz ile sınırlı bir yaklaşım. Siz sınırsız sayıda form izlenimi verdirecek şekilde Layout1 .... Layout(n) şeklinde layout'lar dizisi şekilde de yürütebilirsiniz.

Deneyiminiz ile gördüğünüz üzere MODAL bir düşünce Android platformunda mevcut değil.

Yani durdurucu / bekletici bir unsur mantığı yer almıyor. Bunu siz  ne kullanıyorsanız readonly/bloke ederek kullanıcıyı diğer kontrollere sevk ediyorsunuz, ya da tersi, kullanıcı kendi iradesi ile neye odaklanırsa proje kendisini ona göre adapte ediyor.

Size yardımcı olmaya çalıştığım konu, takıldığınız noktaya ilişkin aklımdaki çözüm idi.
Başka bir soru ile sanki tek çözüm buymuş gibi yargıya lüzum yok. İşinize yaramadıysa "çözüm öneriniz çözüm üretmedi" demeniz yeterli.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
Exclamation Delphi 12 - Android 14 nevez 22 638 26-04-2024, Saat: 22:54
Son Yorum: nevez
  Android Rehbere Kayıt Ekleme barissagir 6 352 04-04-2024, Saat: 09:36
Son Yorum: RAD Coder
  Android’de Dosya Depolama ve Paylaşma-2: And 11 SDK 30 Scoped Storage SAF MediaStore emozgun 12 4.995 19-03-2024, Saat: 22:29
Son Yorum: nguzeller
  Android 33 api sdk güncelleme [ÇÖZÜLDÜ] codder71 4 455 19-02-2024, Saat: 22:38
Son Yorum: codder71
  Mobil Android Emulator Altıner 5 435 22-01-2024, Saat: 18:28
Son Yorum: Altıner



Konuyu Okuyanlar: 1 Ziyaretçi