Komponen Visual sebenarnya adalah sebuah kelas. Untuk menulis sebuah kelas, Anda dapat menulisnya langsung di file *.pas. Namun untuk menulis kontrol, Anda harus menggunakan paket. Pilih Baru dari menu File untuk membuat Paket baru. Ini adalah paket yang digunakan untuk menyimpan dan menginstal kontrol. Kemudian klik tombol Tambah pada jendela Paket untuk menambahkan komponen (Unit).
Pilih Komponen Baru di bagian atas kotak dialog pop-up. Karena tidak mungkin memprogram sendiri semua properti, metode, dan kejadian suatu kontrol, Anda perlu memilih kelas leluhur (atau "kelas induk" atau "kelas dasar"), lalu menambahkan properti, metode, dan acara untuk itu. Pilih kelas leluhur yang diperlukan di kotak drop-down setelah tipe Leluhur. Karena penulisan kontrol visual memerlukan gambar, TGraphicControl dipilih sebagai kelas leluhur. Kemudian masukkan nama kontrol (kelas) baru pada kotak Nama Kelas, biasanya dimulai dengan "T". Halaman Palet digunakan untuk memilih nama halaman kontrol dari kontrol baru di jendela Delphi, seperti "Standar". Tambahkan jalur dan nama file dari file kontrol baru di Nama File Unit dan klik tombol OK. Kontrol baru ditambahkan. Sekarang saatnya menulis kode untuk kontrol.
Berikut ini adalah penulisan bilah gulir yang dapat menyesuaikan gambar sebagai contoh untuk mengilustrasikan metode penulisan kontrol visual.
Ikuti metode di atas, pilih TGraphicControl sebagai kelas leluhur, dan nama kontrol baru adalah TPigHorizontalScroller. Setelah memilih jalur file dan nama file, klik tombol OK untuk mulai menulis kode.
Setiap kontrol akan dibuat (Create) dan dihapus (Destroy), sehingga kedua proses ini harus ditulis terlebih dahulu. Untuk setiap prosedur dalam pengendalian, prosedur tersebut harus didefinisikan terlebih dahulu dan kemudian ditulis kemudian. Ada tiga jenis proses atau properti yang ditentukan: 1. Proses atau properti yang ditentukan setelah PRIvate digunakan secara internal oleh kontrol dan tidak dapat dilihat oleh orang yang menggunakan kontrol; 2. Proses atau properti yang ditentukan setelah dilindungi umumnya tidak terlihat dan hanya dapat digunakan oleh orang lain ketika yang lain menggunakan kontrol. Kontrol hanya terlihat ketika menulis kontrol lain sebagai kelas leluhur; 3. Kontrol yang ditentukan setelah public hanya dapat dipanggil oleh orang lain dalam program; 4. Kontrol yang ditentukan setelah dipublikasikan dapat dilihat di jendela properti (Object Inspektur). Karena proses pembuatan dan penghapusan tidak hanya dijalankan secara otomatis ketika kontrol dibuat selama proses pemrograman, namun juga dapat dipanggil ketika kontrol dibuat secara dinamis selama menjalankan program, maka ditentukan setelah publik (1). (Nomor seri menunjukkan posisi kode sub-langkah pada program sumber terlampir, sama di bawah) Mungkin Anda masih belum tahu apa yang harus dikompilasi dalam kedua proses ini dan bagaimana cara mengkompilasinya. Kami akan membicarakannya di bawah.
Mari kita tambahkan beberapa properti ke kontrol ini terlebih dahulu. Kami mendefinisikan properti Max untuk mengatur atau membaca nilai maksimum bilah gulir. Karena atribut umumnya tidak digunakan secara langsung dalam program, suatu variabel harus didefinisikan agar sesuai dengan atribut dan nilainya dapat diubah atau dibaca. Karena hanya digunakan di dalam kontrol, kita mendefinisikannya setelah private (2). (Umumnya, variabel yang terkait dengan atribut dimulai dengan "F", seperti FMax) Setelah mendefinisikan variabel, tentukan atributnya. Properti ini harus terlihat di jendela Object Inspector, jadi tentukan dan publikasikan (3). Sintaks yang didefinisikan adalah:
properti <nama properti>:<tipe> baca <variabel terkait saat membaca properti ini> tulis <variabel atau prosedur terkait saat menulis properti ini>
Variabel dan atribut lain juga didefinisikan serupa (seperti nilai minimum Min, Nilai nilai saat ini, dll.). Selanjutnya kita mendefinisikan beberapa properti dan variabel untuk mengatur gambar scroll bar (karena variabel gambar itu khusus, kita akan membicarakannya secara terpisah). Kami mendefinisikan LeftButtonUpPicture (gambar tombol kiri), LeftButtonDownPicture (gambar tekan tombol kiri), dll. sebagai tipe TBitmap (variabel yang sesuai harus ditentukan).
Anda pasti telah memperhatikan bahwa dalam program sumber terlampir, ketika mendefinisikan atribut ini, variabel yang sesuai dengan atribut baca setelah dibaca adalah F..., tetapi variabel yang sesuai dengan atribut yang ditentukan setelah tulis bukanlah Variabel, tetapi sesuatu seperti Set ... Ini adalah proses yang disesuaikan. Proses sebagai suatu fungsi didefinisikan sebagai:
prosedur <nama prosedur>(Nilai: <jenis nilai atribut yang disetel>)
Karena ada hal lain yang perlu dilakukan saat menulis atribut jenis ini, Anda tidak bisa hanya menggunakan variabel untuk menanganinya, Anda harus menggunakan proses untuk menanganinya. Proses ini umumnya didefinisikan setelah dilindungi. Dalam prosedur jenis ini, pernyataan seperti ⑷ digunakan untuk memberikan nilai pada variabel bertipe TBitmap. Hal ini digunakan karena variabel jenis ini tidak dapat diberi nilai secara langsung.
Setelah mendefinisikan properti variabel tipe TBitmap ini, Anda perlu menulis kode dalam proses pembuatan dan penghancuran yang disebutkan di atas. Karena TBitmap juga merupakan sebuah kelas, maka harus dibuat pada saat proses pembuatan (5) dan harus dirilis (gratis) pada saat proses penghancuran (6). Pernyataan warisan yang dimaksud dalam ⑺ di sini digunakan untuk menunjukkan bahwa proses tersebut diwarisi dari kelas leluhur. (Ini tidak boleh dijatuhkan).
Karena kita sedang menulis kontrol visual, kita harus menggambar pada kontrol tersebut. Kelas leluhur dari kontrol kita, TGraphicControl, merangkum objek Canvas (kanvas), dan kita dapat menggunakannya secara langsung untuk menggambar. Jika Anda belum terbiasa menggunakan kanvas, ada baiknya Anda mencari buku dan membacanya.
Hal selanjutnya yang harus dilakukan adalah menggambar. Bagaimana cara menggambar di kontrol? Ada peristiwa Paint di kelas leluhur TGraphicControl, yang secara otomatis dipicu ketika kontrol perlu digambar ulang. Yang harus kita lakukan sekarang adalah menulis program untuk acara ini. Pertama tentukan objek Canvas setelah diproteksi. Karena sudah ada di kelas leluhur, tidak perlu menambahkan penjelasan apa pun⑻. Kita akan menggunakan objek ini untuk menggambar. Selanjutnya, Anda perlu mendefinisikan proses Paint dan menulis kode untuk menggambar kontrolnya. Tentukan proses Paint terlebih dahulu setelah public. Karena dipicu oleh kelas leluhur dan bukan dipanggil oleh pengguna, override harus ditambahkan setelahnya. Jika tidak, kontrol tidak akan menjadi kontrol visual karena proses Paint tidak akan pernah dipanggil. Selanjutnya kita akan menulis kode untuk proses Paint⑽.
T_Height dan variabel lain dalam proses Paint dari program sumber yang terlampir pada artikel ini digunakan untuk menyimpan ukuran tombol, slider, dll di bilah gulir Kebanyakan dari mereka ditujukan untuk Beroperasi di atas kanvas, saya yakin semua orang akan memahaminya secara sekilas. Perlu diperhatikan penilaian variabel FAutoSize berikut ini. FAutoSize adalah variabel Boolean yang terkait dengan atribut AutoSize pada kontrol. Perhatikan bahwa dalam kode kontrol, properti umumnya tidak dipanggil secara langsung, tetapi variabel terkait digunakan.
Pada titik ini dalam program, Anda akhirnya muncul untuk kontrol baru Anda, tetapi kontrol tersebut belum dapat digulir. Sekarang mari kita tulis event mouse yang memungkinkan kita memanipulasinya. Definisi dari proses event mouse sangat mirip dengan proses Paint, hanya saja deskripsi parameter harus ditambahkan di akhir. Event mouse dibagi menjadi tiga jenis: MouseDown, MouseMove dan MouseUp harus ditambahkan setelah definisi. Selanjutnya tulis kodenya di belakang. Catatan: Event mouse di sini adalah Mouse..., bukan OnMouse biasanya.... Tapi untuk apa definisi di ⒀ digunakan? Definisi kejadian di sini semuanya untuk pengguna, artinya, ketika kontrol digunakan, maka akan ditampilkan pada halaman Peristiwa di Object Inspector.
Kode untuk kejadian mouse ini juga sangat sederhana. Kode ini menentukan koordinat mouse, menggambar gambar yang sesuai di kanvas, dll., dan memicu kejadian yang sesuai pada saat yang bersamaan. Perlu diperhatikan bahwa saat memanggil peristiwa khusus, Anda harus terlebih dahulu menggunakan pernyataan seperti ⒁ untuk menentukan apakah pengguna telah menulis kode untuk peristiwa tersebut. Ini sangat penting, jika tidak maka akan terjadi kesalahan.
Semua orang telah memperhatikan bahwa peristiwa yang baru saja dipanggil semuanya disesuaikan, dan metode yang ditentukan juga sangat sederhana. Mirip dengan mendefinisikan properti, hanya saja tipenya adalah TNotifyEvent.
TNotifyEvent adalah acara default, yang didefinisikan sebagai:
TNotifyEvent = prosedur(Pengirim: TObject)
Jika Anda ingin mendefinisikan bentuk acara lain, Anda harus melakukan ini: tulis terlebih dahulu lalu ketik
<nama tipe kejadian> = prosedur(<parameter>:<tipe>)
Misalnya:
TCustomEvent = prosedur(a: Integer; b:String);
Kemudian tentukan setelah publik:
<nama acara>:<nama jenis acara>
Misalnya:
Acara: TCustomEvent;
Setelah membaca ini, Anda akan memahami keseluruhan prosedurnya. Jika terjadi kesalahan kompilasi atau pengoperasian, harap periksa poin-poin berikut:
1. Apakah ada pernyataan yang diwariskan dalam proses membuat dan menghancurkan?
2. Apakah variabel bertipe TBitmap telah dibuat dan dibebaskan?
3. Apakah ada nama kontrol sebelum proses, misalnya: TPigHorizontalScroller.MoseMove
Cara menentukan apakah mouse masuk atau keluar dari kontrol:
Tentukan proses berikut:
prosedur MouseEnter(var Pesan: TMessage); pesan CM_MOUSEENTER;
prosedur MouseLeave(var Pesan: TMessage); pesan CM_MOUSELEAVE;