Arsip: create(self) ato create(application)

 
user image
more 17 years ago

ags606

langsung aja, buat master2 delphi aku sering buat coding seperti ini :
Query := TADOQuery.Create(application); 
na yang mau aku tanyakan bedanya antara create.(application) ama create.(self)? dimana sebenarnya letak penggunaannya dan apa pengaruhnya untuk sebuah program (maksudnya yang lebih memberatkan memory) mohon penjelasannya, secara panjang lebar, hi hi hi,,,,
user image
more 17 years ago

DelphiExpert

Parameter 'Application' menunjukkan siapa owner dari component yg dibuat tsb (TADOQuery). jika AOwner diisi, maka AOwner (Application) akan menyisipkan komponen tsb kedalam daftar child component, dimana semua child komponent akan di destroy (free) otomatis oleh AOwner apabila AOwner di destroy (free). jadi dikau tidak perlu me-release (destroy/free) komponent tsb secara manual karena sudah di handle oleh si AOwner (Application). jika parameter AOwner anda beri nilai nil, maka anda harus bertanggung-jawab me-destroy komponent yg dibuat pd saat runtime tsb (TADOQuery) jika diisi Self (TForm dimana anda bekerja saat itu) dan TApplication (Application) sama2 berbasis TComponent, dng perilaku seperti saya sebut diatas. (akan merelease child component secara otomatis). jadi bedanya cuma siapa yg take responsibility terhadap component yg dibuat tsb, apakah TApplication atau TForm... saran saya mending isi Form (Self) aja deh... tapi jika anda sering men-create dalam 1 lifecycle of TForm, sebaiknya anda me-release komponent tsb manually. hal ini ber-efek pada penggunaan memory...
user image
more 17 years ago

ags606

@DE maksudnya penjelasan yang terakhir apa? karna pada satu unit saya sering menggunakan perintah create trims sebelumnya
user image
more 17 years ago

DelphiExpert

maksud saya begini: dalam 1 life-cycle (artinya pada saat form dibuat sampai dihancurkan); ambil contoh ada sebuah Button untuk melakukan update query. selama form tersebut masih nongol (life), user bisa aja kan mencet tombol tersebut berulang2? padahal dalam button tersebut anda selalu membuat instance baru (TADOQuery) guna melakukan eksekusi query (ini hanya sebuah case saja)

procedure Form1Button1Click(Sender: TObject);
var QR: TADOQuery;
begin
  QR:= TADOQuery.Create(Application); // anda mengisyaratkan Application lah yg bertanggung jawab atas life-cycle obj tsb.
  QR.Connection:= SomeConnection;
  QR.SQL.Text:= 'some update query';
  QR.Execute;
end;
dalam kasus ini, jika setiap kali anda menekan tombol tsb, Application selalu ketambahan 1 instance TADOQuery yg harus di destroy nanti (setelah applikasi ditutup), padahal object query2 tersebut tidak pernah dipergunakan lagi. efeknya tentu pada penggunaan memory karena Application tidak akan me-destroy object tersebut begitu keluar dari block procedure Button1Click, tetapi menunggu instance Application ter destroy yakni pada saat aplikasi ditutup. mungkin saya salah tangkap aja ye... mungkin anda telah menghancurkan TADOQuery tsb dalam block procedure tersebut :mrgreen:

procedure Form1Button1Click(Sender: TObject);
var QR: TADOQuery;
begin
  QR:= TADOQuery.Create(nil); // tidak ada gunanya menyerahkan life-cycle obj tsb. pd siapapun, 
                   // hanya akan menambah overheat aja
  try
    QR.Connection:= SomeConnection;
    QR.SQL.Text:= 'some update query';
    QR.Execute;
  finally
    QR.Free;
  end;
end;
user image
more 17 years ago

ags606

@DE trims banyak atas penjelasannya yang panjang lebar, emang sih biasanya saya menghacurkan Query tsb dalam satu block procedure, misalnya :

function Simpan_Data(Kode, Nama : string; Umur : integer) : boolean;
var Query : TADOQuery;
begin
 Query := TADOQuery.create(application); //==> yang biasanya sy pake
 with Query do
 begin
    connection := dm.ADOConnection1;
   sql.add('insert into table1 values ('+Quotedstr(Kode)+', '+QuotedStr(Nama)+', '+Inttostr(Umur)+')');
   try
  execSQL;
 result := true;
  except
 result := false;
  end;
 close;
 free;
 end;
 Query := nil;
Query.free;
end;
sekali lagi trims atas penjelasannya, berarti kesimpulannya adalah lebih baik menggunakan Create(Self) untuk tidak membebani memory. trims, god blaz you
user image
more 17 years ago

cyber_hecker

function Simpan_Data(Kode, Nama : string; Umur : integer) : boolean;
var Query : TADOQuery;
begin
 Query := TADOQuery.create(application); //==> yang biasanya sy pake
 with Query do
 begin
    connection := dm.ADOConnection1;
   sql.add('insert into table1 values ('+Quotedstr(Kode)+', '+QuotedStr(Nama)+', '+Inttostr(Umur)+')');
   try
  execSQL;
 result := true;
  except
 result := false;
  end;
 close;
 free;
 end;
 Query := nil;
Query.free;
end;
kalo mbikin objek trus rencana mo kita yang membesakan memorinya sendiri, lebih baik menggunakan 'nil' sebagai parameter ownernya. karena bila tidak maka akan terjadi doble free. yaitu saat aplikasi di tutup dan free yang kamu lakukan secara manual. karena bila owner adalah 'application' maka pada saat application melakukan destory.. dia akan membaca list komponen yang jadi anaknya untuk di free. CMIIW
user image
more 17 years ago

DelphiExpert

@cyber_hecker: koreksi sedikit... tidak akan pernah ada double free, karena TComponent menggunakan konsep Notification yakni FreeNotification, dimana apabila container (child) ter-free diluar contex TComponent.DestroyComponents (saat owner di destroy), maka event notification operation (opRemove) segera dipicu, dan owner otomatis akan membuang child komponent tsb dari daftar... memang jika komponen dibuat & dihancurkan dlm 1 blok sebaiknya menggunakan nil sebagai owner. seperti saya bilang, yakni guna menghindari proses notification yg tidak perlu (less overheat)...
user image
more 17 years ago

cyber_hecker

ow.. begitu yach ?? baru tau nih. ku pikir karena terjadi 2 kali free. habis diriku selalu mengalami yang namanya ERROR ADDRESS 00000X00000 yang kayak gini dan selalu terjadi kalo udah ada berhubungan dengan create ataupun free. nah.. kira-kira kemungkinan apa aja yang bisa terjadi yang berhubungan dengan create dan free ini. berdasarkan pengalaman ku yang masih pas-pas an ini : 1. parent sudah di free, tapi child belum di free. kejadian ini banyak terjadi sewaktu dalam membuat form login. pertama modul di create (tempat nyimpan segala koneksi) trus dipanggil form login. ternyata login gak cocok dan di klik cancel. saya langsung mengarahkan perintah ke Application.Terminate; nah di sini langsung ERROR ADDRESS lagi. untuk menghindari hal ini setiap form yang sudah dibikin di free dulu secara manual. 2. mencreate 2 objek yang sama. hal ini sering terjadi bila saya memanggil form MDI. karena pada umumnya program yang saya buat sifatnya MDI. tapi walaupun MDI sebuah form hanya boleh di buat sekali. jika sudah dibuat maka cukup diperintahkan untuk BringToFront. tapi kenapa pas ngecheck.. if Form1 = nil ini tidak pernah terpenuhi kondisinya ? padahal form yang kubuat tidak autocreate... dan fungsi create belum ku kerjakan ?? yup segitu dulu, dimohon tambahannya buat nambah wawasan :D
user image
more 17 years ago

ags606

nah, gueee, semakin pusing,,,,,, bisa kita bahasakan ke yang lebih pemula,,,, @CH jika kt meng-create dengan menggunakan application sebagai ownernya, mk untuk membuangnya cukup menggunakan perintah "nil", trus kl kt mggunakan owner self membuangnya dengan free, gitu ya maksudnya? mohon penjelasannya
user image
more 17 years ago

cyber_hecker

@ags606: jika kt meng-create dengan menggunakan application sebagai ownernya, mk untuk membuangnya cukup menggunakan perintah "nil"
waduh bukan begitu maksudnya... untuk membuang atau membebaskannya semua sama menggunakan perintah FREE. tapi jika kita membuat suatu objek dan objek itu rencananya mo kita bebaskan / kita destroy sendiri, sebaiknya kita menggunakan nil sebagai owner. oh ya.. sekalian nanya.. apasih bedanya perintah RELEASE, FREE dan FREEANDNIL(). karena kalo saya lihat.. cara kerjanya sama. dan kapan cocok digunakan masing-masing perintah ini ?
more ...
  • Pages:
  • 1
Share to

AI Forward

🚀 We're thrilled to partner with Alibaba Cloud for "AI Forward - Alibaba Cloud Global Developer Summit 2025" in Jakarta! Join us and explore the future of AI. Register now: https://int.alibabacloud.com/m/1000400772/
#AlibabaCloud #DeveloperSummit #Jakarta #AIFORWARD

Local Business Directory, Search Engine Submission & SEO Tools FreeWebSubmission.com SonicRun.com