Komponen Delphi Mekanisme Baca dan Tulis (I)
1. Pengantar Objek Streaming (Streams) dan Objek Baca-Write (Filers)
Dalam pemrograman yang berorientasi objek, manajemen data berbasis objek menempati posisi yang sangat penting. Di Delphi, metode dukungan manajemen data berbasis objek adalah salah satu fitur utamanya.
Delphi adalah lingkungan pengembangan terintegrasi yang menggabungkan desain visual yang berorientasi objek dengan bahasa yang berorientasi objek. Inti dari Delphi adalah komponen. Komponen adalah jenis objek. Aplikasi Delphi sepenuhnya dibangun oleh komponen, sehingga mengembangkan aplikasi Delphi berkinerja tinggi pasti akan melibatkan teknologi manajemen data berbasis objek.
Manajemen data berbasis objek mencakup dua aspek:
● Gunakan objek untuk mengelola data
● Manajemen berbagai objek data (termasuk objek dan komponen)
Delphi Atribut Kelas Manajemen Data Berbasis Objek untuk Streaming Objek (Stream) dan Objek Filer (Filer), dan menerapkannya pada semua aspek dari Pustaka Kelas Komponen Visual (VCL). Mereka menyediakan fungsi yang kaya untuk mengelola objek dalam memori, memori eksternal, dan sumber daya Windows.
Objek Stream, juga dikenal sebagai Objek Streaming, adalah istilah umum untuk TStream, ThandleStream, Tfilestream, TMemoryStream, Tresourcestream dan Tblobstream. Mereka mewakili kemampuan untuk menyimpan data di berbagai media, abstrak operasi manajemen dari berbagai tipe data (termasuk objek dan komponen) dalam memori, out-of-memory, dan bidang basis data ke dalam metode objek, dan memanfaatkan sepenuhnya keunggulan teknologi yang berorientasi objek yang berorientasi objek objek Dari ini, aplikasi dapat menyalin data dalam berbagai objek aliran dengan cukup mudah.
Baca dan tulis objek (pelapor) termasuk objek tfiler, objek treader dan objek twriter. Objek Tfiler adalah objek dasar untuk membaca dan menulis file, dan penggunaan utama treader dan twriter dalam aplikasi. Baik objek Treader dan Twriter diwarisi langsung dari objek tfiler. Objek Tfiler mendefinisikan sifat dasar dan metode objek filer.
Objek filer terutama melakukan dua fungsi utama:
● Akses file dan komponen formulir dalam file formulir
● Menyediakan buffering data untuk mempercepat operasi membaca dan menulis data
Untuk memiliki pemahaman perseptual tentang objek streaming dan membaca dan menulis objek, mari kita lihat contoh pertama.
a) Tulis file
Prosedur TFOMR1.Writedata (pengirim: Tobject);
Var
FileStream: tfilestream;
MyWriter: Twriter;
I: Integer
Mulai
FileStream: = tfileStream.create ('c: /test.txt',fmopenwrite); // Buat objek aliran file file
MyWriter: = Twriter.Create (FileStream, 1024);
MyWriter.WriteListBegin; // Daftar Tulis Bendera Mulai
Untuk i: = 0 ke memo1.lines.count-1 do
MyWriter.WriteString (memo1.lines [i]); // Simpan informasi teks dari komponen memo ke dalam file
MyWriter.WriteListend;
Filestream.seek (0, sofrombeginning);
MyWriter.Free; // Rilis MyWriter Object
FileStream.Free; // Lepaskan Objek FileStream
Akhir;
b) Baca file
Prosedur TFORM1.READDATA (Pengirim: Tobject);
Var
FileStream: tfilestream;
MyReader: Treader;
Mulai
Filestream: = tfilestream.create ('c: /test.txt',fmopenread);
MyReader: = trreader.create (FileStream, 1024);
Myreader.readlistbegin;
Memo1.lines.clear;
Shoy Not Myreader.endoflist Do // Catatan Metode Treader: Endoflist
Mulai
Memo1.lines.add (myreader.readstring);
Akhir;
Myreader.readlistend;
MyReader.Free; // Lepaskan Objek MyReader
FileStream.Free; // Lepaskan Objek FileStream
Akhir;
Dua proses di atas adalah satu untuk proses penulisan dan yang lain untuk proses membaca. Proses penulisan menggunakan twriter untuk menyimpan konten (informasi teks) dalam memo sebagai file biner yang disimpan pada disk menggunakan tfileStream. Proses membaca adalah kebalikan dari proses penulisan. Menjalankan program dapat melihat bahwa proses membaca dengan setia mengembalikan informasi yang disimpan dalam proses penulisan.
Gambar berikut menjelaskan hubungan antara objek data (termasuk objek dan komponen), objek streaming, dan objek membaca dan menulis.
Gambar (1)
Perlu dicatat bahwa objek baca dan tulis seperti objek tfiler, objek treader dan objek twriter jarang dipanggil secara langsung oleh penulis aplikasi. dan menulis mekanisme komponen.
Untuk streaming aliran objek, banyak bahan referensi diperkenalkan secara rinci, sementara bahan referensi untuk objek tfiler, objek treader dan objek twriter, terutama mekanisme baca dan penulisan komponen jarang terjadi. .
2. Objek Membaca dan Menulis (Filer) dan Mekanisme Membaca dan Menulis Komponen
Objek Filer terutama digunakan untuk mengakses file dan komponen Delphi dalam file formulir.
File DFM digunakan untuk formulir penyimpanan Delphi. Bentuk adalah inti dari pemrograman visual Delphi. Formulir sesuai dengan jendela dalam aplikasi Delphi, komponen visual dalam bentuk sesuai dengan elemen antarmuka di jendela, dan komponen non-visual seperti Timer dan Topendialog, sesuai dengan fungsi tertentu dari aplikasi Delphi. Desain aplikasi Delphi sebenarnya berpusat pada desain formulir. Oleh karena itu, file DFM juga menempati posisi yang sangat penting dalam desain aplikasi Delphi. Semua elemen dalam formulir, termasuk properti formulir sendiri, termasuk dalam file DFM.
Di jendela aplikasi Delphi, unsur -unsur antarmuka saling berhubungan dengan hubungan kepemilikan, sehingga struktur pohon adalah ekspresi yang paling alami; File DFM secara fisik disimpan dalam teks (sebelumnya disimpan sebagai file biner di Delphi2.0), dan secara logis, mereka mengatur hubungan masing -masing komponen dalam struktur pohon. Dari teks ini, Anda dapat melihat struktur pohon bentuk. Berikut adalah konten file DFM:
Objek Form1: TFORM1
Kiri = 197
Atas = 124
...
Pixelsperinch = 96
Textheight = 13
Button Object1: Tbutton
Kiri = 272
...
Keterangan = 'tombol1'
Taborder = 0
akhir
Panel objek1: tpanel
Kiri = 120
...
Keterangan = 'Panel1'
Taborder = 1
Object Checkbox1: TCheckBox
Kiri = 104
...
Caption = 'Checkbox1'
Taborder = 0
akhir
akhir
akhir
File DFM ini dihasilkan oleh TWRITER melalui aliran objek streaming. .
Saat program mulai berjalan, Treader membaca formulir dan komponen melalui aliran objek aliran, karena ketika Delphi mengkompilasi program, ia menggunakan instruksi kompilasi {$ r *.dfm} untuk mengkompilasi informasi file DFM ke dalam file yang dapat dieksekusi menggunakan kompilasi Instruksi {$ r *.dfm}.
Treader dan Twriter tidak hanya dapat membaca dan menulis sebagian besar tipe data standar di objek Pascal, tetapi juga membaca dan menulis tipe canggih seperti daftar dan varian, dan bahkan membaca dan menulis perperties dan komponen. Namun, Treader dan Twriter sendiri sebenarnya menyediakan fungsi yang sangat terbatas, dan sebagian besar pekerjaan aktual dilakukan oleh TSTREAM, kelas yang sangat kuat. Dengan kata lain, Treader dan Twriter sebenarnya hanya alat, yang hanya bertanggung jawab untuk cara membaca dan menulis komponen.
Karena Tfiler adalah kelas nenek moyang Public dari Treader dan Twriter, untuk memahami Treader dan Twriter, mulailah dengan Tfiler.
Tfiler
Mari pertama -tama lihat definisi kelas tfiler:
Tfiler = class (tobject)
Pribadi
FStream: tstream;
Fbuffer: pointer;
Fbufsize: integer;
FBUFPOS: Integer;
FBUFEND: Integer;
FROOT: TComponent;
FlookUproT: TComponent;
Fancestor: tpersistent;
Fignorechildren: boolean;
terlindung
Prosedur setRoot (nilai: tComponent);
publik
constructor create (stream: tstream; bufsize: integer);
Destructor menghancurkan;
Prosedur Defineproperty (const name: string;
Readdata: TreaderProc; Writedata: TwriterProc;
Hasdata: boolean);
Prosedur DefinebinaryProperty (const name: string;
Readdata, writedata: tStreamproc;
Hasdata: boolean);
Prosedur FlushBuffer;
Root Properti: TComponent Baca Froot Write Setroot;
Properti LookUproT: TComponent membaca Flookuproot;
Leluhur Properti: Tpersistent membaca Fancestor Write Fancestor;
Properti Ignorechildren: Boolean membaca fignorechildren menulis fignorechildren;
akhir;
Objek tfiler adalah kelas abstrak treader dan twriter, yang mendefinisikan sifat dasar dan metode yang digunakan untuk penyimpanan komponen. Ini mendefinisikan atribut root. Dibuat oleh Objek Stream. Oleh karena itu, selama media yang dapat diakses ke objek stream, komponen dapat diakses oleh objek filer.
Objek Tfiler juga menyediakan dua metode publik yang mendefinisikan properti: DefinEproperty dan DefinebinaryProperty, yang memungkinkan objek untuk membaca dan menulis properti yang tidak ditentukan di bagian komponen yang dipublikasikan. Mari kita fokus pada dua metode di bawah ini.
Metode DefinEproperty () digunakan untuk mempertahankan tipe data standar seperti string, bilangan bulat, boolean, karakter, titik mengambang, dan enum.
Dalam metode DefinEproperty. Parameter nama menentukan nama atribut yang harus ditulis ke file DFM, yang tidak didefinisikan di bagian kelas yang diterbitkan.
Parameter readata dan writedata menentukan metode untuk membaca dan menulis data yang diperlukan saat mengakses objek. Jenis -jenis parameter readdata dan parameter writedata masing -masing adalah TreaderProc dan TwriterProc. Kedua jenis ini dinyatakan seperti ini:
TreaderProc = Prosedur (Pembaca: Treader) Objek;
TwriterProc = Prosedur (Penulis: Twriter) Objek;
Parameter HasData menentukan apakah properti memiliki data yang akan disimpan saat runtime.
Metode DefinebinaryProperty memiliki banyak kesamaan dengan DefinEproperty.
Mari kita jelaskan penggunaan kedua metode ini di bawah ini.
Kami meletakkan komponen non-visual seperti timer pada formulir. ?
Buka file DFM dari formulir ini dan Anda dapat melihat beberapa baris yang mirip dengan yang berikut:
Object Timer1: timer
Kiri = 184
TOP = 149
akhir
Sistem streaming Delphi hanya dapat menyimpan data yang dipublikasikan, tetapi Ttimer tidak menerbitkan atribut kiri dan atas, jadi bagaimana data ini disimpan?
Ttimer adalah kelas tcomponent yang diturunkan.
Prosedur tComponent.DefineproPerties (filer: tfiler);
var
Leluhur: tcomponent;
Info: longint;
Mulai
Info: = 0;
Leluhur: = tcomponent (filer.ancestor);
jika leluhur <> nil maka info: = leluhur.fdesignInfo;
Filer.defineproperty ('kiri', reactleft, writeleft,
Longrec (fdesignInfo) .lo <> longrec (info) .lo);
Filer.defineproperty ('atas', readtop, writeTop,
Longrec (fdesignInfo) .hi <> longrec (info) .Hi);
akhir;
DefineproPerties TComponent adalah metode virtual yang menimpa kelas leluhurnya, dan di kelas tpersistent, metode ini adalah metode virtual yang kosong.
Dalam metode DefinEproperties, kita dapat melihat bahwa ada objek filer sebagai parameternya. nilai. Ini menyebut metode definisi TFILER dan mendefinisikan Readleft, Writeleft, Readtop, Metode WriteTop untuk membaca dan menulis properti kiri dan atas.
Oleh karena itu, komponen apa pun yang berasal dari tcomponent, bahkan jika tidak memiliki atribut kiri dan atas, akan memiliki dua properti tersebut saat streaming ke file DFM.
Dalam proses mencari data, ditemukan bahwa beberapa data melibatkan mekanisme membaca dan menulis komponen. Karena proses penulisan komponen diselesaikan oleh IDE Delphi selama tahap desain, ia tidak dapat dilacak untuk proses berjalannya. Oleh karena itu, penulis memahami mekanisme pembacaan komponen dengan melacak kode VCL asli selama operasi program, dan menganalisis mekanisme penulisan komponen melalui mekanisme pembacaan dan twriter. Oleh karena itu, berikut ini akan menjelaskan mekanisme pembacaan dan penulisan komponen sesuai dengan proses pemikiran ini, pertama -tama berbicara tentang Treader, dan kemudian twriter.
Treader
Pertama -tama lihat file proyek Delphi dan Anda akan menemukan beberapa baris kode seperti ini:
Mulai
application.Initialize;
Application.createForm (tform1, form1);
Application.run;
akhir.
Ini adalah pintu masuk ke program Delphi. Sederhananya baris kode ini: Aplikasi. Izin melakukan beberapa pekerjaan inisialisasi yang diperlukan pada awal menjalankan aplikasi. .
Yang paling kita pedulikan sekarang adalah kalimat membuat formulir. Bagaimana bentuk dan komponen pada formulir dibuat? Seperti yang disebutkan sebelumnya: semua komponen dalam bentuk, termasuk properti formulir itu sendiri, termasuk dalam file DFM. Ketika Delphi mengkompilasi program, ia menggunakan perintah kompilasi {$ r *.dfm} untuk mengkompilasi informasi file DFM. ke dalam file yang dapat dieksekusi. Oleh karena itu, dapat disimpulkan bahwa saat membuat formulir, Anda perlu membaca informasi DFM.
Dengan mengikuti program langkah demi langkah, Anda dapat menemukan bahwa program memanggil metode ReadRootComponent dari Treader selama pembuatan formulir. Tujuan dari metode ini adalah untuk membaca komponen root dan semua komponen yang dimilikinya. Mari kita lihat implementasi metode ini:
function treader.readrootComponent (root: tComponent): tComponent;
...
Mulai
Bacaan;
Hasil: = nil;
Globalnamespace.Beginwrite;
mencoba
mencoba
ReadPrefix (Flags, I);
Jika root = nil maka
Mulai
Hasil: = TComponentClass (FindClass (ReadStr)). Buat (nil);
Result.name: = readstr;
akhir yang lain
Mulai
Hasil: = root;
Readstr; {abaikan nama kelas}
Jika csdesigning in result .ponentstate maka
Readstr lagi
Mulai
Termasuk (result.fComponentState, csloading);
Termasuk (result.fComponentState, csreading);
Result.name: = findUliquename (readstr);
akhir;
akhir;
FROOT: = Hasil;
Ffinder: = tclassfinder.create (tpersistentclass (result.clasStype), true);
mencoba
Flookuproot: = hasil;
G: = GlobalLoaded;
Jika G <> nil maka
Floaded: = g lain
Floaded: = tlist.create;
mencoba
Jika Floaded.indexof (Froot) <0 lalu
Floaded.add (froot);
Fowner: = Froot;
Sertakan (froot.fComponentState, csloading);
Sertakan (Froot.FComponentState, Csreading);
Froot.readstate (self);
Mengecualikan (froot.fComponentState, csreading);
Jika g = nil maka
untuk i: = 0 untuk floaded.count - 1 do tComponent (floaded [i]). dimuat;
Akhirnya
jika g = nil maka floaded. bebas;
Floaded: = nil;
akhir;
Akhirnya
Ffinder.free;
akhir;
...
Akhirnya
Globalnamespace.endwrite;
akhir;
akhir;
ReadRootComponent Panggilan Pertama ReadSignature Untuk Membaca Tag Objek Filer ('TPF0'). Mendeteksi tag sebelum memuat objek dapat mencegah kelalaian dan pembacaan data yang tidak efektif atau ketinggalan zaman.
Mari kita lihat ReadPrefix (Flags, I). Ketika objek tulis menulis komponen ke aliran, prewrites dua nilai di depan komponen Nilai kedua menunjukkan urutan yang dibuat dalam bentuk leluhur.
Kemudian, jika parameter root adalah nol, komponen baru dibuat dengan nama kelas dibacakan oleh readstr, dan properti nama komponen dibaca dari aliran; .
Froot.readstate (self);
Ini adalah kalimat yang sangat kritis. Meskipun metode ReadState ini adalah metode tComponent, pelacakan lebih lanjut dapat ditemukan bahwa ia akhirnya menemukan metode ReadDatainner dari Treader.
Prosedur Treader.readDatainner (instance: tComponent);
var
OldParent, Oldowner: TComponent;
Mulai
Meskipun tidak endoflist melakukan readproperty (instance);
Readlistend;
OldParent: = Parent;
Pemilik tua: = pemilik;
Induk: = instance.getChildparent;
mencoba
Pemilik: = instance.getChildOwner;
Jika tidak ditugaskan (pemilik) maka pemilik: = root;
Meskipun bukan endoflist do readComponent (nil);
Readlistend;
Akhirnya
Orangtua: = OldParent;
Pemilik: = pemilik lama;
akhir;
akhir;
Ada baris kode ini:
Meskipun tidak endoflist melakukan readproperty (instance);
Ini digunakan untuk membaca sifat-sifat komponen root. Untuk dua properti yang berbeda ini, harus ada dua metode membaca yang berbeda.
Prosedur Treader.readproperty (Ainstance: tpersistent);
...
Mulai
...
PropInfo: = getPropInfo (instance.classsinfo, fpropname);
Jika propinfo <> nil maka readPropValue (instance, propInfo) lain
Mulai
{Tidak dapat dengan andal pulih dari kesalahan dalam properti yang ditentukan}
FcanHandleExcepts: = false;
Instance.defineproPerties (self);
FcanHandleExcepts: = true;
Jika FPropName <> '' lalu
PropertyError (FPropName);
akhir;
...
akhir;
Untuk menghemat ruang, beberapa kode telah dihilangkan.
PropInfo: = getPropInfo (instance.classsinfo, fpropname);
Kode ini adalah untuk mendapatkan informasi dari fpropname properti yang diterbitkan. Dari kode berikut, kita dapat melihat bahwa jika informasi atribut tidak kosong, nilai atribut dibaca melalui metode ReadPropValue, dan metode ReadPropValue membaca nilai atribut melalui fungsi RTTI, yang tidak akan diperkenalkan secara rinci di sini. Jika informasi atribut kosong, itu berarti bahwa atribut FPropName tidak dipublikasikan, dan harus dibaca melalui mekanisme lain. Ini adalah metode definisi definisi yang disebutkan di atas, sebagai berikut:
Instance.defineproPerties (self);
Metode ini sebenarnya menyebut metode Treader DefinEproperty:
Prosedur Treader.defineproperty (nama const: string;
Readdata: TreaderProc; Writedata: TwriterProc;
Mulai
Jika SameText (Name, FPropName) dan Ditugaskan (ReadData) maka
Mulai
Readdata (self);
Fpropname: = '';
akhir;
akhir;
Ini pertama -tama membandingkan apakah nama atribut baca sama dengan nama atribut preset.
OK, komponen root telah dibaca, dan langkah selanjutnya adalah membaca komponen yang dimiliki oleh komponen root. Mari kita lihat metode ini lagi:
Prosedur Treader.readDatainner (instance: tComponent);
Ada kode yang mengikuti metode ini:
Meskipun bukan endoflist do readComponent (nil);
Inilah yang digunakan untuk membaca komponen anak. Mekanisme pembacaan komponen anak sama dengan pembacaan komponen akar yang diperkenalkan di atas, yang merupakan traversal yang dalam dari pohon.
Sejauh ini, mekanisme pembacaan komponen telah diperkenalkan.
Mari kita lihat mekanisme penulisan komponen. Ketika kami menambahkan komponen ke formulir, properti terkaitnya akan disimpan dalam file DFM, dan proses ini dilakukan oleh Twriter.
Ø Twriter
Objek Twriter adalah objek filer yang dapat disertai yang menulis data ke dalam aliran. Objek Twriter diwarisi langsung dari tfiler.
Objek Twriter menyediakan banyak metode untuk menulis berbagai jenis data ke dalam aliran. Oleh karena itu, untuk menguasai metode implementasi dan aplikasi objek twriter, Anda harus memahami format objek penulis yang menyimpan data.
Hal pertama yang perlu diperhatikan adalah bahwa setiap aliran objek filer berisi tag objek filer. Tag ini memakan empat byte dan nilainya adalah "TPF0". Objek Filer mengakses tag untuk Writegnature dan metode bacaan. Tag ini terutama digunakan untuk memandu operasi membaca ketika objek pembaca membaca data (komponen, dll.).
Kedua, objek penulis harus meninggalkan bit byte bit sebelum menyimpan data untuk menunjukkan jenis data apa yang disimpan nanti. Byte ini adalah nilai tipe TValuetype. TValuetype adalah jenis enum yang menempati ruang satu byte, dan definisinya adalah sebagai berikut:
Tvaluetype = (vanull, valist, vaint8, vaint16, vaint32, vaentended, vastring, vaident,
Vafalse, vatrue, vabinary, vaset, valstring, vanil, visollection);
Oleh karena itu, dalam implementasi setiap metode penulisan data dari objek penulis, Anda harus terlebih dahulu menulis bit flag dan kemudian menulis data yang sesuai; dan setiap metode pembacaan data dari objek pembaca harus terlebih dahulu membaca bit flag untuk menilai jika memenuhi Data Membaca. Logo valist memiliki tujuan khusus. Oleh karena itu, saat menulis beberapa item identik berturut -turut dalam objek penulis, pertama -tama gunakan WriteListBegin untuk menulis bendera valist, dan setelah menulis item data, kemudian tulis bendera vanull; Gunakan fungsi endoflist di tengah menentukan apakah ada bendera vanull.
Mari kita lihat metode yang sangat penting untuk Twriter Writedata:
Prosedur twriter.writedata (contoh: tComponent);
...
Mulai
...
WritePrefix (Flags, fchildpos);
Jika UseQualifiedNames maka
WriteStr (getTypeData (pTypeInfo (instance.classtype.classsinfo)). UnitName + '.' + Instance.className)
kalau tidak
Writestr (instance.classname);
Writestr (instance.name);
PropertiesPosition: = Posisi;
if (fancestorlist <> nil) dan (fancestorpos <fancestorlist.count) lalu
Mulai
jika leluhur <> nil maka inc (fancestorpos);
Inc (fChildpos);
akhir;
WriteProPerties (instance);
Writelistend;
...
akhir;
Dari metode Writedata, kita dapat melihat gambaran umum menghasilkan informasi file DFM. Pertama -tama tulis bendera (awalan) di depan komponen, dan kemudian tulis nama kelas dan nama contoh. Lalu ada kalimat seperti ini:
WriteProPerties (instance);
Ini digunakan untuk menulis properti komponen. Seperti yang disebutkan sebelumnya, dalam file DFM, ada atribut yang diterbitkan dan atribut yang tidak diterbitkan. Mari kita lihat implementasi WriteProPerties:
Prosedur Twriter.WriteProPerties (Contoh: tpersistent);
...
Mulai
Count: = getTypedata (instance.classsinfo)^. Propcount;
Jika menghitung> 0 lalu
Mulai
GetMem (proplist, count * sizeof (pointer));
mencoba
GetPropInfos (instance.classsinfo, proplist);
untuk i: = 0 untuk menghitung - 1 lakukan
Mulai
Propinfo: = proplist^[i];
jika propinfo = nil maka
Merusak;
Jika isStoredProp (instance, propinfo) maka
WriteProperty (instance, propinfo);
akhir;
Akhirnya
Freemem (proplist, count * sizeof (pointer));
akhir;
akhir;
Instance.defineproPerties (self);
akhir;
Silakan lihat kode berikut:
Jika isStoredProp (instance, propinfo) maka
WriteProperty (instance, propinfo);
Fungsi ISStoredProp menentukan apakah properti perlu disimpan dengan menyimpan kualifikasi.
Setelah menyimpan properti yang diterbitkan, properti yang tidak diterbitkan harus disimpan.
Instance.defineproPerties (self);
Implementasi DefinEproperties telah disebutkan sebelumnya.
Oke, sejauh ini masih ada pertanyaan: Bagaimana komponen anak yang dimiliki oleh komponen root disimpan? Mari kita lihat metode Writedata (metode ini disebutkan sebelumnya):
Prosedur twriter.writedata (contoh: tComponent);
...
Mulai
...
Jika bukan Ignorechildren maka
mencoba
if (fancestor <> nil) dan (fancestor adalah tcomponent)
Mulai
if (fancestor adalah tcomponent) dan (csinline dalam tcomponent (fancestor) .componentState) kemudian
Frootancestor: = tComponent (fancestor);
Fancestorlist: = tlist.create;
Tcomponent (fancestor) .getchildren (addancestor, frootancestor);
akhir;
Jika csinline in instance.componentState maka
Froot: = instance;
Instance.getChildren (writeComponent, froot);
Akhirnya
Fancestorlist.free;
akhir;
akhir;
Properti Ignorechildren memungkinkan objek penulis untuk menyimpan komponen tanpa menyimpan komponen anak yang dimiliki oleh komponen tersebut. Jika properti Ignorechildren benar, objek penulis tidak menyimpan komponen anak yang dimilikinya saat menyimpan komponen. Jika tidak, subkomponen akan disimpan.
Instance.getChildren (writecomponent, froot);
Ini adalah kalimat paling kritis untuk menulis subkomponen. Dengan cara ini, apa yang kita lihat dalam file DFM adalah struktur komponen seperti pohon.