Beberapa program yang biasa kubuat biasanya membutuhkan sebuah komponen yang menampilkan sebuah kalender. Dari kalender itu bisa dimunculkan kegiatan, jadwal piket, jadwal pelajaran, dan banyak keperluan lainnya.
Akhirnya karena cukup sering diperlukan, aku terpikir untuk membuat komponennya yang sederhana, namun bisa direuse di beberapa aplikasi. Komponen ini menampilkan tanggal suatu bulan, dalam bentuk panel-panel yang bisa menampilkan teks, bisa didouble klik, dan memicu suatu event tersendiri.
Beginilah lebih kurang tampilannya:
Object ini memiliki beberapa published property, yang bisa diatur melalui object inspector yaitu:
published property OnDayInfoDoubleClick: TOnDayDoubleClick read FOnDayInfoDoubleClick write SetOnDayInfoDoubleClick; property BeforeChangeMonth: TOnChangeMonth read FBeforeChangeMonth write SetBeforeChangeMonth; property AfterChangeMonth: TOnChangeMonth read FAfterChangeMonth write SetAfterChangeMonth; property PopupMenu: TPopupMenu read FPopupMenu write SetPopupMenu; property SortedText: boolean read FSortedText write SetSortedText; property CurrentDay: TDateTime read FCurrentDay write SetCurrentDay;
Property OnDayDoubleClick akan terpicu apabila user mendouble klik text yang muncul di dalam sebuah tanggal.
procedure TformKegiatan.WishCalendarDayInfoDoubleClick(Sender: TObject; Date: TDateTime; ItemIndex: Integer; DayInformation: TStrings);
Date menunjukkan tanggal yang sedang aktif (terpicu), ItemIndex menunjukkan indeks ke berapa teks yang didoubleklik dalam listbox.
DayInformation merupakan total teks dalam listbox tersebut.
Object yang didouble klik adalah sebuah TListBox. Hal ini untuk mempermudah pemunculan teks pada tiap tanggalnya. Event double klik hanya terpicu apabila ada sebuah teks yang disimpan. Jika TStringList kosong, event ini tidak akan terpicu.
Event BeforeChangeMonth dan AfterChangeMonth akan terpicu masing-masing ketika sebelum dan sesudah berpindah ke bulan lain. Jika kita ingin menolak perpindahan, kita bisa memanggil procedure Abort untuk mencegah perpindahan bulan.
PopupMenu bisa diassign dengan sebuah menu PopUp yang akan otomatis muncul apabila sebuah panel hari diklik kanan.
Property SortedText mengatur apakah teks yang muncul di TStringList akan disort atau tidak.
Property CurrentDay menentukan tanggal yang aktif pada suatu bulan tertentu.
public constructorCreate(AOwner: TComponent); override; //constructor object destructorDestroy; override; //destructor procedureRefreshCalendarSize; //merefresh ukuran kalender procedureRefreshCalendarContent; //merefresh isi kalender procedureRefreshCalendar; //merefresh ukuran dan isi procedureSetDayColor(day: TDateTime; newColor: TColor); //mengatur warna panel hari functionGetLastDateClicked: TDateTime; //mengembalikan tanggal terakhir yang diklik procedureAddText(text: String; date: TDateTime); //menambah teks pada sebuah tanggal procedureDeleteText(text: String; date: TDateTime); menghapus teks pada sebuah tanggal functionTextExists(text: String; date: TDateTime): boolean; //memeriksa sebuah teks ada pada sebuah tanggal atau tidak functionGetListBox(date: TDateTime): TListBox; //mengembalikan ListBox dalam sebuah tanggal procedureClearText(date: TDateTime); //menghapus semua teks pada sebuah tanggal procedureClearAllText; //menghapus semua teks yang muncul pada semua hari di panel yang terlihat functionGetMinimumDate: TDateTime; //mengembalikan tanggal terkecil yang sedang tampil saat itu functionGetMaximumDate: TDateTime; //mengembalikan tanggal terbesar yang sedang tampil saat itu procedureSetMonthFont(const Value: TFont); //mengganti font nama bulan di atas procedureSetDayFont(const Value: TFont); //mengganti font setiap tanggalnya procedureSetBorderMonthColor(const Value: TColor); //mengubah warna pembatas tiap tanggal
Objek ini masih jauh dari sempurna. Masalah yang aku hadapi adalah:
- Flicker. Setiap komponen ini diresize, dia akan flicker. Salah satu hal yang paling nyebelin. Please help me to get rid off this matter.
- Kalau komponen ini aku buat tidak menerima objek di atasnya, behaviournya rada aneh.
Biasanya yang aku lakukan di constructor:
ControlStyle := ControlStyle – [csAcceptsControls, csSetCaption] + [csOpaque];
Di komponen ini, pas design time rada jelek tampilannya. Makanya aku buang line di atas.
Anyway, komponen itu dibuat dengan banyak keterbatasan waktu dan ide. So kalau ada waktu, lagi iseng kali, bantu-bantu improve dong komponen ini. Thanx in advance. Aku sebenernya pengen beli bukunya Ray Knopka tentang making component in Delphi. Sayang di Amazon stoknya lagi habis. Nggak tahu kapan lagi ada. Kalau ada yang punya, pinjem dunk… hehehe..