Arsip: create(self) ato create(application)

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,,,,
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...

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

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;

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
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
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)...

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

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

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
reply |
Report Obsolete
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
Last Articles
Last Topic
- PascalTalk #6: (Podcast) Kuliah IT di luar negeri, susah gak sih?
by LuriDarmawan in Tutorial & Community Project more 4 years ago - PascalTalk #5: UX: Research, Design and Engineer
by LuriDarmawan in Tutorial & Community Project more 4 years ago - PascalTalk #4: Obrolan Ringan Seputar IT
by LuriDarmawan in Tutorial & Community Project more 4 years ago - PascalTalk #2: Membuat Sendiri SMART HOME
by LuriDarmawan in Tutorial & Community Project more 4 years ago - PascalTalk #3: RADically Fast and Easy Mobile Apps Development with Delphi
by LuriDarmawan in Tutorial & Community Project more 4 years ago - PascalTalk #1: Pemanfaatan Artificial Intelligence di Masa Covid-19
by LuriDarmawan in Tutorial & Community Project more 4 years ago - Tempat Latihan Posting
by LuriDarmawan in OOT more 5 years ago - Archive
- Looping lagi...
by idhiel in Hal umum tentang Pascal Indonesia more 12 years ago - [ask] koneksi ke ODBC user Dsn saat runtime dengan ado
by halimanh in FireBird more 12 years ago - Validasi menggunakan data tanggal
by mas_kofa in Hal umum tentang Pascal Indonesia more 12 years ago
Random Topic
- Mau Nanya!!
by gusk in Hal umum tentang Pascal Indonesia more 17 years ago - Membuat Hak akses user multi form
by onsir in Hal umum tentang Pascal Indonesia more 17 years ago - TOLO....ng konfersi dari image ke biner menggunakan delphi..
by sketsa in Multimedia & Graphic Enhancement more 17 years ago - komunikasi dengan IE
by mat_koder in Web Programming more 16 years ago - nge-set date
by nurez in Hal umum tentang Pascal Indonesia more 17 years ago - fungsi Mean
by joni.new in Tip n Trik Pemrograman more 16 years ago - inisial folder
by strike_set in Enginering more 18 years ago - sms gateway informasi nilai
by r_rie in Tip n Trik Pemrograman more 15 years ago - Menggunakan inpout32.dll Untuk Port Paralel
by umarbakri in Hal umum tentang Pascal Indonesia more 18 years ago - Komponen Stringgrid/Listview multi select
by supermuam in Tip n Trik Pemrograman more 16 years ago