Bonjour, Je vous propose un nouvel élément à utiliser : Un exemple d'éditeur de propriété : un bouton avec caption extraite d'une base de donnée



Installation:

  1. Dézipper le fichier
  2. Ouvrir DVPDBButtonRT et compiler
  3. Ouvrir DVPDBButtonDE, compiler et installer


Si tout se passe bien, vous devez le nouveau composant dans l'onglet DVP.



Quelques explications ...



Regardez bien le fichier DVPDBButtonDEReg.cpp, class PACKAGE TDataFieldsProperty : public TStringProperty.

C'est une classe générique qui peut être utilisée chaque fois que vous utilisez une property de type AnsiString qui pointe sur une liste de champs d'une table.

Vous aurez peut être à modifier la méthode GetAttributes() qui doit fournir à l'éditeur de propriété de builder la liste des champs possibles (par exemple pour limiter à certains champs).



Ensuite pour chaque propriété de type AnsiString, il faut enregistrer l'éditeur de propriété.

Pour chaque champ, créer une fonction sur le modèle suivant :



Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PTypeInfo FieldNameTypeInfo(void)
{
      PPTypeInfo Temp;
 
      //
      // Pour simplifier l'accès à la propriété AinsiString [FieldName]
      //
      //     __typeinfo(le_nom_de_la_class_de_votre_composant)
      //
      //     "Fieldname"  Le nom de votre propriété dans __published
      //
 
      Temp = GetPropInfo(__typeinfo(TDVPDBButton), "FieldName")->PropType;
      assert(Temp != NULL);
      return *Temp;  
}

Puis enregistrer votre éditeur de propriété :



Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void __fastcall PACKAGE Register()
{
    TComponentClass classes[1] = {__classid(TDVPDBButton)};
 
    //
    // Enregistrement du composant
    //
 
    RegisterComponents("DVP-DVSoft", classes, 0);
 
    //
    // Enregistrement de l'editeur de property pour les noms de champs
    // de la property [FieldName] du composant [TDVPDBButton]
    //
 
    RegisterPropertyEditor(FieldNameTypeInfo(),
                                   __classid(TDVPDBButton),
                                   "FieldName",
                                   __classid(TDataFieldsProperty));
 
}
N'oubliez pas d'ajouter le paquet designide.bpi et MonComposantRT.bpi au projet et de sélectionner dans les options [Seulement en conception].

Votre paquet MonComposantRT, lui, doit avoir dans les options [Seulement en execution].



Qu'en pensez-vous ?