9. Dal╣φ p°φklady komponent
  1. 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).

  2. __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);
      }
    }
  3. 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:

  4. 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;
    }
  5. 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

  6. 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();
    }
  7. 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:

  8. 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.
  9. 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.
9. Dal╣φ p°φklady komponent