2012-12-19 27 views
10

मैंने कस्टम प्रॉपर्टी एडिटर डायलॉग बनाने पर कुछ ट्यूटोरियल्स का पालन किया है, लेकिन इसमें इतनी सारी चीज़ें शामिल हैं कि मैं इसे सही काम नहीं कर सका। जो मैं पूरा करने की कोशिश कर रहा हूं वह एक दिनांक पिकर (कैलेंडर), एक समय पिकर, और ठीक है और रद्द बटन के साथ एक कस्टम रूप है। फॉर्म बिल्कुल कोई समस्या नहीं है, लेकिन मैं इसे कार्यान्वित करने के बारे में कैसे जाउंगा ताकि मैं संपत्ति संपादक को लॉन्च करने के लिए बटन के साथ किसी निश्चित प्रकार के किसी भी घटक में कोई संपत्ति प्रकाशित कर सकूं?मैं एक निश्चित प्रकार के सभी उदाहरणों के लिए अपने स्वयं के कस्टम प्रॉपर्टी एडिटर को कैसे कार्यान्वित कर सकता हूं?

मैं पूरी तरह से TDateTime प्रकार ओवरराइड और उसके स्थान पर अपने कस्टम संपादक शब्दों में कहें, तो जहाँ भी एक TDateTime प्रकाशित किया है और वस्तु इंस्पेक्टर में दिखाई दे रहा है, मैं दोनों की तारीख और समय में एक ही में एक साथ संशोधित करने के लिए इस संपादक का उपयोग कर सकते करना चाहते हैं खिड़की।

समस्या यह है कि कस्टम प्रॉपर्टी एडिटर बनाने पर प्रलेखन खराब है और हालांकि कुछ संसाधन बहुत गहन हैं, लेकिन वे क्षमताओं की बहुत अधिक जानकारी में जाते हैं और सबसे आम परिदृश्यों पर बिंदु तक पहुंचने की कमी करते हैं।

उत्तर

14

मैं इस सवाल को यहां नहीं पूछना चाहता था और उम्मीद करता हूं कि कोई भी मेरे लिए इसका जवाब दे, इसलिए मैंने अपने मुद्दों को हल करने के लिए स्वयं शोध किया और मैं इस मिनी प्रोजेक्ट में शामिल अनूठा अनुभव साझा करना चाहता हूं, क्योंकि मैं ' मुझे यकीन है कि दूसरों को एक ही चीज़ से निराश हैं।

कस्टम संपत्ति संपादकों, संवाद, और घटक संपादकों के साथ कई अलग-अलग संभावनाएं हैं। यह विशेष रूप से 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 के सभी उदाहरणों पर लागू होगा। कुछ घटकों और संपत्ति के उदाहरणों के लिए विशिष्ट बनाने के बारे में अधिक जानकारी के लिए इस प्रक्रिया को देखें।

और यहाँ स्थापित करने के बाद अंतिम परिणाम है ...

Sample of final property editor

कस्टम गुण संपादकों जो योगदान के लिए कुछ अच्छे संसाधन इस प्रकार हैं:

  1. how to make custom component property?
  2. http://delphi.about.com/library/bluc/text/uc092501d.htm
  3. http://www.sandownet.com/propedit.html
+0

अधिक अच्छे संसाधन CNWizards या JediVCL जैसे फ्लॉस लाइब्रेरी हो सकते हैं, जो कुछ वैश्विक संपत्ति संपादकों को लागू और पंजीकृत करते हैं, बस पढ़ें और –

+0

सीखें और रे कोनोपाका [विकास कस्टम डेल्फी 3 घटक] को विकसित न करें (http: // www .amazon.com/विजुअल-डेवलपर-डेवलपिंग-कस्टम-घटक/डीपी/1576101126 /) डी 3 और अब प्रिंट में नहीं है, लेकिन अभी भी लागू है। रे के पास अपनी साइट पर बिक्री के लिए एक पीडीएफ संस्करण है: http://www.raize.com/DevTools/Ordering/Pricing.asp –

+0

+1 अच्छी तरह से किया गया। हालांकि समय और दिनांक नियंत्रण के क्रम को बदल देंगे ... ;-) – NGLN