Li Xiaoping/Universitas Pekerja Perminyakan Tiongkok Utara di Gu'an, Provinsi Hebei
---- Apapun jenis program yang dikembangkan, input data sangat diperlukan. Menghasilkan antarmuka masukan yang indah dengan cepat tidak diragukan lagi akan sangat meningkatkan efisiensi pengembangan program. Kontrol asli dari sistem seringkali tidak memuaskan. Di Delphi, jika untuk bidang tertentu, kontrol opsionalnya adalah DBLabel, DBEdit, dll.; jika untuk input seluruh tabel, ada DBGrid. Saat menggunakan kontrol seperti Dbedit, pengguna harus mengatur posisi setiap bidang secara lengkap. Walaupun dapat menghasilkan efek yang indah, namun niscaya akan sangat merepotkan jika terdapat banyak bidang. Jika DBGrid digunakan, tidak peduli berapa banyak field yang ada, hanya satu kontrol yang cukup Sederhana, tetapi field-field tersebut disusun satu per satu, yang agak merepotkan untuk digunakan. Bagi pengguna awam, input dalam bentuk tabel nyaman dan indah. Inilah masalah yang ingin dipecahkan oleh artikel ini.
---- Kunci teknis
---- Fungsi utama dari kontrol ini adalah untuk mengedit field database. Menurut aturan umum, kontrol harus berisi objek TdataLink dan mengimplementasikan serangkaian metode yang terkait dengan TdataLink, namun hal itu akan memakan banyak kode. Semakin besar jumlah kode, semakin kompleks sistemnya dan semakin besar potensi kesalahannya. Ide pengembangan kontrol ini adalah untuk mencapai fungsi terbanyak dengan kode paling sedikit. Oleh karena itu, edit kolom data secara langsung menggunakan kontrol TDBComboBox.
---- Untuk mencapai universalitas, array kontrol pengeditan bidang dan array judul bidang dipertahankan di dalam kontrol. sebagai berikut:
Editor: susunan TDBComboBox;
-> Serangkaian kontrol data tertentu yang digunakan untuk pengeditan, dihasilkan secara dinamis
Label: susunan TLabel;
->Judul setiap bidang dihasilkan secara dinamis
---- Keuntungan menggunakan TDBComboBox adalah tidak hanya memiliki fungsi pengeditan umum, tetapi juga dapat menambahkan informasi cepat yang sesuai ke setiap bidang. Kodenya adalah sebagai berikut:
{Metode untuk menambahkan informasi cepat ke kolom I}
Prosedur TDBPanel.AddHits
(ItemIndex: Integer; Hit: array string);
var
m,n,i: Bilangan bulat;
mulai
n := Panjang(Editor);
m := Panjang(Hit);
jika ItemIndex< n maka mulailah
untuk i:=0 hingga m-1 lakukan Editors[ItemIndex].Items.Add(Hits[i]);
akhir;
akhir;
---- Aplikasi spesifik sangat bervariasi, sehingga kontrol juga perlu memberikan antarmuka pemrosesan peristiwa yang cukup bagi pemrogram untuk mengimplementasikan fungsi khusus untuk aplikasi tertentu. Hal ini memerlukan penentuan metode pemrosesan peristiwa tertentu dalam kontrol untuk diterapkan oleh pengguna. Yang disediakan disini adalah event OnOkClick, yaitu pemrosesan yang dilakukan ketika semua field diedit. Kodenya adalah sebagai berikut:
Tombol Ok: Tombol T;
->Tombol OK yang terakhir ditambahkan digunakan untuk mengimplementasikan tindakan pengiriman.
properti OnOkClick: TNotifyEvent baca FClick tulis FClick;
---- Dengan menerapkan metode OnOKClick, pengguna dapat menyelesaikan berbagai tugas pemrosesan seperti pengiriman dan pengujian rasionalitas data. Hal lain yang memerlukan perlakuan khusus adalah pengendalian konversi antar berbagai bidang. Standarnya adalah mengklik dengan mouse. Namun kebiasaan penggunanya seringkali menggunakan empat tombol panah "atas, bawah, kiri, dan kanan" pada keyboard. Untuk mengimplementasikan fungsi ini, dua metode berikut perlu didefinisikan:
procedure AKeyPress(Pengirim: TObject; Kunci var: Char);
prosedur AKeyDown(Pengirim: TObject;
Kunci var: Kata; Pergeseran: TShiftState);
---- Tetapkan dua metode di atas ke Editor yang dihasilkan secara dinamis untuk mengimplementasikan respons terhadap tombol panah.
---- Tabel yang berbeda memiliki jumlah bidang yang berbeda, yang mungkin tidak ditampilkan, sehingga memerlukan fungsi gulir. Jadi, kontrol TscrollBox dimasukkan ke dalam kontrol. Hal terakhir yang perlu diperhatikan adalah pembatalan kontrol dinamis dan pelepasan memori. Penghancuran susunan kontrol dan pelepasan memori terjadi dalam urutan yang berlawanan dengan urutan penciptaan. Jika tidak, akan terjadi sesuatu yang tidak beres.
---- Penggunaan kontrol
---- Pertama-tama tempatkan kontrol DBPanel pada formulir, lalu atur properti sumber data, jumlah kolom formulir input data, dan properti lainnya. Dalam program ini, setelah membuka sumber data, panggil saja metode untuk membuat kontrol pengeditan data. Sekarang:
Kueri1.Buka;->Buka sumber data
DBPanel1.CreateEditors; ->Buat kontrol edit untuk setiap bidang
DBPanel1.AddHits(0,['1111','11222','eeee']);
-> Tetapkan informasi cepat untuk bidang tertentu
DBPanel1.AddHits(1,['1111','11222','eeee']);
-> Tetapkan informasi cepat untuk bidang tertentu
Kontrol dan program sampel telah di-debug di lingkungan Win98+Delphi 5.0.
---- Lampiran: Kode sumber TDBPanel
unit DBPanel;
antarmuka
kegunaan
Windows, Pesan, SysUtils, Kelas,
Grafik, Kontrol, Formulir, Dialog,
ExtCtrls, dbctrls, stdctrls, db;
jenis
TDBPanel = kelas(TPanel)
pribadi
{Deklarasi pribadi}
Kiri: Integer;
FTop: Bilangan Bulat;
maxTextLen: Bilangan Bulat;
maxLabelLen: Bilangan Bulat;
FScrollBox: TScrollBox;{kontrol gulir}
FLineHeight: Integer;
FClick: TNotifyEvent;
Editor: susunan TDBComboBox;
-> Serangkaian kontrol data tertentu yang digunakan untuk pengeditan, dihasilkan secara dinamis
Label: susunan TLabel;
->Judul setiap bidang dihasilkan secara dinamis
Tombol Ok: Tombol T;
->Tombol OK yang terakhir ditambahkan digunakan untuk mengimplementasikan tindakan pengiriman.
{sumber data}
Sumber Data F: Sumber Data T;
Kolom FC: Integer;
->Masukkan jumlah kolom tabel
terlindung
{ Deklarasi yang dilindungi }
prosedur Editor Gratis;
->Lepaskan memori kontrol input data
publik
prosedur BuatEditor;//
(DS: TDataSource; ColCount: Integer);
->Buat kontrol input data untuk setiap bidang
Buat konstruktor(Pemilik:
TComponent);
destruktor Hancurkan;
prosedur AKeyPress(Pengirim:
Objek; Kunci var: Char);
prosedur AKeyDown(Pengirim:
TObject; var Kunci: Pergeseran Kata;
TShiftState);
prosedur ClearHits(ItemIndex: Integer);
prosedur AddHits(Indeks Item:
Integer; Hit: larik string);
Editor fungsi (Indeks: Integer):
Kotak Kombo TDB;
{Pernyataan publik}
diterbitkan
propertyLeftLimit: Pembacaan bilangan bulat
FKiri tulis FKiri default 10;
properti TopLimit: Pembacaan bilangan bulat
FTop tulis FTop default 10;
properti EditorLen: Integer dibaca
maxTextLen tulis maxTextLen;
properti LabelLen: Pembacaan bilangan bulat
maxLabelLen tulis maxLabelLen default 100;
properti LineHeight: Bacaan bilangan bulat
FLineHeight tulis FLineHeight default 15;
properti OnOkClick: TNotifyEvent
baca FClick tulis FClick;
properti Sumber Data: TDataSource
baca FDataSource tulis FDataSource;
-> Sumber data
properti Kolom: Integer dibaca
FColumns menulis FColumns;->jumlah kolom tabel
{ Deklarasi yang dipublikasikan }
akhir;
prosedur Daftar;
pelaksanaan
prosedur Daftar;
mulai
RegisterComponents('Tambahan', [TDBPanel]);
akhir;
{Metode untuk menambahkan informasi cepat ke kolom I}
prosedur TDBPanel.AddHits(ItemIndex:
Integer; Hit: larik string);
var
m,n,i: Bilangan bulat;
mulai
n := Panjang(Editor);
m := Panjang(Hit);
jika ItemIndex< n maka mulailah
untuk i:=0 hingga m-1 lakukan Editors[ItemIndex].Items.Add(Hits[i]);
akhir;
akhir;
prosedur TDBPanel.AKeyDown
(Pengirim: TObject; var Kunci: Kata;
Pergeseran: TShiftState);
mulai
jika (Pengirim adalah TDBComboBox) maka mulailah
kasus Kunci dari
VK_Berikutnya: (Pengirim sebagai TDBComboBox)
.DataSource.DataSet.Berikutnya;
VK_PRIOR: (Pengirim sebagai TDBComboBox)
.DataSource.DataSet.Prior;
akhir;
akhir;
akhir;
procedure TDBPanel.AKeyPress(Pengirim: TObject; Kunci var: Char);
mulai
jika (Pengirim adalah TDBComboBox) maka mulailah
jika Kunci=#13 maka (Pemilik sebagai TForm).Perform(WM_NEXTDLGCTL, 0, 0);
akhir;
akhir;
prosedur TDBPanel.ClearHits(ItemIndex: Integer);
var
n: Bilangan bulat;
mulai
n := Panjang(Editor);
jika ItemIndex< n lalu Editor[ItemIndex].Items.Clear;
akhir;
konstruktor TDBPanel.Create(Pemilik: TComponent);
mulai
Ciptaan yang Diwarisi (AOWner);
Kiri :=10;
FTop := 10;
maxTextLen := 100;
maxLabelLen := 100;
FLineTinggi := 15;
akhir;
{Metode untuk membuat kontrol input data untuk setiap kolom}
prosedur TDBPanel.CreateEditors;//
(DS: TDataSource; ColCount: Integer);
var
i, n, Jumlah Baris: Integer;
Tinggi Teks: Integer;
mulai
jika DataSource.DataSet.Active maka mulailah
n := Sumber Data.DataSet.FieldCount;
{Hitung panjang judul maksimum dan panjang tampilan}
DataSource.DataSet.Pertama;
{hitung tinggi badan}
TextHeight := Canvas.TextHeight(DataSource
.DataSet.Fields[0].DisplayLabel) + FLineHeight; //10;
{Hitung jumlah baris dan kolom}
Jumlah Baris := n div Kolom;
jika n mod Kolom < > 0 maka inc(RowCount);
{Alokasikan memori}
Editor Gratis;
SetLength(Editor, n);
SetLength(Label, n);
{Buat kotak gulir}
FScrollBox := TScrollBox.Buat(Pemilik);
FScrollBox.Parent := Diri;
FScrollBox.Sejajarkan := alClient;
{BuatEdit}
untuk i:=0 hingga n-1 dimulai
{Buat judul}
Label[i] := TLabel.Create(Pemilik);
Label[i].Induk := FScrollBox; //Diri;
Label[i].Caption := DataSource.DataSet.Fields[i].DisplayLabel;
Label[i].Kiri := FKiri + (maxLabelLen +
maxTextLen + 10) * (saya membagi RowCount);
Label[i].Lebar := maxLabelLen;
Label[i].Top := FTop + (i mod RowCount) * TextHeight + 5;
{Buat objek pengeditan}
Editor[i] := TDBComboBox.Create(Pemilik);
Editor[i].Induk := FScrollBox; //Diri;
Editor[i].Kiri := Label[i].Kiri + Label[i].Lebar;
Editor[i].Lebar := maxTextLen;
Editor[i].Top := FTop + (i mod RowCount) * TextHeight;
Editor[i].DataSource := DataSource;
Editor[i].DataField := DataSource.DataSet.Fields[i].FieldName;
Editor[i].OnKeyPress := AKeyPress;
Editor[i].OnKeyDown := AKeyDown;
akhir;
{Tombol Buat Oke}
OkButton := TButton.Create(Pemilik);
OkButton.Parent := FScrollBox;
OkButton.Left := Editor[n-1].Kiri;
OkButton.Top := Editor[n-1].Atas + Tinggi Teks;
OkButton.Caption := 'OK';
OKButton.OnClick := FClick;
akhir;
akhir;
destruktor TDBPanel.Destroy;
mulai
Editor Gratis;
Kehancuran yang Diwarisi;
akhir;
fungsi TDBPanel.Editor(Indeks: Integer): TDBComboBox;
mulai
jika Indeks< Panjang(Editor) maka Hasil := Editor[Indeks]
lain Hasil := nihil;
akhir;
prosedur TDBPanel.FreeEditors;
var
saya,n: Bilangan bulat;
mulai
{Memori harus dilepaskan secara berurutan! Harus dilakukan dalam urutan penciptaan terbalik!
Apalagi jika ada hubungan induk-anak antar komponen}
jika OkButton< >nihil maka OkButton.Gratis;
jika Editor< >nihil maka mulailah
n := Panjang(Editor);
untuk i:=0 hingga n-1 lakukan Editors[i].free;
Redaksi := nihil;
n := Panjang(Label);
untuk i:=0 hingga n-1 lakukan Labels[i].Free;
Label := nihil;
akhir;
jika FScrollBox< >nihil maka mulailah
FScrollBox.Gratis;
FScrollBox := nihil;
akhir;
akhir;
akhir.