Budeme pokraΦovat ve v²voji komponenty z p°edchozφ kapitoly a umo╛nφme
editovat p°ipojenou datovou polo╛ku. Proto╛e se jednß o editaΦnφ ovladaΦ
musφme implicitn∞ nastavit jeho vlastnost ReadOnly na false
(v konstruktoru i v definici vlastnosti).
__fastcall TDBCalendar::TDBCalendar (TComponent*
Owner) : TSampleCalendar(Owner) { FReadOnly = false;
// set the default value ... } Nßs ovladaΦ musφ reagovat na zprßvy Windows t²kajφcφ se my╣i (WM_LBUTTONDOWN,
WM_MBUTTONDOWN a WM_RBUTTONDOWN) a zprßvy klßvesnice (WM_KEYDOWN). K umo╛n∞nφ,
aby ovladaΦ reagoval na tyto zprßvy, musφme zapsat obsluhy reagujφcφ na
tyto zprßvy.
Chrßn∞nß metoda MouseDown je metoda pro udßlost ovladaΦe OnMouseDown.
OvladaΦ sßm volß MouseDown v reakci na zprßvu stisknutφ tlaΦφtka
my╣i od Windows. Kdy╛ p°episujeme zd∞d∞nou metodu MouseDown, m∙╛eme
vlo╛it k≤d, kter² poskytuje ostatnφ reakce volßnφm udßlosti OnMouseDown.
Do t°φdy TDBCalendar p°idßme metodu MouseDown:
class PACKAGE TDBCalendar : public TSampleCalendar { protected: virtual void __fastcall MouseDown(TMouseButton
Button,
TShiftState Shift, int X, int Y); }; a do souboru CPP tuto metodu zapφ╣eme:
void __fastcall TDBCalendar::MouseDown(TMouseButton
Button,
TShiftState Shift, int X, int Y) { TMouseEvent MyMouseDown; if (!FReadOnly && FDataLink->Edit()) TSampleCalendar::MouseDown(Button,
Shift, X, Y); else { MyMouseDown = OnMouseDown; if (MyMouseDown != NULL)
MyMouseDown(this, Button, Shift, X, Y); } } Kdy╛ MouseDown reaguje na zprßvu my╣i, pak zd∞d∞nß metoda MouseDown
je volßna pouze, jestli╛e vlastnost ReadOnly ovladaΦe je nastavena
na false a jestli╛e objekt datovΘho spoje je v editaΦnφm re╛imu
(polo╛ka m∙╛e b²t editovßna). Jestli╛e polo╛ka nem∙╛e b²t editovßna, pak
je provedena obsluha udßlosti OnMouseDown (existuje-li).
Metoda KeyDown je chrßn∞nß metoda pro udßlost OnKeyDown
ovladaΦe. OvladaΦ sßm volß KeyDown v reakci na zprßvu stisknutφ
klßvesy od Windows. Obdobn∞ jako MouseDown p°epφ╣eme i KeyDown:
class PACKAGE TDBCalendar : public TSampleCalendar { protected: virtual void __fastcall KeyDown(unsigned
short &Key,TShiftState Shift); }; Zapφ╣eme metodu KeyDown do souboru CPP:
void __fastcall TDBCalendar::KeyDown(unsigned
short &Key,TShiftState Shift) { TKeyEvent MyKeyDown; Set<unsigned short, 0, 8> keySet; keySet = keySet << VK_UP <<
VK_DOWN << VK_LEFT << VK_RIGHT << VK_END <<
VK_HOME << VK_PRIOR << VK_NEXT; if (!FReadOnly && (keySet.Contains(Key))
&& FDataLink->Edit()) TCustomGrid::KeyDown(Key,
Shift); else { MyKeyDown = OnKeyDown; if (MyKeyDown != NULL)
MyKeyDown(this, Key, Shift); } }
Jsou dva typy datov²ch zm∞n: zm∞na v hodnot∞ polo╛ky, kterß musφ b²t zohledn∞na
v ovladaΦi a zm∞na v ovladaΦi, kterß musφ b²t provedena v datovΘ polo╛ce.
Komponenta TDBCalendar mß metodu DataChange, kterß zpracovßvß
zm∞ny v hodnot∞ polo╛ky a tak prvnφ typ zm∞n je ji╛ o╣et°en. T°φda polo╛ky
datovΘho spoje mß udßlost OnUpdateData, kterß nastane, kdy╛ u╛ivatel
modifikuje obsah ovladaΦe. OvladaΦ kalendß°e mß metodu UpdateData,
kterou m∙╛eme pou╛φt k obslou╛enφ tΘto udßlosti. P°idßme tedy metodu UpdateData
do deklarace t°φdy formulß°e:
class PACKAGE TDBCalendar : public TSampleCalendar { private: void __fastcall UpdateData(TObject
*Sender); }; do souboru CPP zapφ╣eme metodu UpdateData:
void __fastcall TDBCalendar::UpdateData(TObject
*Sender) { FDataLink->Field->AsDateTime = CalendarDate; } a v konstruktoru TDBCalendar p°i°adφme metodu UpdateData
udßlosti OnUpdateData __fastcall TDBCalendar::TDBCalendar(TComponent*
Owner) : TSampleCalendar(Owner) { FDataLink = new TFieldDataLink(); FDataLink->OnDataChange = DataChange; FDataLink->OnUpdateData = UpdateData; }
Kdy╛ je nastavena novß hodnota, pak je volßna metoda Change ovladaΦe
kalendß°e.
Change volß obsluhu udßlosti OnChange (pokud existuje). U╛ivatel
komponenty m∙╛e zapsat k≤d obsluhy udßlosti OnChange k reagovßnφ
na zm∞nu datumu. Musφme tedy p°idat novou metodu Change do komponenty
TDBCalendar
class TDBCalendar : public TSampleCalendar { protected: virtual void __fastcall Change(); }; a zapsat metodu Change, volajφcφ metodu Modified, kterß
informuje datov² spoj, ╛e datum bylo zm∞n∞no a potom volß zd∞d∞nou metodu
Change:
void __fastcall TDBCalendar::Change() { if (FDataLink != NULL) FDataLink->Modified(); TSampleCalendar::Change(); }
Poslednφm krokem p°i vytvß°enφ editovatelnΘho ovladaΦe je aktualizace datovΘho
spoje na novou hodnotu. To nastßvß, kdy╛ zm∞nφme hodnotu v ovladaΦi a ovladaΦ
opustφme (klinutφm mimo ovladaΦ nebo stiskem klßvesy Tab). VCL mß definovßny
zprßvy pro operace s ovladaΦem. Nap°. zprßva CM_EXIT je zaslßna, kdy╛ u╛ivatel
ovladaΦ opustφ. M∙╛eme zapsat obsluhu zprßvy, kterß na zprßvu bude reagovat.
V na╣em p°φpad∞, kdy╛ u╛ivatel opustφ ovladaΦ, metoda CMExit (obsluha
zprßvy pro CM_EXIT) reaguje aktualizacφ zßznamu v datovΘm spoji na zm∞n∞nou
hodnotu. Do komponenty p°idßme obsluhu zprßvy:
class PACKAGE TDBCalendar : public TSampleCalendar { private: void __fastcall CMExit(TWMNoParams
&Message); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(CM_EXIT, TWMNoParams,
CMExit) END_MESSAGE_MAP(TSampleCalendar) }; a do souboru CPP zapφ╣eme:
void __fastcall TDBCalendar::CMExit(TWMNoParams
& Message) { try { FDataLink->UpdateRecord(); } catch(...) { SetFocus(); throw; } } Tφm je v²voj editovatelnΘ komponenty hotov.
Pokud se chcete s vytvß°enφm komponent dßle seznamovat, pak si m∙╛ete stßhnout
tento
soubor. Obsahuje zdrojovΘ k≤dy n∞kolika komponent. Jednß se o komponenty,
kterΘ jsou nainstalovanΘ na strßnce Sample Palety komponent. M∙╛ete
se v nich seznßmit s registracφ ovladaΦe, implementacφ editoru vlastnosti
a registracφ editoru vlastnosti.