Yorumları: 174
Konuları: 21
Kayıt Tarihi: 19-06-2020
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 534 Acemi
10-07-2020, Saat: 13:59
(Son Düzenleme: 10-07-2020, Saat: 14:00, Düzenleyen: hayalyilmaz43.)
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.
Yorumları: 1.313
Konuları: 111
Kayıt Tarihi: 01-07-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 6.983 Üstad
10-07-2020, Saat: 16:30
(Son Düzenleme: 10-07-2020, Saat: 16:41, Düzenleyen: Halil Han BADEM.)
(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
Yorumları: 174
Konuları: 21
Kayıt Tarihi: 19-06-2020
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 534 Acemi
10-07-2020, Saat: 16:35
(Son Düzenleme: 10-07-2020, Saat: 16:41, Düzenleyen: hayalyilmaz43.)
(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
Yorumları: 1.313
Konuları: 111
Kayıt Tarihi: 01-07-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 6.983 Üstad
10-07-2020, Saat: 16:45
(Son Düzenleme: 10-07-2020, Saat: 16:46, Düzenleyen: Halil Han BADEM.)
(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.
Yorumları: 174
Konuları: 21
Kayıt Tarihi: 19-06-2020
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 534 Acemi
10-07-2020, Saat: 16:56
(Son Düzenleme: 10-07-2020, Saat: 16:57, Düzenleyen: hayalyilmaz43.)
(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ü.
Yorumları: 1.668
Konuları: 20
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 19.064 Üstad
Şöyle bir akış işinizi görecektir.
Topu taca atarak bir dener misiniz...
TThread.Queue(nil,
procedure
begin
Self.DisposeOf;
end);
Saygılarımla
Muharrem ARMAN
Yorumları: 174
Konuları: 21
Kayıt Tarihi: 19-06-2020
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 534 Acemi
(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...
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.
Yorumları: 1.668
Konuları: 20
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 19.064 Üstad
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
Yorumları: 174
Konuları: 21
Kayıt Tarihi: 19-06-2020
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 534 Acemi
10-07-2020, Saat: 17:28
(Son Düzenleme: 10-07-2020, Saat: 17:28, Düzenleyen: hayalyilmaz43.)
(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.
Yorumları: 1.668
Konuları: 20
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 19.064 Üstad
10-07-2020, Saat: 17:46
(Son Düzenleme: 10-07-2020, Saat: 17:48, Düzenleyen: mrmarman.)
@ 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
|