मैं इस सवाल को यहां नहीं पूछना चाहता था और उम्मीद करता हूं कि कोई भी मेरे लिए इसका जवाब दे, इसलिए मैंने अपने मुद्दों को हल करने के लिए स्वयं शोध किया और मैं इस मिनी प्रोजेक्ट में शामिल अनूठा अनुभव साझा करना चाहता हूं, क्योंकि मैं ' मुझे यकीन है कि दूसरों को एक ही चीज़ से निराश हैं।
कस्टम संपत्ति संपादकों, संवाद, और घटक संपादकों के साथ कई अलग-अलग संभावनाएं हैं। यह विशेष रूप से TDateTimeProperty
वंश के लिए कॉल करेगा। यह आपको डेटटाइम स्वरूपण को रखते हुए ऑब्जेक्ट इंस्पेक्टर में सादा पाठ (स्ट्रिंग) के रूप में सीधे संपत्ति के मूल्य को संपादित करने में सक्षम होने की अनुमति देगा।
मुझे लगता है कि आपके पास पहले से ही कस्टम घटकों और एक पैकेज बनाने का सामान्य ज्ञान है जिसमें आप इस संपत्ति संपादक को प्रकाशित कर सकते हैं, क्योंकि यह एक सबक है जिसे मैं कवर नहीं करूंगा। यह Register
प्रक्रिया के अंदर कोड की केवल एक पंक्ति के लिए कॉल किया जाता है, लेकिन हम बाद में उस पर पहुंच जाएंगे।
सबसे पहले, आपको अपने Design-Time
पैकेज में एक नया फॉर्म बनाने की आवश्यकता है, जहां आपके घटक पंजीकृत हैं। यूनिट DateTimeProperty.pas
नाम दें, और फॉर्म DateTimeDialog
नाम दें (इस प्रकार फॉर्म का वर्ग TDateTimeDialog
बनाते हैं)। जहाँ जो कुछ भी नियंत्रित करता है आप (dtkTime
के साथ Kind
सेट) इस मामले में की जरूरत है, एक TMonthCalendar
, TDateTimePicker
, और 2 TBitBtn
नियंत्रण, एक mrOK
की ModalResult
और अन्य mrCancel
की ModalResult
साथ Cancel
लेबल के साथ OK
लेबल।
आपका इकाई कुछ इस तरह दिखना चाहिए:
unit DateTimeProperty;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.ComCtrls, Vcl.StdCtrls, Vcl.Buttons;
type
TDateTimeDialog = class(TForm)
dtDate: TMonthCalendar;
dtTime: TDateTimePicker;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
private
public
end;
var
DateTimeDialog: TDateTimeDialog;
implementation
{$R *.dfm}
end.
और यहाँ इस फार्म के पीछे DFM
कोड है: अब
object DateTimeDialog: TDateTimeDialog
Left = 591
Top = 158
BorderIcons = [biSystemMenu]
BorderStyle = bsToolWindow
Caption = 'Pick Date/Time'
ClientHeight = 231
ClientWidth = 241
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
DesignSize = (
241
231)
PixelsPerInch = 96
TextHeight = 13
object dtDate: TMonthCalendar
Left = 8
Top = 31
Width = 225
Height = 166
Anchors = [akLeft, akRight, akBottom]
Date = 41261.901190613430000000
TabOrder = 1
end
object dtTime: TDateTimePicker
Left = 8
Top = 8
Width = 113
Height = 21
Date = 41261.000000000000000000
Time = 41261.000000000000000000
Kind = dtkTime
TabOrder = 2
end
object BitBtn1: TBitBtn
Left = 158
Top = 200
Width = 75
Height = 25
Caption = 'OK'
Default = True
ModalResult = 1
TabOrder = 0
end
object BitBtn2: TBitBtn
Left = 77
Top = 200
Width = 75
Height = 25
Caption = 'Cancel'
ModalResult = 2
TabOrder = 3
end
end
, अपने uses
खंड के DesignEditors
और DesignIntf
जोड़ें। सुनिश्चित करें कि आपके पास DesignIDE
पैकेज के Requires
में घोषित किया गया है। यह किसी भी संपत्ति संपादकों को प्रकाशित करने के लिए आवश्यक है।
इस रूप में, DateTime
नामक एक नई सार्वजनिक संपत्ति बनाएं जिसे TDateTime
प्रकार के प्रॉपर्टी गेटर और सेटर के साथ टाइप करें। यह संपत्ति आपको वास्तव में प्रतिनिधित्व किए गए चयन को पूर्ण TDateTime
मूल्य को आसानी से पढ़ने/लिखने की अनुमति देगी।तो आपको इसे अपने फॉर्म में रखना चाहिए:
private
function GetDateTime: TDateTime;
procedure SetDateTime(const Value: TDateTime);
public
property DateTime: TDateTime read GetDateTime write SetDateTime;
....
function TDateTimeDialog.GetDateTime: TDateTime;
begin
Result:= Int(dtDate.Date) + Frac(dtTime.Time);
end;
procedure TDateTimeDialog.SetDateTime(const Value: TDateTime);
begin
dtDate.Date:= Value;
dtTime.DateTime:= Value;
end;
अगला हमें वास्तविक संपत्ति संपादक वर्ग जोड़ने की आवश्यकता है। बस {$R *.dfm}
नीचे इस वर्ग बनाएं जो सिर्फ implementation
के तहत:
procedure Register;
begin
RegisterPropertyEditor(TypeInfo(TDateTime), nil, '', TDateTimeEditor);
end;
अब वहाँ एक:
type
TDateTimeEditor = class(TDateTimeProperty)
public
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
function GetValue: String; override;
procedure SetValue(const Value: String); override;
end;
procedure TDateTimeEditor.Edit;
var
F: TDateTimeDialog;
begin
//Initialize the property editor window
F:= TDateTimeDialog.Create(Application);
try
F.DateTime:= GetFloatValue;
if F.ShowModal = mrOK then begin
SetFloatValue(F.DateTime);
end;
finally
F.Free;
end;
end;
function TDateTimeEditor.GetAttributes: TPropertyAttributes;
begin
//Makes the small button show to the right of the property
Result := inherited GetAttributes + [paDialog];
end;
function TDateTimeEditor.GetValue: String;
begin
//Returns the string which should show in Object Inspector
Result:= FormatDateTime('m/d/yy h:nn:ss ampm', GetFloatValue);
end;
procedure TDateTimeEditor.SetValue(const Value: String);
begin
//Assigns the string typed in Object Inspector to the property
inherited;
end;
अंत में, हम इस नए संपत्ति संपादक की वास्तविक पंजीकरण करने के लिए एक Register
प्रक्रिया जोड़ने की जरूरत RegisterPropertyEditor
पर इस कॉल में समझने के लिए महत्वपूर्ण टुकड़ा। चूंकि दूसरे और तीसरे पैरामीटर nil
और एक खाली स्ट्रिंग हैं, इसलिए इसका अर्थ है कि संपादक TDateTime
के सभी उदाहरणों पर लागू होगा। कुछ घटकों और संपत्ति के उदाहरणों के लिए विशिष्ट बनाने के बारे में अधिक जानकारी के लिए इस प्रक्रिया को देखें।
और यहाँ स्थापित करने के बाद अंतिम परिणाम है ...
कस्टम गुण संपादकों जो योगदान के लिए कुछ अच्छे संसाधन इस प्रकार हैं:
- how to make custom component property?
- http://delphi.about.com/library/bluc/text/uc092501d.htm
- http://www.sandownet.com/propedit.html
अधिक अच्छे संसाधन CNWizards या JediVCL जैसे फ्लॉस लाइब्रेरी हो सकते हैं, जो कुछ वैश्विक संपत्ति संपादकों को लागू और पंजीकृत करते हैं, बस पढ़ें और –
सीखें और रे कोनोपाका [विकास कस्टम डेल्फी 3 घटक] को विकसित न करें (http: // www .amazon.com/विजुअल-डेवलपर-डेवलपिंग-कस्टम-घटक/डीपी/1576101126 /) डी 3 और अब प्रिंट में नहीं है, लेकिन अभी भी लागू है। रे के पास अपनी साइट पर बिक्री के लिए एक पीडीएफ संस्करण है: http://www.raize.com/DevTools/Ordering/Pricing.asp –
+1 अच्छी तरह से किया गया। हालांकि समय और दिनांक नियंत्रण के क्रम को बदल देंगे ... ;-) – NGLN