ส่วนประกอบ Delphi และตัวแก้ไขคุณสมบัติ
(1) คำนำ
บทความนี้จะใช้ตัวอย่างเพื่ออธิบายการพัฒนาส่วนประกอบและตัวแก้ไขคุณสมบัติ
ตัวอย่าง (TdsWaitDialogEx) เป็นองค์ประกอบภาพที่แสดงกล่องโต้ตอบหลังจากเรียกใช้เมธอด show
ประกอบด้วย TAnimate ข้อความแจ้งสองข้อความ (เช่น TLabel) และแถบความคืบหน้า (TGauge)
คุณสมบัติการแจงนับ: DialogStyle, AViposition
คุณสมบัติบันทึก: ตัวเลือก
วัตถุคอลเลกชันคุณสมบัติสืบทอดมาจาก TPersistent ในตัวอย่างนี้ คอลเลกชันคุณสมบัติ AVISource ประกอบด้วย TAnimate
คุณสมบัติแอนิเมชั่น CommonAVI, FileName
ตัวแก้ไขคุณสมบัติใช้กับคุณสมบัติ FileName ของ AVISource นั่นคือ ชื่อไฟล์สตริง จะปรากฏขึ้นเมื่อทำการแก้ไข
TOpenDialog ตัวกรองการกรองของมันคือ *.avi
(2) แพ็คเกจส่วนประกอบ dsDlgPack.dpk
เพื่ออำนวยความสะดวกในการเผยแพร่ การติดตั้ง ฯลฯ ต้องใช้แพ็คเกจคอมโพเนนต์ .dpk
ในเวอร์ชันหลัง Delphi6 (ฉันไม่รู้เกี่ยวกับเวอร์ชันก่อน D5) มีไฟล์หลายไฟล์ที่ Delphi ยังไม่ได้เผยแพร่ เช่น PROxies
หากใช้ไฟล์เหล่านี้เมื่อติดตั้งส่วนประกอบ คุณสามารถข้ามไฟล์เหล่านี้และใช้แพ็คเกจที่มีไฟล์เหล่านั้นได้
ในตัวอย่างนี้ ตัวแก้ไขคุณสมบัติใช้ไฟล์ DesignEditors และจำเป็นต้องมีไฟล์ Proxies ใน DesignEditors ดังนั้นคอมโพเนนต์นี้จึงถูกเผยแพร่
แพ็คเกจ (.dpk) มี designide ซึ่งแก้ปัญหาที่ไม่มีพรอกซี เพื่อให้การติดตั้งส่วนประกอบสำเร็จ
แพ็คเกจ dsDlgPack;
-
กำหนดให้มี
rtl,
วีซีแอล,
VclSmp,
ออกแบบ;
ประกอบด้วย
dsDlgWaitEx ใน 'dsDlgWaitEx.pas' {DlgWaitEx}
dsDlgWaitExReg ใน 'dsDlgWaitExReg.pas';
จบ.
(3) ไฟล์การลงทะเบียนส่วนประกอบ dsDlgWaitExReg.pas
คำถาม: ทำไมเราจึงต้องใช้ไฟล์ดังกล่าวบ่อยขึ้น เพราะ:
หากรหัสใน dsDlgWaitExReg.pas ถูกรวมเข้ากับ dsDlgWaitEx.pas แม้ว่า designide จะรวมอยู่ใน dsDlgPack.dpk
แก้ไขปัญหาของพร็อกซีที่ไม่มีอยู่เมื่อติดตั้งส่วนประกอบ แต่ปัญหาของพร็อกซีที่ไม่มีอยู่ยังคงเกิดขึ้นเมื่อแอปพลิเคชันเรียกใช้ส่วนประกอบนี้
เนื่องจากจำเป็นต้องใช้ไฟล์ Proxies ใน DesignEditors ดังนั้นโค้ดต่อไปนี้จึงถูกสร้างเป็นไฟล์แยกต่างหาก และแอปพลิเคชันจะเรียกกลุ่มนี้
ไฟล์ไม่จำเป็นต้องใช้ dsDlgWaitExReg.pas และสามารถเลี่ยงผ่าน Proxies ได้โดยไม่มีปัญหาใดๆ
หน่วย dsDlgWaitExReg;
อินเตอร์เฟซ
ใช้คลาส, ไดอะล็อก, ฟอร์ม, dsDlgWaitEx, DesignIntf, DesignEditors;
พิมพ์
TdsAVIFileNameProperty = class(TStringProperty) //ตัวแก้ไขคุณสมบัติใช้ไฟล์ DesignEditors
สาธารณะ
ฟังก์ชัน GetAttributes: TPropertyAttributes; override; // แทนที่เมธอด
ขั้นตอนการแก้ไข; แทนที่; // แทนที่วิธีการ
จบ;
ขั้นตอนการลงทะเบียน;
การดำเนินการ
ขั้นตอนการลงทะเบียน;
เริ่ม
//ลงทะเบียนส่วนประกอบนี้ไปที่หน้าส่วนประกอบ Delisoft
RegisterComponents('Delisoft', [TdsWaitDialogEx]);
//ลงทะเบียนตัวแก้ไขคุณสมบัตินี้
RegisterPropertyEditor (TypeInfo (สตริง), TdsAVISource, 'ชื่อไฟล์', TdsAVIFileNameProperty);
จบ;
{TdsAVIFileNameProperty}
ฟังก์ชัน TdsAVIFileNameProperty.GetAttributes:TPropertyAttributes;
เริ่ม
ผลลัพธ์:=[paDialog];
จบ;
ขั้นตอน TdsAVIFileNameProperty.Edit;
เริ่ม
ด้วย TOpenDialog.Create(application) ทำ
พยายาม
Filter:='ไฟล์ AVI(*.avi)|*.avi|ไฟล์ทั้งหมด(*.*)|*.*';
ถ้า Execute แล้ว SetStrValue(FileName);
ในที่สุด
ฟรี;
จบ;
จบ;
จบ.
(4) ไฟล์คอมโพเนนต์ dsDlgWaitEx.pas
หน่วย dsDlgWaitEx;
{กำหนดคุณสมบัติและวิธีการทั้งหมดของส่วนประกอบนี้ คุณสมบัติ BorderStyle ของแบบฟอร์ม TDlgWaitEx คือ bsDialog ในตัวอย่างนี้ ส่วนประกอบ TdsDlgWaitEx ใช้แบบฟอร์ม TDlgWaitEx; ใช้คุณสมบัติการแจงนับ (DialogStyle, AVIPosition) และคุณสมบัติบันทึก (ตัวเลือก) เป็นต้น
-
อินเตอร์เฟซ
การใช้งาน
Windows, ข้อความ, SysUtils, ตัวแปร, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม,
กล่องโต้ตอบ, StdCtrls, มาตรวัด, ComCtrls;
พิมพ์
TDialogStyle = (dlgNormal, dlgStayOnTop);
TAVIPosition = (aviLeft, aviTop, aviBottom);
TDlgOptions = ชุดของ (showAVI,showCaption,showMessage1,showMessage2,showProgress,ShowProgressText);
TDlgWaitEx = คลาส (TForm)
เคลื่อนไหว 1: แทนนิเมชั่น;
เกจ1: TGauge;
Label1: TLabel;
Label2: TLabel;
ขั้นตอน FormClose (ผู้ส่ง: TObject; var Action: TCloseAction);
ส่วนตัว
FCloseAfter: DWord;
FUserFormClose: TCloseEvent;
สาธารณะ
คุณสมบัติ UserFormClose: TCloseEvent อ่าน FUserFormClose เขียน FUserFormClose;
คุณสมบัติ CloseAfter: DWORD อ่าน FCloseAfter เขียน FCloseAfter;
จบ;
TdsAVISource = คลาส (TPersistent)
ส่วนตัว
FCommonAVI: TCommonAVI;
FFileName: สตริง;
ขั้นตอน SetCommonAVI (ค่า const: TCommonAVI);
ขั้นตอน SetFileName (ค่า const: string);
ได้รับการคุ้มครอง
สาธารณะ
ที่ตีพิมพ์
คุณสมบัติ CommonAVI: TCommonAVI อ่าน FCommonAVI เขียน aviNone เริ่มต้นของ SetCommonAVI;
คุณสมบัติ FileName: สตริง อ่าน FfileName เขียน SetFileName;
จบ;
TdsWaitDialogEx=คลาส(TComponent)
ส่วนตัว
//รูปร่าง
FDlgForm:TDlgWaitEx;
FMessage1: สตริง;
FMessage2: สตริง;
FMessage1Font:Tแบบอักษร;
FMessage2Font:Tแบบอักษร;
Fคำบรรยาย: สตริง;
FDislogStyle:TDialogStyle;
FwordWrap:บูลีน;
FOptions:TDlgOptions;
FShowMessage1,FShowMessage2:บูลีน;
//AVI
FaviPosition: TAVIPosition;
FaviActive:บูลีน;
FshowAVI:บูลีน;
FAVISource : TdsAVISource;
//ความคืบหน้า
FProgressMax:จำนวนเต็ม;
FProgressMin: จำนวนเต็ม;
FProgressPos: จำนวนเต็ม;
FProgressStep: จำนวนเต็ม;
FShowProgress: บูลีน;
FShowProgressText: บูลีน;
//เหตุการณ์
FOnPosChange: TNotifyEvent;
FOnShow: TNotifyEvent;
FOnFormHide: TCloseEvent;
ขั้นตอน SetProgressMax (ค่า const: จำนวนเต็ม);
ขั้นตอน SetProgressMin (ค่า const: จำนวนเต็ม);
ขั้นตอน SetProgressPos (ค่า const: จำนวนเต็ม);
ขั้นตอน SetProgressStep (ค่า const: จำนวนเต็ม);
ขั้นตอน DrawForm;
ฟังก์ชั่น setLableHeight (sCaption: สตริง): จำนวนเต็ม;
ขั้นตอน setOptions (ค่า const: TDlgOptions);
ขั้นตอน setMessage1 (ค่า const: สตริง);
ขั้นตอน setMessage2 (ค่า const: string);
ขั้นตอน setCaption (ค่า const: string);
ขั้นตอน SetMessage1Font (ค่า const: TFont);
ขั้นตอน SetMessage2Font (ค่า const: TFont);
ฟังก์ชัน IsMessage1FontStored: บูลีน;
ฟังก์ชัน IsMessage2FontStored: บูลีน;
ขั้นตอน setAVIPosition (ค่า const: TAVIPosition);
ขั้นตอน SetAVISource (ค่า const: TdsAVISource);
ขั้นตอน SetOnFormHide (ค่า const: TCloseEvent);
ได้รับการคุ้มครอง
ขั้นตอน DoPosChange เสมือน;
ขั้นตอน DoShow เสมือน;
สาธารณะ
ตัวสร้างสร้าง (AOwner: TComponent);
destructor ทำลายล้าง;
ขั้นตอน FormShow;
ขั้นตอน FormHide;
ขั้นตอน FormUpdate;
ขั้นตอน ProgressStepIt;
ที่ตีพิมพ์
//รูปร่าง
คุณสมบัติ Message1: สตริงอ่าน FMessage1 เขียน setMessage1;
คุณสมบัติ Message2: สตริงอ่าน FMessage2 เขียน setMessage2;
คุณสมบัติ Message1Font: TFont อ่าน FMessage1Font เขียน SetMessage1Font ที่เก็บไว้ IsMessage1FontStored;
คุณสมบัติ Message2Font: TFont อ่าน FMessage2Font เขียน SetMessage2Font ที่เก็บไว้ IsMessage2FontStored;
คุณสมบัติคำอธิบายภาพ: สตริงอ่าน FCaption เขียน setCaption;
คุณสมบัติ DislogStyle:TDialogStyle อ่าน FDislogStyle เขียน FDislogStyle;
คุณสมบัติ wordWrap :บูลีน อ่าน FwordWrap เขียน FwordWrap;
ตัวเลือกคุณสมบัติ: TDlgOptions อ่าน FOptions เขียน setOptions;
//AVI
คุณสมบัติ AviActive: บูลีนอ่าน FAviActive เขียน FAviActive;
คุณสมบัติ AviPosition: TAVIPosition อ่าน FaviPosition เขียน setAVIPosition;
คุณสมบัติ AviSource: TdsAVISource อ่าน FAVISource เขียน SetAVISource;
//ความคืบหน้า
คุณสมบัติ ProgressMax: จำนวนเต็มอ่าน FProgressMax เขียน SetProgressMax;
คุณสมบัติ ProgressMin: จำนวนเต็มอ่าน FProgressMin เขียน SetProgressMin;
คุณสมบัติ ProgressPos: จำนวนเต็มอ่าน FProgressPos เขียน SetProgressPos;
คุณสมบัติ ProgressStep: จำนวนเต็ม อ่าน FProgressStep เขียน SetProgressStep;
//เหตุการณ์
คุณสมบัติ OnPosChange: TNotifyEvent อ่าน FOnPosChange เขียน FOnPosChange;
คุณสมบัติ OnShow: TNotifyEvent อ่าน FOnShow เขียน FOnShow;
คุณสมบัติ OnHide: TCloseEvent อ่าน FOnFormHide เขียน SetOnFormHide;
จบ;
การดำเนินการ
{$R *.DFM}
{TdsAVISource}
ขั้นตอน TdsAVISource.SetCommonAVI (ค่า const: TCommonAVI);
เริ่ม
ถ้า Value = FCommonAVI ให้ออก;
FCommonAVI := ค่า;
ชื่อไฟล์:='';
จบ;
ขั้นตอน TdsAVISource.SetFileName (ค่า const: string);
เริ่ม
ถ้า Value = FfileName ให้ออก;
FfileName:=ค่า;
FCommonAVI:=aviNone;
จบ;
{TdsWaitDialogEx}
ขั้นตอน TdsWaitDialogEx.DoShow;
เริ่ม
ถ้าได้รับมอบหมาย (FOnShow) แล้ว FOnShow (ตนเอง);
จบ;
ขั้นตอน TdsWaitDialogEx.DoPosChange;
เริ่ม
ถ้าได้รับมอบหมาย (FOnPosChange) แล้ว FOnPosChange (ตนเอง);
จบ;
ขั้นตอน TdsWaitDialogEx.SetAVISource (ค่า const: TdsAVISource);
เริ่ม
ถ้า FAVISource=value ให้ออก;
FAVISource.Assign (ค่า);
ถ้า (FAVISource.FFileName='')และ(FAVISource.FCommonAVI=aviNone) แล้ว FshowAVI:=false;
ถ้าได้รับมอบหมาย (FDlgForm) แล้ว
เริ่ม
FDlgForm.Animate1.Active:=false;
FDlgForm.Animate1.FileName := '';
FDlgForm.Animate1.CommonAVI := aviNone;
ถ้า FshowAVI แล้ว
เริ่ม
ถ้า FAVISource.FfileName='' แล้ว
FDlgForm.Animate1.CommonAVI := FAVISource.FCommonAVI
อื่น
FDlgForm.Animate1.FileName := FAVISource.FfileName;
FDlgForm.Animate1.Active:=true;
จบ;
DrawForm; //Animate1->หลังจากการเปลี่ยนแปลง AVI ขนาดของ Animate1 อาจเปลี่ยนแปลง ==> DrawForm
FDlgForm.อัพเดต;
จบ;
จบ;
ฟังก์ชัน TdsWaitDialogEx.IsMessage1FontStored: บูลีน;
เริ่ม
ด้วย FMessage1Font ทำ
ผลลัพธ์ :=
(ชื่อ <> 'MS Sans Serif') หรือ
(รูปแบบ <> []) หรือ
(ขนาด <> 8) หรือ
(สี <> clWindowText) หรือ
(ชุดอักขระ <> DEFAULT_CHARSET) หรือ
(สนาม <> fpDefault);
จบ;
ฟังก์ชัน TdsWaitDialogEx.IsMessage2FontStored: บูลีน;
เริ่ม
ด้วย FMessage2Font ทำ
ผลลัพธ์ :=
(ชื่อ <> 'MS Sans Serif') หรือ
(รูปแบบ <> []) หรือ
(ขนาด <> 8) หรือ
(สี <> clWindowText) หรือ
(ชุดอักขระ <> DEFAULT_CHARSET) หรือ
(สนาม <> fpDefault);
จบ;
ขั้นตอน TdsWaitDialogEx.SetMessage1Font (ค่า const: TFont);
เริ่ม
FMessage1Font.Assign (ค่า);
ถ้าได้รับมอบหมาย (FDlgForm) แล้ว
เริ่ม
FDlgForm.Label1.Font.Assign (ค่า);
FDlgForm.อัพเดต;
จบ;
จบ;
ขั้นตอน TdsWaitDialogEx.SetMessage2Font (ค่า const: TFont);
เริ่ม
FMessage2Font.Assign (ค่า);
ถ้าได้รับมอบหมาย (FDlgForm) แล้ว
เริ่ม
FDlgForm.Label2.Font.Assign (ค่า);
FDlgForm.อัพเดต;
จบ;
จบ;
ขั้นตอน TdsWaitDialogEx.setCaption (ค่า const: string);
เริ่ม
ถ้า value=FCaption ให้ออก;
Fคำบรรยาย:=value;
ถ้าไม่ (showCaption ใน FOptions) แล้ว
เริ่ม
Fคำบรรยาย:='';
ออก;
จบ;
ถ้าได้รับมอบหมาย (FDlgForm) แล้ว
เริ่ม
FDlgForm.Caption := ค่า;
FDlgForm.อัพเดต;
จบ;
จบ;
ขั้นตอน TdsWaitDialogEx.setMessage1 (ค่า const: string);
var i: จำนวนเต็ม;
เริ่ม
ถ้า value=FMessage1 ให้ออก;
FMessage1:=ค่า;
ถ้าได้รับมอบหมาย (FDlgForm) แล้ว
เริ่ม
ถ้าไม่ (showMessage1 ใน FOptions) ให้ออก;
FDlgForm.Label1.Caption := ค่า;
i:=setLableHeight(FMessage1)+13;
ถ้า i<>FDlgForm.Label1.Height แล้ว DrawForm;
FDlgForm.อัพเดต;
จบ;
จบ;
ขั้นตอน TdsWaitDialogEx.setMessage2 (ค่า const: string);
var i: จำนวนเต็ม;
เริ่ม
ถ้า value=FMessage2 ให้ออก;
FMessage2:=ค่า;
ถ้าได้รับมอบหมาย (FDlgForm) แล้ว
เริ่ม
ถ้าไม่ (showMessage2 ใน FOptions) ให้ออก;
FDlgForm.Label2.Caption := ค่า;
i:=setLableHeight(FMessage2)+13;
ถ้า i<>FDlgForm.Label2.Height แล้ว DrawForm;
FDlgForm.อัพเดต;
จบ;
จบ;