2008-09-22 5 views
1

je voudrais avoir quelque chose comme ceci:cadre pour lier les propriétés d'objet à WTL contrôle

class Foo { 
private: 
    int bar; 
public: 
    void setBar(int bar); 
    int getBar() const; 
} 

class MyDialog : public CDialogImpl<MyDialog> { 
    BEGIN_MODEL_MAPPING() 
    MAP_INT_EDITOR(m_editBar, m_model, getBar, setBar); 
    END_MODEL_MAPPING() 
    // other methods and message map 
private: 
    Foo * m_model; 
    CEdit m_editBar; 
} 

il serait aussi grand si je pouvais fournir mes validations personnalisés:

MAP_VALIDATED_INT_EDITOR(m_editBar, m_model, getBar, setBar, validateBar) 
... 
bool validateBar (int value) { 
    // custom validation 
} 

Avez-personne vu quelque chose comme ça?

P.S. Je n'aime pas DDX parce que c'est vieux et ce n'est pas flexible, et je ne peux pas utiliser des getters et setters.

Répondre

0

Les Cocoa Bindings fournissent exactement ce que vous voulez, mais ils sont uniquement disponibles dans le mot Mac/Objective-C. GNUstep est une version gratuite, mais c'est toujours Objective-C, pas C++. Cependant, il pourrait être une bonne source d'inspiration pour un cadre propre, ou un bon point de départ pour d'autres recherches.

+0

Il est agréable d'entendre que cela * peut * être implémenté. "Recherche" en utilisant google n'apporte aucun résultat. S'il n'y aura plus de réponses, je devrai probablement écrire mon propre cadre. – cos

2

La carte DDX est juste une série d'instructions if, de sorte que vous pouvez facilement écrire votre propre macro DDX.

#define DDX_MAP_VALIDATED_INT_EDITOR(control, variable, getter, setter, validator)\ 
    if(nCtlID==control.GetDlgCtrlID())\ 
    {\ 
     if(bSaveAndValidate)\ 
     {\ 
      int const value=control.GetDlgItemInt();\ 
      if(validator(value))\ 
      {\ 
       variable->setter(value);\ 
      }\ 
      else\ 
      {\ 
       return false;\ 
      }\ 
     }\ 
     else\ 
     {\ 
      control.SetDlgItemInt(variable->getter());\ 
     }\ 
    } 

Ce n'est pas testé, mais devrait fonctionner selon votre exemple, si vous le mettez dans la carte DDX. Cela devrait vous donner l'idée. Bien sûr, vous pouvez extraire ceci dans une fonction, ce que font les macros DDX standard: elles font juste le if externe, puis appellent une fonction. Cela vous permettrait de surcharger la fonction pour différents types de variable (par exemple pointeur vs référence/valeur)