2009-02-11 14 views
6

मैं डेटासेट डालने से मानक डीबीएनविगेटर बार पर सम्मिलित बटन के व्यवहार को बदलना चाहता हूं।TDBNavigator घटक के व्यवहार को कैसे बदला जाए?

मैं बटन को पहले एक्शन ईवेंट में क्लिक कर सकता हूं, संलग्न करना आदि; और फिर ऑनक्लिक घटना में मूल डालने को रोक दिया जाता है, लेकिन यह एक हैक का थोड़ा सा लगता है। कोई बेहतर विचार? मैं डी 6 (घड़ी पर 500,000 किमी, और अभी भी मजबूत जा रहा हूँ) का उपयोग कर रहा हूँ।

किसी भी सलाह

सादर के लिए धन्यवाद,

PhilW।

उत्तर

10

आप टीडीबीएनविगेटर से अपनी कक्षा प्राप्त कर सकते हैं और बीटीएनक्लिक विधि को ओवरराइड कर सकते हैं। या, एक त्वरित और गंदी सुधार के लिए, आप डालने बटन के क्लिक हैंडलर रनटाइम पर, उदा, बदल सकता है, .:

type 
    THackDBNavigator = class(TDBNavigator); 

procedure TForm1.DBNavigatorInsertClick(Sender: TObject); 
var 
    DBNavigator: TDBNavigator; 
begin 
    DBNavigator := ((Sender as TControl).Parent as TDBNavigator); 
    if Assigned(DBNavigator.DataSource) and (DBNavigator.DataSource.State <> dsInactive) then 
    begin 
    if Assigned(DBNavigator.BeforeAction) then 
     DBNavigator.BeforeAction(DBNavigator, nbInsert); 

    DBNavigator.DataSource.DataSet.Append; 

    if Assigned(DBNavigator.OnClick) then 
     DBNavigator.OnClick(DBNavigator, nbInsert); 
    end; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    THackDBNavigator(DBNavigator1).Buttons[nbInsert].OnClick := DBNavigatorInsertClick; 
end; 
+0

लाजर में, फॉर्मक्रेट थैक डीबीएनविगेटर (myDBNavigator) पर उपयोग करके। Comtons [nbInsert] .nnClick: = DBNavigatorInsertClick; कॉल करने के लिए "DBNavigatorInsertClick" के लिए निर्दिष्ट मापदंडों की गलत संख्या: मैं एक त्रुटि पृष्ठभूमि में है: में त्रुटि। कोई सुझाव? – jcfaria

+0

लाजर के साथ, या तो उपयोग '{$ मोड डेल्फी}' या '@' ऑपरेटर: 'THackDBNavigator (DBNavigator1) .Buttons [nbInsert] .OnClick: = @DBNavigatorInsertClick;' –

+0

यह काम करता है! धन्यवाद। – jcfaria

1

वहाँ डालने और संलग्न के बीच सबसे अधिक डेटाबेस में कोई अंतर नहीं है। एक वास्तविक भौतिक डालने का मतलब वास्तव में सभी डेटा को स्थानांतरित करना होगा, जिस स्थान पर नई पंक्ति डाली जाएगी, एक पंक्ति के आकार के नीचे, और फिर नई खुली जगह में उस नई पंक्ति को लिखना होगा। यह सभी डिस्क गतिविधि की वजह से बहुत धीमी होगी।

डेटाबेस बजाय एक संलग्न है, जो भौतिक फ़ाइल के अंत में डेटा लिखता करते हैं, और सूचकांक क्रम रास्ता पंक्ति फ़ाइल में सही स्थान पर तैनात किया जाना प्रतीत होता है नियंत्रित करता है।

तो सबसे इरादों और मकसदों के लिए, तो आप शायद पहले से ही संलग्न बजाय एक डालने की हो रही है, जो विधि आप का उपयोग करें या क्या DBNavigator पर बटन का कहना है की परवाह किए बिना। यह सूचकांक है जो इसे अन्यथा प्रकट करता है।

आप एक सूचकांक के बिना एक डेटाबेस बनाने के द्वारा वैधता के लिए जाँच कर सकते हैं कि, और दोनों एक डालने और एक संलग्न कई बार करने का प्रयास करें, हर ऑपरेशन के बाद सावधानी से डेटा की जांच।

+0

यदि आप अपने डेटा को सम्मिलित/संलग्न करने के लिए ग्रिड घटक का उपयोग करते हैं, तो कम से कम यूआई स्टैंडपॉइंट से दोनों के बीच एक अंतर है। – onnodb

+0

लेकिन ऐसा इसलिए है क्योंकि यह वास्तव में डेटाबेस में डालने वाला नहीं है, बल्कि इसके बजाय ग्रिड है। यह अभी भी डीबी शारीरिक रूप से एक संलग्न है। –

0

@TOndrej: बढ़िया! मैंने इस तकनीक की सराहना नहीं की थी। धन्यवाद!

@ केन व्हाइट: मैं आपके बिंदु को समझता हूं, लेकिन मेरे उपयोगकर्ताओं के लिए दृष्टि से यह एक फर्क पड़ता है - डीबीएनविगेटर एक डीबीजीड को नियंत्रित करता है, जहां अधिकांश मामलों में, ग्रिड में बहुत सारी अप्रयुक्त पंक्तियां होती हैं। यह ग्रिड के निचले भाग में नए रिकॉर्ड दिखाई देने के लिए और अधिक सुसंगत प्रतीत होता है, फिर उस समय से ऊपर जहां वर्तमान रिकॉर्ड उस पल में है। लेकिन आपके उत्तर के लिए धन्यवाद।

सम्मान, फिलडब्ल्यू।

+0

फिल, आपने अपने प्रश्न में डीबीजीड के बारे में कुछ भी नहीं बताया है। उस स्थिति में, उपस्थिति मुद्दे के कारण टंड्रेज का उत्तर * बेहतर है। –

संबंधित मुद्दे