2008-12-03 7 views
4

J'essaye d'écrire un descendant de TCustomDBGrid qui est conçu pour se sentir comme un TListBox. Une des choses que je veux changer est la valeur par défaut de la propriété Options. TCustomDBGrid définit les options comme:Quelle est la manière la plus simple de remplacer la valeur par défaut d'une propriété Delphi?

property Options: TDBGridOptions read FOptions write SetOptions 
    default [dgEditing, dgTitles, dgIndicator, dgColumnResize, dgColLines, 
    dgRowLines, dgTabs, dgConfirmDelete, dgCancelOnExit]; 

Essayer de passer outre que dans ma classe avec

property Options: TDBGridOptions default 
    [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgCancelOnExit]; 

ne fonctionne pas; le compilateur attend lire ou écrivez après le type, pas par défaut. Le problème est que FOptions et SetOptions sont tous les deux définis comme privés, non protégés, dans TCustomDBGrid.

Dois-je écrire mes propres méthodes get et set qui invoquent "inherited Options", ou existe-t-il une façon plus simple de le faire?

+0

Je suis curieux aussi. Je travaille très bien dans C++ Builder de Borland. __property DefaultRowHeight = {default = 18}; – Jeremiah

Répondre

10

Ne spécifiez pas le type. Ensuite, vous pouvez changer la valeur par défaut. Et rappelez-vous que vous devez également définir la propriété Options sur cette valeur par défaut dans le constructeur. Le code ci-dessous ne définit pas la valeur par défaut, il lui permet juste de ne pas diffuser la valeur de la propriété lorsque la valeur est comme ça.

property Options default [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgCancelOnExit]; 
+0

Merci! Je savais qu'il devait y avoir un moyen simple de le faire ... –

2

Cela ne fonctionnerait pas dans un environnement d'exécution créé DBGrid ... Voir ce (de Guide du langage Delphi sur BDS 2006):


Les valeurs de propriété ne sont pas automatiquement initialisé à la valeur par défaut . Autrement dit, la directive par défaut ne contrôle que lorsque les valeurs de propriété sont enregistrées dans le fichier de formulaire, mais pas la valeur initiale de la propriété sur une instance nouvellement créée.


Pour les composants sur une forme dans le temps de conception, je pense qu'il n'y a pas de problème. Mais dans les contrôles créés d'exécution, je pense qu'il vaut mieux (je veux dire, plus sûr) pour faire le remplacement sur le constructeur:

constructor Create(Aowner:TComponent); 
begin 
    inherited; 
    Options := [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgCancelOnExit]; 
end; 

Pour faire les choses, faire la directive par défaut aussi:

property Options default [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, 
          dgCancelOnExit]; 
+0

En fait, vous devez faire les deux pour le faire correctement. Mais cette partie ne doit pas être oubliée ou ne fonctionnera pas du tout. Je l'ai fait remarquer dans ma réponse, mais pas avec un code comme vous l'avez fait. –

+0

Ok. Comme la plus grande partie de mon codage va aux classes non-visuelles, je ne m'inquiète pas tant de la directive par défaut (sauf pour les propriétés de tableau, où cette directive est BEAUCOUP plus utile) ... ;-) –

Questions connexes