นับตั้งแต่เรียน Delphi ในปี 1999 ฉันรู้สึกทึ่งกับการพัฒนาที่รวดเร็วของมัน ในเวลานั้นฉันเพิ่งได้สัมผัสกับการเขียนโปรแกรมและสนใจเป็นพิเศษในการพัฒนาด้านภาพ เหตุผลก็คือสามารถนำไปใช้งานได้เร็วกว่าภาษา C ไม่กี่ปีที่ผ่านมา ตั้งแต่ delphi C/S ไปจนถึง B/S สามเลเยอร์ ฉันยังได้เขียนซอฟต์แวร์บางตัวทั้งเล็กและใหญ่ ฉันคิดว่า Delphi ตัวนี้มีเพียงฟังก์ชั่นเหล่านี้เท่านั้น เนื่องจากเมื่อเร็ว ๆ นี้ฉันได้หนังสือ "Com Essence" และศึกษาซอร์สโค้ด VCL ฉันพบว่ามันทรงพลังมาก (ฉันไม่รู้ว่าจะใช้คำใดในการอธิบาย) มีการแบ่งปันความก้าวหน้าบางอย่างที่นี่กับทุกคน โปรดบอกฉันหากมีข้อผิดพลาด
พูดตรงๆ ส่วนประกอบจะมีสมาชิกเพียงสองประเภทเท่านั้น: คุณสมบัติและเมธอด (วิธีที่ฉันกำลังพูดถึงรวมถึงเหตุการณ์)
แบ่งออกเป็นสี่ส่วน:
ส่วนตัว
ได้รับการคุ้มครอง
สาธารณะ
ที่ตีพิมพ์
ความหมายของทั้งสี่ส่วนข้างต้นจะถูกนำเสนอในหนังสือการพัฒนาการมองเห็นทั่วไป นี่เป็นเพียงภาพรวมโดยย่อที่เกี่ยวข้องกับ Delphi
ส่วนตัว: สมาชิกส่วนตัวทั้งหมดจะถูกวางไว้ที่นี่และสามารถเข้าถึงได้โดยวิธีการของคลาสเท่านั้น ไม่ใช่โดยคลาสย่อย และมีความโปร่งใสสำหรับคลาสย่อย นอกจากนี้ยังอาจกล่าวได้ว่าสามารถเข้าถึงได้โดยวิธีการของตัวเครื่องเท่านั้น
ป้องกัน: ยกเว้นว่าคลาสย่อยสามารถสืบทอดได้ ส่วนที่เหลือจะเหมือนกับคลาสส่วนตัว บุคคลภายนอกไม่สามารถเข้าถึงได้
สาธารณะ: สาธารณะ คุณสมบัติและวิธีการที่ประกาศไว้ที่นี่สามารถเรียกโดยผู้ใช้สามารถเรียกได้
เผยแพร่: ปรากฏในแถบคุณสมบัติของสภาพแวดล้อมการพัฒนา Delphi
ขั้นแรก มาสร้างการควบคุมที่ง่ายที่สุดกันก่อน ภายในเวลาไม่ถึงห้านาที คุณจะเข้าใจว่าส่วนประกอบต่างๆ บนแผงส่วนประกอบของ Delphi นั้นถูกสร้างขึ้นมาอย่างไร
ใหม่ -> ใหม่ -> ส่วนประกอบ แล้วกด Enter
จากนั้นเลือกคลาสหลักที่คุณต้องการสืบทอดในประเภทบรรพบุรุษ: ที่นี่เราเลือก TComponent ซึ่งหมายถึงการสืบทอดคุณสมบัติและวิธีการทั้งหมดของ TComponent
ชื่อคลาส: ป้อนชื่อคลาสของส่วนประกอบที่จะสร้าง (เราเข้า TShowText)
Palette Page: แผงใดใน Delphi ที่จะติดตั้งส่วนประกอบ (เราเลือกตัวอย่าง คุณสามารถป้อนชื่อใหม่ได้เช่นกัน)
ฉันไม่จำเป็นต้องพูดสิ่งต่อไปนี้
คลิกปุ่มตกลง จากนั้น Delphi จะสร้างการควบคุมพื้นฐานที่สืบทอดมาจาก TComponent โดยอัตโนมัติ นอกจากนี้ยังสามารถเข้าใจได้ว่าเราได้พัฒนาการควบคุมที่ทรงพลังเท่ากับ TComponent แต่นี่ไม่ใช่สิ่งที่เราต้องการ
ต่อไปนี้จะอธิบายวิธีการอ่านและเขียนของตัวแปรส่วนตัวของส่วนประกอบเอง:
ตัวอย่างเช่น เราเขียนย่อหน้าสั้นๆ ต่อไปนี้:
ส่วนตัว
FText: สตริง;
-
/*ตัวแปรส่วนตัวไม่ได้รับอนุญาตให้ใช้โดยโลกภายนอก แล้วเราจะควบคุมตัวแปรสตริง FText นี้ได้อย่างไร? -
เรายังต้องเพิ่มย่อหน้านี้หลังจาก Published:
คุณสมบัติ ข้อความ: สตริง อ่าน FText เขียน FText;
ความหมายที่นี่คือคุณสมบัติข้อความนี้จะปรากฏในแถบคุณสมบัติของ delphiSDK ผู้ใช้ที่แก้ไขข้อความในแถบคุณสมบัติกำลังแก้ไขตัวแปรสตริง FText read หมายความว่าผู้ใช้อ่านแอตทริบิวต์ Text และอ่าน FText จริง ๆ หมายความว่าผู้ใช้กำหนดค่าให้กับ Text และเก็บไว้ในตัวแปรสตริง FText
หากคุณบันทึกในเวลานี้และติดตั้งใน Delphi ส่วนประกอบพื้นฐานที่สุดของเราก็จะเสร็จสิ้น (แนะนำวิธีการติดตั้งส่วนประกอบในตอนท้าย)
ฮ่าฮ่า มันไม่ง่ายเลยเหรอ? เพียงแต่ว่าส่วนประกอบของเราไม่มีการใช้งานเฉพาะใดๆ
เราเพิ่งแนะนำแอตทริบิวต์ที่นี่ ตอนนี้เราจะเพิ่มฟังก์ชันต่อไปเพื่อแนะนำการใช้เมธอด
เราเพิ่มสิ่งต่อไปนี้หลังสาธารณะ:
ขั้นตอน ShowText();
จากนั้นกด Ctrl + Alt +C ระบบจะเพิ่มโค้ดการใช้งานของวิธีการบางอย่างให้คุณโดยอัตโนมัติ
ต่อไปเรากำลังเขียน:
ขั้นตอน TShowText.ShowText();
เริ่ม
แสดงข้อความ(FText);
จบ;
อย่างที่คุณเห็น ShowMessage ด้านบนจะแสดงค่าของตัวแปรส่วนตัวของคลาส ตอนนี้คุณควรจะเข้าใจว่าตัวแปรส่วนตัวสามารถเข้าถึงได้ในเมธอดของคลาสเท่านั้น ที่นี่คุณจะต้องเพิ่มหน่วย Dialogs หลังจากใช้งาน เนื่องจาก ShowMessage รวมอยู่ในหน่วย Dialogs มิฉะนั้นจะไม่ผ่าน
แน่นอน เหตุการณ์ข้างต้นสามารถใช้ได้เฉพาะในตัวควบคุม และไม่สามารถปรากฏในแถบเหตุการณ์ในกล่องคุณสมบัติได้ เนื่องจากวิธีการที่ประกาศไว้ที่นี่เป็นเพียงสาธารณะเท่านั้น ซึ่งเป็นวิธีการบริสุทธิ์ และไม่ได้ประกาศเป็นเหตุการณ์
จากการศึกษาข้างต้น คุณรู้วิธีการเขียนและปรับคุณสมบัติและวิธีการควบคุมแล้วหรือยัง?
อย่างไรก็ตาม การควบคุมที่แท้จริงไม่สามารถแยกออกจากเหตุการณ์ได้ และการเรียกใช้เหตุการณ์จะต้องขับเคลื่อนด้วยข้อความ ซึ่งจะแนะนำในบทความถัดไปของฉัน
คุณสมบัติและวิธีการควบคุมที่มีประสิทธิภาพนั้นไม่ใช่เรื่องง่าย แต่ต้องอาศัยการฝึกฝนและการใช้งานที่มากขึ้น
สิ่งที่แนบมาด้านล่างคือตัวควบคุม DBGridToExcel ที่ฉันเขียน ซึ่งมีหน้าที่ส่งออกข้อมูลใน DBGrid ไปยัง Excel คุณสามารถเรียนรู้จากมันและใช้เป็นข้อมูลอ้างอิงได้ การควบคุมนี้รวมถึงการใช้คุณสมบัติ วิธีการ และ "เหตุการณ์" ที่เราจะพูดถึงในบทความถัดไป
ภาคผนวก 1: วิธีติดตั้งส่วนควบคุมที่สร้างขึ้นเอง:
(1) ในเมนูส่วนประกอบ เลือก "ติดตั้งส่วนประกอบ..."
(2) คลิก "..." หลังชื่อไฟล์หน่วย เลือกไฟล์หน่วยของตัวควบคุม "*.pas" จากนั้นคลิกตกลง คลิก "ติดตั้ง" ในหน้าต่างที่ปรากฏขึ้น และการติดตั้งเสร็จสมบูรณ์
การควบคุมที่ติดตั้งใหม่จะปรากฏในแผงควบคุมของคุณ
เอกสารแนบ 2: คัดลอกซอร์สโค้ดทั้งหมดของตัวควบคุม TDBGridToExcel ไปยัง Notepad และบันทึกเป็นไฟล์ .pas
หน่วย DBGridToExcel;
{************************************************ * ***********************}
-
{* ส่งออกตารางไปยังการควบคุม Word VCL สำหรับ D5 & D6 *}
{* ลิขสิทธิ์ (C) xiangding 2003.10.1 สงวนลิขสิทธิ์ *}
{* รายงานข้อผิดพลาด: [email protected] *}
{* ผู้แต่ง: หมีน้อย*}
-
{************************************************ * ***********************}
-
{* นี่เป็นเวอร์ชันธรรมดา *}
-
{************************************************ * ***********************}
-
{* ติดตั้ง: *}
{* กรุณาบันทึกเป็นไฟล์ GridToExcel.pas จากนั้นเปิดไฟล์ *}
{* คลิกรายการเมนู [ส่วนประกอบ] --> [ติดตั้งส่วนประกอบ] *}
{* คลิกปุ่ม [ติดตั้ง] ในกล่องโต้ตอบการติดตั้งส่วนประกอบ *}
{* หลังการติดตั้ง คุณจะพบการควบคุมที่ส่วนประกอบ *}
{* หน้า [ตัวอย่าง] *}
-
{************************************************ * ***********************}
-
{* ติดตั้ง: *}
{* บันทึกไฟล์แนบ จากนั้นเปิดไฟล์ GridToExcel.Pas ด้วย Delphi *}
{* เลือกเมนู Delphi -> ส่วนประกอบ -> ติดตั้งส่วนประกอบ *}
{* จากนั้นเลือกติดตั้ง หลังการติดตั้ง บนหน้าตัวอย่างของแผงควบคุม *}
{* หลังจากที่คุณคุ้นเคยแล้ว คุณสามารถลองตั้งค่าแอตทริบิวต์ที่ซับซ้อนและสำรวจคุณสมบัติอื่นๆ ได้ด้วยตัวเอง *}
{************************************************ * ***********************}
อินเตอร์เฟซ
การใช้งาน
Windows, StdCtrls, ComCtrls, ข้อความ, DBGrids, กราฟิก, ExtCtrls,
แบบฟอร์ม, DB, ComObj, การควบคุม, SysUtils, คลาส;
ResourceString
SPromptExport = 'โปรดรอสักครู่ ข้อมูลกำลังถูกส่งออก...';
SConnectExcel = 'กำลังเริ่ม Excel โปรดรอสักครู่...';
SConnectExcelError= 'ไม่สามารถเชื่อมต่อกับ Excel ได้ Excel อาจไม่สามารถติดตั้งและไม่สามารถส่งออกได้';
สแกน = '&ยกเลิก';
SError = 'ข้อผิดพลาด';
SConfirm = 'คุณต้องการยุติการส่งออกข้อมูลจริงหรือ? -
SCaption = 'ยืนยัน';
SGridError = 'ไม่ได้ระบุชุดข้อมูล โปรดระบุการควบคุมชุดข้อมูล! -
พิมพ์
TDBGridToExcel = คลาส (TComponent)
ส่วนตัว
แบบฟอร์มความคืบหน้า: TForm;
FShowProgress: บูลีน;
ExcelApp : ตัวแปร;
FTitle: สตริง;
ออก: บูลีน;
FOnProgress: TNotifyEvent;
FGrid: TDBGrid; {ตารางต้นทาง}
แถบความคืบหน้า: TProgressBar;
พร้อมท์: TLabel;
FAutoExit: บูลีน;
FAutoSize: บูลีน;
FDBGrid: TDBGrid;
ขั้นตอน SetShowProgress (ค่า const: บูลีน);
ขั้นตอน CreateProgressForm;
ขั้นตอน ButtonClick (ผู้ส่ง: TObject);
ฟังก์ชัน ConnectToExcel: บูลีน;
ขั้นตอน ExportDBGrid;
{ประกาศส่วนตัว}
ได้รับการคุ้มครอง
{ ประกาศที่ได้รับการคุ้มครอง }
สาธารณะ
ตัวสร้างสร้าง (AOwner: TComponent);
ทำลายล้าง();
ขั้นตอนการส่งออกไปยัง Excel; {ส่งออกตารางไปยัง Excel}
{ประกาศสาธารณะ}
ที่ตีพิมพ์
{ ประกาศที่เผยแพร่ }
คุณสมบัติ DBGrid: TDBGrid อ่าน FDBGrid เขียน FDBGrid;
ชื่อคุณสมบัติ: สตริงอ่าน FTitle เขียน FTitle;
คุณสมบัติ ShowProgress: บูลีนอ่าน FShowProgress เขียน SetShowProgress;
คุณสมบัติ OnProgress: TNotifyEvent อ่าน FOnProgress เขียน FOnProgress;
จบ;
ขั้นตอนการลงทะเบียน;
การดำเนินการ
ขั้นตอนการลงทะเบียน;
เริ่ม
RegisterComponents('ตัวอย่าง', [TDBGridToExcel]);
จบ;
{TDBGridToExcel}
ขั้นตอน TDBGridToExcel.ButtonClick (ผู้ส่ง: TObject);
เริ่ม
ออกจาก := MessageBox(ProgressForm.Handle, pchar(SConfirm), pchar(SCaption)
MB_OKCANCEL + MB_ICONINFORMATION) = IDOK;
จบ;
ฟังก์ชัน TDBGridToExcel.ConnectToExcel: บูลีน;
เริ่ม
ผลลัพธ์ := จริง;
พยายาม
ExcelApp := CreateOleObject('Excel.application');
ExcelApp.Visible := เท็จ;
ถ้า Title<>'' ดังนั้น ExcelApp.Caption := Title;
ExcelApp.WorkBooks.Add;
ยกเว้น
MessageBox(GetActiveWindow,PChar(SConnectExcelError),PChar(SError),Mb_OK+MB_IconError);
ผลลัพธ์ := เท็จ;
จบ;
จบ;
ตัวสร้าง TDBGridToExcel.Create (AOwner: TComponent);
เริ่ม
สืบทอด;
FShowProgress := True; {ค่าเริ่มต้นคือแสดงความคืบหน้า}
FAutoExit := เท็จ;
FAutoSize := จริง;
จบ;
ขั้นตอน TDBGridToExcel.CreateProgressForm;
var
แผงหน้าปัด: TPanel;
ปุ่ม: TButton;
เริ่ม
หากได้รับมอบหมาย (ProgressForm) ให้ออก {Aready Create?}
ProgressForm := TForm.Create (เจ้าของ);
ด้วย ProgressForm ทำ
เริ่ม
Font.Name := '宋体';
ขนาดตัวอักษร := 10;
BorderStyle := bsNone;
ความกว้าง := 280;
ส่วนสูง := 120;
ความกว้างของเส้นขอบ := 1;
สี := clBackground;
ตำแหน่ง := poOwnerFormCenter;
จบ;
แผงหน้าปัด := TPanel.Create (ProgressForm);
ด้วยแผงทำ { สร้างแผง }
เริ่ม
ผู้ปกครอง := ProgressForm;
จัดแนว := alClient;
BevelInner := bvNone;
เอียงด้านนอก := bvRaised;
คำบรรยายภาพ := '';
จบ;
พร้อมท์ := TLabel.Create(แผง);
ด้วยคำสั่งให้ทำ {Create Label}
เริ่ม
ผู้ปกครอง := แผง;
ซ้าย := 20;
บนสุด := 25;
คำบรรยายภาพ := SConnectExcel;
จบ;
ProgressBar := TProgressBar.Create (แผง);
ด้วย ProgressBar ทำ { สร้าง ProgressBar }
เริ่ม
ขั้นตอน := 1;
ผู้ปกครอง := แผง;
ราบรื่น := จริง;
ซ้าย := 20;
บนสุด := 50;
ส่วนสูง := 18;
ความกว้าง := 260;
จบ;
ปุ่ม := TButton.Create (แผง);
ด้วยปุ่มทำ { สร้างปุ่มยกเลิก }
เริ่ม
ผู้ปกครอง := แผง;
ซ้าย := 115;
บนสุด := 80;
คำบรรยายภาพ := SCancel;
OnClick := ปุ่มคลิก;
จบ;
ProgressForm.Show;
ProgressForm.อัปเดต;
จบ;
ตัวทำลาย TDBGridToExcel.Destroy;
เริ่ม
สืบทอด;
จบ;
ขั้นตอน TDBGridToExcel.ExportDBGrid;
var
ข้อมูล: TDataSet;
ADBGrid: TDBGrid;
ฉัน, เจ : จำนวนเต็ม;
CurrentPoint : ตัวชี้;
OldBeforeScroll, OldAfterScroll: TDataSetNotifyEvent;
เริ่ม
หน้าจอ เคอร์เซอร์ := crHourGlass;
พยายาม
พยายาม
TForm(เจ้าของ).เปิดใช้งาน := เท็จ;
ExcelApp.DisplayAlerts := เท็จ;
ExcelApp.ScreenUpdating := เท็จ;
ออก := false;
ถ้า ShowProgress แล้ว Prompt.Caption := SPromptExport;
ADBGrid := DBGrid;
ข้อมูล := ADBGrid.DataSource.DataSet;
ด้วย ADBGrid ทำ { แทรกส่วนหัวของตาราง }
สำหรับ i := 1 ถึง Columns.Count do
ถ้าคอลัมน์ [i - 1] มองเห็นได้แล้ว
ExcelApp.Cells[1,i].Value :=Columns[i - 1].Title.Caption;
CurrentPoint := Data.GetBookmark; {บันทึกตำแหน่งปัจจุบัน}
OldBeforeScroll := Data.BeforeScroll; { บันทึกเหตุการณ์เก่าก่อนเลื่อน }
OldAfterScroll := Data.AfterScroll; { บันทึกตัวจัดการเหตุการณ์ AfterScroll เก่า }
Data.DisableControls; { ปิดการใช้งานการควบคุม }
Data.BeforeScroll := ไม่มี;
Data.AfterScroll := ไม่มี;
ถ้า ShowProgress แล้ว ProgressBar.Max := Data.RecordCount;
ฉัน := 2;
ข้อมูล.First;
ในขณะที่ไม่ใช่ Data.Eof ทำ { ประมวลผลบันทึกทั้งหมด }
เริ่ม
ด้วย ADBGrid ทำ { ประมวลผลหนึ่งบันทึก }
สำหรับ j := 1 ถึง Columns.Count do
ถ้า Columns[j - 1].มองเห็นได้แล้ว
ExcelApp.Cells[i,j].Value := คอลัมน์[j - 1].Field.DisplayText;
อิงค์(i);
ข้อมูลถัดไป;
ถ้าได้รับมอบหมาย (FOnProgress) แล้ว FOnProgress (ตนเอง);
ถ้า ShowProgress แล้ว { อัปเดต UI ความคืบหน้า }
เริ่ม
ProgressBar.StepIt;
แอปพลิเคชัน กระบวนการข้อความ;
ถ้าออกก็ออก;
จบ;
จบ;
ยกเว้น
MessageBox(GetActiveWindow,PChar(SConnectExcelError),Pchar(SError),MB_OK+MB_ICONERROR);
จบ;
ExcelApp.Visible := เท็จ;
TForm(เจ้าของ).เปิดใช้งานแล้ว := True;
Screen.Cursor := crDefault;
ถ้า ShowProgress แล้ว FreeAndNil (ProgressForm);
ExcelApp.DisplayAlerts := จริง;
ExcelApp.ScreenUpdating := จริง;
ในที่สุด
Data.BeforeScroll := OldBeforeScroll; { คืนค่าตัวจัดการเหตุการณ์เก่า }
Data.AfterScroll := OldAfterScroll;
Data.GotoBookmark (จุดปัจจุบัน);
Data.FreeBookmark (จุดปัจจุบัน);
ข้อมูล.EnableControls;
Screen.Cursor := crDefault;
จบ;
จบ;
ขั้นตอน TDBGridToExcel.ExportToExcel;
เริ่ม
ถ้า DBGrid= ไม่มี ให้เพิ่ม Exception.Create(SGridError); {ไม่มีแหล่งข้อมูล แล้วเกิดข้อผิดพลาด}
ถ้า ShowProgress แล้ว CreateProgressForm {ไม่ว่าจะแสดง ProgressForm หรือไม่}
ถ้าไม่ใช่ ConnectToExcel ให้ { ออกเมื่อเกิดข้อผิดพลาด }
เริ่ม
ถ้า ShowProgress แล้ว FreeAndNil (ProgressForm);
ออก;
จบ;
ExportDBGrid; {เริ่มส่งออกข้อมูล}
จบ;
ขั้นตอน TDBGridToExcel.SetShowProgress (ค่า const: บูลีน);
เริ่ม
FShowProgress := ค่า;
จบ;
จบ.