หลี่ เสี่ยวผิง/มหาวิทยาลัยคนงานปิโตรเลียมนอร์ธไชน่า ในเมืองกวน มณฑลเหอเป่ย
---- ไม่ว่าจะพัฒนาโปรแกรมประเภทไหน การป้อนข้อมูลก็เป็นสิ่งที่ขาดไม่ได้ การสร้างอินเทอร์เฟซอินพุตที่สวยงามอย่างรวดเร็วจะช่วยปรับปรุงประสิทธิภาพของการพัฒนาโปรแกรมได้อย่างมากอย่างไม่ต้องสงสัย การควบคุมระบบแบบเดิมมักไม่เป็นที่น่าพอใจ ใน Delphi หากเป็นฟิลด์ใดฟิลด์หนึ่ง ตัวควบคุมเพิ่มเติมคือ DBLabel, DBEdit ฯลฯ หากเป็นอินพุตของทั้งตาราง ก็จะมี DBGrid เมื่อใช้การควบคุมเช่น Dbedit ผู้ใช้จะต้องจัดตำแหน่งของแต่ละฟิลด์ให้ครบถ้วน แม้ว่าจะสามารถสร้างเอฟเฟกต์ที่สวยงามได้ แต่ก็คงจะลำบากมากอย่างแน่นอนหากมีหลายฟิลด์ หากใช้ DBGrid ไม่ว่าจะมีกี่ฟิลด์ก็ตาม การควบคุมเพียงอันเดียวก็เพียงพอแล้ว สำหรับผู้ใช้ทั่วไป การป้อนข้อมูลในรูปแบบตารางนั้นทั้งสะดวกและสวยงาม นี่คือปัญหาที่บทความนี้มุ่งหวังที่จะแก้ไข
----รหัสทางเทคนิค
----หน้าที่หลักของการควบคุมนี้คือการแก้ไขฟิลด์ฐานข้อมูล ตามกฎทั่วไป ตัวควบคุมควรมีออบเจ็กต์ TdataLink และใช้วิธีการต่างๆ ที่เกี่ยวข้องกับ TdataLink อย่างไรก็ตาม จะใช้โค้ดจำนวนมาก ยิ่งรหัสมีจำนวนมากขึ้น ระบบก็จะยิ่งซับซ้อนและมีโอกาสเกิดข้อผิดพลาดมากขึ้นเท่านั้น แนวคิดในการพัฒนาการควบคุมนี้คือเพื่อให้ได้ฟังก์ชันสูงสุดโดยใช้โค้ดน้อยที่สุด ดังนั้น แก้ไขเขตข้อมูลโดยตรงโดยใช้ตัวควบคุม TDBComboBox
---- เพื่อให้บรรลุความเป็นสากล อาร์เรย์ควบคุมการแก้ไขฟิลด์และอาร์เรย์ชื่อฟิลด์จะถูกเก็บรักษาไว้ภายในตัวควบคุม ดังต่อไปนี้:
บรรณาธิการ: อาร์เรย์ของ TDBComboBox;
-> อาร์เรย์เฉพาะของการควบคุมข้อมูลที่ใช้สำหรับการแก้ไข สร้างขึ้นแบบไดนามิก
ป้ายกำกับ: อาร์เรย์ของ TLabel;
-> ชื่อของแต่ละฟิลด์จะถูกสร้างขึ้นแบบไดนามิก
----ข้อดีของการใช้ TDBComboBox คือ ไม่เพียงแต่มีฟังก์ชันการแก้ไขทั่วไปเท่านั้น แต่ยังสามารถเพิ่มข้อมูลพร้อมต์ที่เกี่ยวข้องลงในแต่ละฟิลด์ได้อีกด้วย รหัสมีดังนี้:
{วิธีการเพิ่มข้อมูลแจ้งลงในฟิลด์ I}
ขั้นตอน TDBPanel.AddHits
(ItemIndex: Integer; Hits: อาร์เรย์ของสตริง);
var
m,n,i: จำนวนเต็ม;
เริ่ม
n := ความยาว (บรรณาธิการ);
m := ความยาว(ฮิต);
ถ้า ItemIndex< n ให้เริ่มต้น
สำหรับ i:=0 ถึง m-1 ทำ Editors[ItemIndex].Items.Add(Hits[i]);
จบ;
จบ;
---- แอปพลิเคชันเฉพาะนั้นแตกต่างกันไปอย่างมาก ดังนั้นการควบคุมยังจำเป็นต้องเหลืออินเทอร์เฟซการประมวลผลเหตุการณ์ที่เพียงพอสำหรับโปรแกรมเมอร์เพื่อใช้ฟังก์ชันพิเศษสำหรับแอปพลิเคชันเฉพาะ สิ่งนี้จำเป็นต้องกำหนดวิธีการประมวลผลเหตุการณ์บางอย่างในการควบคุมเพื่อให้ผู้ใช้นำไปใช้ สิ่งที่มีให้ที่นี่คือเหตุการณ์ OnOkClick ซึ่งเป็นการประมวลผลที่ดำเนินการเมื่อมีการแก้ไขฟิลด์ทั้งหมด รหัสมีดังนี้:
OkButton: TButton;
->ปุ่มตกลงที่เพิ่มล่าสุดใช้เพื่อดำเนินการส่ง
คุณสมบัติ OnOkClick: TNotifyEvent อ่าน FClick เขียน FClick;
---- เมื่อใช้วิธี OnOKClick ผู้ใช้สามารถดำเนินงานการประมวลผลต่างๆ เช่น การส่งและการทดสอบเหตุผลของข้อมูล อีกสิ่งหนึ่งที่ต้องได้รับการดูแลเป็นพิเศษคือการควบคุมการแปลงระหว่างสาขาต่างๆ ค่าเริ่มต้นคือการคลิกด้วยเมาส์ อย่างไรก็ตาม นิสัยของผู้ใช้มักจะใช้ปุ่มลูกศรสี่ปุ่ม "ขึ้น ลง ซ้าย และขวา" บนแป้นพิมพ์ หากต้องการใช้ฟังก์ชันนี้ จำเป็นต้องกำหนดสองวิธีต่อไปนี้:
ขั้นตอน AKeyPress (ผู้ส่ง: TObject; var Key: Char);
ขั้นตอน AKeyDown (ผู้ส่ง: TObject;
คีย์ var: Word; Shift: TShiftState);
---- กำหนดสองวิธีข้างต้นให้กับตัวแก้ไขที่สร้างขึ้นแบบไดนามิกเพื่อใช้การตอบสนองต่อปุ่มลูกศร
---- ตารางที่ต่างกันมีจำนวนฟิลด์ที่แตกต่างกันซึ่งอาจไม่สามารถแสดงได้ ซึ่งต้องใช้ฟังก์ชันการเลื่อน ดังนั้น คอนโทรล TscrollBox จะถูกแทรกเข้าไปในคอนโทรล สิ่งสุดท้ายที่ควรทราบคือการเลิกทำการควบคุมแบบไดนามิกและการเปิดตัวหน่วยความจำ การเลิกทำอาร์เรย์ควบคุมและการปล่อยหน่วยความจำเป็นไปตามลำดับซึ่งตรงกันข้ามกับลำดับการสร้างเลย มิฉะนั้นจะมีบางอย่างผิดพลาด
----การใช้การควบคุม
---- ขั้นแรกให้วางตัวควบคุม DBPanel บนแบบฟอร์ม จากนั้นตั้งค่าคุณสมบัติแหล่งข้อมูล จำนวนคอลัมน์ของแบบฟอร์มป้อนข้อมูล และคุณสมบัติอื่นๆ ในโปรแกรม หลังจากเปิดแหล่งข้อมูลแล้ว เพียงเรียกใช้เมธอดเพื่อสร้างตัวควบคุมการแก้ไขข้อมูล ตอนนี้:
Query1.Open;->เปิดแหล่งข้อมูล
DBPanel1.CreateEditors; -> สร้างการควบคุมการแก้ไขสำหรับแต่ละฟิลด์
DBPanel1.AddHits(0,['1111','11222','eeee']);
-> ตั้งค่าข้อมูลพร้อมท์สำหรับบางฟิลด์
DBPanel1.AddHits(1,['1111','11222','eeee']);
-> ตั้งค่าข้อมูลพร้อมท์สำหรับบางฟิลด์
โปรแกรมควบคุมและตัวอย่างได้รับการดีบั๊กในสภาพแวดล้อม Win98+Delphi 5.0
---- เอกสารแนบ: ซอร์สโค้ดของ TDBPanel
หน่วย DBPanel;
อินเตอร์เฟซ
การใช้งาน
Windows, ข้อความ, SysUtils, คลาส,
กราฟิก การควบคุม แบบฟอร์ม กล่องโต้ตอบ
ExtCtrls, dbctrls, stdctrls, db;
พิมพ์
TDBPanel = คลาส (TPanel)
ส่วนตัว
{ประกาศส่วนตัว}
FLeft: จำนวนเต็ม;
FTop: จำนวนเต็ม;
maxTextLen: จำนวนเต็ม;
maxLabelLen: จำนวนเต็ม;
FScrollBox: TScrollBox;{ตัวควบคุมการเลื่อน}
FLineHeight: จำนวนเต็ม;
FClick: TNotifyEvent;
บรรณาธิการ: อาร์เรย์ของ TDBComboBox;
-> อาร์เรย์เฉพาะของการควบคุมข้อมูลที่ใช้สำหรับการแก้ไข สร้างขึ้นแบบไดนามิก
ป้ายกำกับ: อาร์เรย์ของ TLabel;
-> ชื่อของแต่ละฟิลด์จะถูกสร้างขึ้นแบบไดนามิก
OkButton: TButton;
->ปุ่มตกลงที่เพิ่มล่าสุดใช้เพื่อดำเนินการส่ง
{แหล่งข้อมูล}
แหล่งข้อมูล FData: TDataSource;
คอลัมน์ F: จำนวนเต็ม;
->กรอกจำนวนคอลัมน์ของตาราง
ได้รับการคุ้มครอง
{ ประกาศที่ได้รับการคุ้มครอง }
ขั้นตอน FreeEditors;
-> ปล่อยหน่วยความจำของการควบคุมการป้อนข้อมูล
สาธารณะ
ขั้นตอนการสร้าง Editors;//
(DS: TDataSource; ColCount: จำนวนเต็ม);
-> สร้างการควบคุมการป้อนข้อมูลสำหรับแต่ละฟิลด์
ตัวสร้างสร้าง (AOwner:
TComponent);
destructor ทำลายล้าง;
ขั้นตอน AKeyPress (ผู้ส่ง:
TObject; var คีย์: ถ่าน);
ขั้นตอน AKeyDown (ผู้ส่ง:
TObject; คีย์ var: Word;
TShiftState);
ขั้นตอน ClearHits (ItemIndex: Integer);
ขั้นตอน AddHits (ItemIndex:
จำนวนเต็ม ฮิต: อาร์เรย์ของสตริง);
ตัวแก้ไขฟังก์ชัน (ดัชนี: จำนวนเต็ม):
TDBComboBox;
{ประกาศสาธารณะ}
ที่ตีพิมพ์
propertyLeftLimit: อ่านจำนวนเต็ม
FLeft เขียนค่าเริ่มต้น FLeft 10;
คุณสมบัติ TopLimit: อ่านจำนวนเต็ม
FTop เขียนค่าเริ่มต้น FTop 10;
คุณสมบัติ EditorLen: อ่านจำนวนเต็ม
maxTextLen เขียน maxTextLen;
คุณสมบัติ LabelLen: จำนวนเต็มอ่าน
maxLabelLen เขียนค่าเริ่มต้น maxLabelLen 100;
คุณสมบัติ LineHeight: อ่านจำนวนเต็ม
FLineHeight เขียนค่าเริ่มต้น FLineHeight 15;
คุณสมบัติ OnOkClick: TNotifyEvent
อ่าน FClick เขียน FClick;
คุณสมบัติแหล่งข้อมูล: TDataSource
อ่าน FDataSource เขียน FDataSource;
->แหล่งข้อมูล
คอลัมน์คุณสมบัติ: อ่านจำนวนเต็ม
FColumns เขียน FColumns;->จำนวนคอลัมน์ในตาราง
{ ประกาศที่เผยแพร่ }
จบ;
ขั้นตอนการลงทะเบียน;
การดำเนินการ
ขั้นตอนการลงทะเบียน;
เริ่ม
RegisterComponents('เพิ่มเติม', [TDBPanel]);
จบ;
{วิธีการเพิ่มข้อมูลแจ้งลงในฟิลด์ I}
ขั้นตอน TDBPanel.AddHits (ItemIndex:
จำนวนเต็ม ฮิต: อาร์เรย์ของสตริง);
var
m,n,i: จำนวนเต็ม;
เริ่ม
n := ความยาว (บรรณาธิการ);
m := ความยาว(ฮิต);
ถ้า ItemIndex< n ให้เริ่มต้น
สำหรับ i:=0 ถึง m-1 ทำ Editors[ItemIndex].Items.Add(Hits[i]);
จบ;
จบ;
ขั้นตอน TDBPanel.AKeyDown
(ผู้ส่ง: TObject; คีย์ var: Word;
กะ: TShiftState);
เริ่ม
ถ้า (ผู้ส่งคือ TDBComboBox) ให้เริ่มต้น
กรณีคีย์ของ
VK_Next: (ผู้ส่งเป็น TDBComboBox)
.DataSource.DataSet.ถัดไป;
VK_PRIOR: (ผู้ส่งเป็น TDBComboBox)
.DataSource.DataSet.Prior;
จบ;
จบ;
จบ;
ขั้นตอน TDBPanel.AKeyPress (ผู้ส่ง: TObject; คีย์ var: Char);
เริ่ม
ถ้า (ผู้ส่งคือ TDBComboBox) ให้เริ่มต้น
ถ้า Key=#13 แล้ว (เจ้าของเป็น TForm).ดำเนินการ(WM_NEXTDLGCTL, 0, 0);
จบ;
จบ;
ขั้นตอน TDBPanel.ClearHits (ItemIndex: Integer);
var
n: จำนวนเต็ม;
เริ่ม
n := ความยาว (บรรณาธิการ);
ถ้า ItemIndex< n แล้วให้แก้ไข [ItemIndex].Items.Clear;
จบ;
ตัวสร้าง TDBPanel.Create (AOwner: TComponent);
เริ่ม
สร้างที่สืบทอดมา (AOWNer);
ซ้าย :=10;
Fด้านบน := 10;
maxTextLen := 100;
maxLabelLen := 100;
ความสูงเส้น := 15;
จบ;
{วิธีการสร้างการควบคุมการป้อนข้อมูลสำหรับแต่ละฟิลด์}
ขั้นตอน TDBPanel.CreateEditors;//
(DS: TDataSource; ColCount: จำนวนเต็ม);
var
ฉัน, n, RowCount: จำนวนเต็ม;
ความสูงข้อความ: จำนวนเต็ม;
เริ่ม
ถ้า DataSource.DataSet.Active ให้เริ่มต้น
n := DataSource.DataSet.FieldCount;
{คำนวณความยาวชื่อเรื่องสูงสุดและความยาวการแสดงผล}
DataSource.DataSet.First;
{คำนวณความสูง}
TextHeight := Canvas.TextHeight(DataSource
.DataSet.Fields[0].DisplayLabel) + FLineHeight; //10;
{คำนวณจำนวนแถวและคอลัมน์}
RowCount := คอลัมน์ div;
ถ้า n mod คอลัมน์ < > 0 แล้ว inc (RowCount);
{จัดสรรหน่วยความจำ}
บรรณาธิการอิสระ;
SetLength(บรรณาธิการ, n);
SetLength(ป้ายกำกับ, n);
{สร้างกล่องเลื่อน}
FScrollBox := TScrollBox.Create (เจ้าของ);
FScrollBox.Parent := ตนเอง;
FScrollBox.Align := alClient;
{สร้างแก้ไข}
สำหรับ i:=0 ถึง n-1 จะเริ่มต้น
{สร้างชื่อ}
Labels[i] := TLabel.Create(เจ้าของ);
ป้ายกำกับ [i] .Parent := FScrollBox; //Self;
Labels[i].Caption := DataSource.DataSet.Fields[i].DisplayLabel;
ป้ายกำกับ[i].ซ้าย := FLeft + (maxLabelLen +
maxTextLen + 10) * (ฉัน div RowCount);
ป้ายกำกับ[i].ความกว้าง := maxLabelLen;
Labels[i].Top := FTop + (i mod RowCount) * TextHeight + 5;
{สร้างวัตถุการแก้ไข}
บรรณาธิการ [i] := TDBComboBox.Create (เจ้าของ);
บรรณาธิการ [i] .Parent := FScrollBox; //Self;
บรรณาธิการ[i].ซ้าย := Labels[i].Left + Labels[i].Width;
บรรณาธิการ [i] .Width := maxTextLen;
บรรณาธิการ [i] .Top := FTop + (i mod RowCount) * TextHeight;
บรรณาธิการ [i] .DataSource := แหล่งข้อมูล;
บรรณาธิการ [i].DataField := DataSource.DataSet.Fields[i].FieldName;
บรรณาธิการ [i] .OnKeyPress := AKeyPress;
บรรณาธิการ [i] .OnKeyDown := AKeyDown;
จบ;
{ปุ่มสร้างตกลง}
OkButton := TButton.Create (เจ้าของ);
OkButton.Parent := FScrollBox;
OkButton.Left := บรรณาธิการ [n-1].ซ้าย;
OkButton.Top := บรรณาธิการ [n-1].Top + TextHeight;
OkButton.Caption := 'ตกลง';
OKButton.OnClick := FClick;
จบ;
จบ;
ตัวทำลาย TDBPanel.Destroy;
เริ่ม
บรรณาธิการอิสระ;
การทำลายล้างที่สืบทอดมา;
จบ;
ฟังก์ชั่น TDBPanel.Editor (ดัชนี: จำนวนเต็ม): TDBComboBox;
เริ่ม
ถ้า Index< ความยาว (ตัวแก้ไข) ดังนั้นผลลัพธ์ := ตัวแก้ไข [ดัชนี]
ผลลัพธ์อื่น := ไม่มี;
จบ;
ขั้นตอน TDBPanel.FreeEditors;
var
ฉัน,n: จำนวนเต็ม;
เริ่ม
{หน่วยความจำจะต้องถูกปล่อยออกมาตามลำดับ! ต้องทำในลำดับย้อนกลับของการสร้าง!
โดยเฉพาะอย่างยิ่งเมื่อมีความสัมพันธ์ระหว่างพ่อแม่และลูกระหว่างส่วนประกอบ}
ถ้า OkButton< >ไม่มี แล้ว OkButton.Free;
ถ้า Editors< >nil ให้เริ่มต้น
n := ความยาว (บรรณาธิการ);
สำหรับ i:=0 ถึง n-1 ทำ Editors[i].free;
บรรณาธิการ := ไม่มี;
n := ความยาว (ป้ายกำกับ);
สำหรับ i:=0 ถึง n-1 ทำ Labels[i].ฟรี;
ป้ายกำกับ := ไม่มี;
จบ;
ถ้า FScrollBox< >ไม่มี ให้เริ่มต้น
FScrollBox.ฟรี;
FScrollBox := ไม่มี;
จบ;
จบ;
จบ.