2017-05-15 4 views
0

J'ai créé un TClientDataset personnalisé que j'ai ensuite enregistré en tant que composant de conception.Enregistrement de TClientDataSet personnalisé mais pas de champs créés dans le constructeur

TMyDataset = class(TClientDataset) 
public 
constructor Create(AOwner : TComponent); override; 
end; 

dans la méthode Create, je crée les champs de cet ensemble de données

implementation 

constructor TMyDataset.Create(aOwner : TComponent); 
var 
    lField : TStringField; 
begin 
    inherited Create(aOwner); 
    lField := TStringField.Create(Self); 
    lField.FieldName := 'NAME'; 
    lField.Dataset := Self; 
    Fields.Add(lField);  
end; 

Lors de l'enregistrement du composant en tant que telle

procedure Register; 
begin 
RegisterComponents('Queries', [TMyDataset]); 
end; 

Et laissant tomber le TMyDataset sur une forme, je pas voir le champ NAME dans la collection Fields de cet ensemble de données.

Mon but est de définir et d'enregistrer ces requêtes prédéfinies pour pouvoir les utiliser au moment du design.

Je voudrais empêcher quiconque utilisant ce composant de redéfinir les champs de cet ensemble de données, mais être capable de les voir dans l'éditeur visuel pour lier cxGrid ou tel (création automatique de colonne et ainsi de suite).

En outre, cet ensemble de données est uniquement un espace réservé pour un autre ensemble de données. Il servira uniquement à présenter la collection Fields à d'autres éditeurs visuels qui peuvent s'y lier.

Ma question est:

Pourquoi ne puis-je voir le champ que j'ai créé dans le constructeur dans l'éditeur visuel et comment puis-je le rendre visible?

Comment puis-je remplacer le comportement du composant pour ne jamais enregistrer les modifications de l'utilisateur sur ses TFields dans le DFM?

Merci

Répondre

1

Ce qui suit fonctionne très bien pour moi, y compris le domaine NAME montrant dans l'éditeur de champs TMyDataSet:

uses 
    SysUtils, Classes, DB, DBClient; 

type 
    TMyDataSet = class(TClientDataSet) 
    private 
    FMyStringField : TStringField; 
    function GetMyStringField: TStringField; 
    protected 
    public 
    constructor Create(AOwner : TComponent); override; 
    property MyStringField : TStringField read GetMyStringField; 
    published 
    end; 

procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterComponents('Data Access', [TMyDataSet]); 
end; 

{ TMyDataSet } 

constructor TMyDataSet.Create(AOwner: TComponent); 
begin 
    inherited; 
    FMyStringField := TStringField.Create(AOwner); 
    FMyStringField.FieldName := 'NAME'; 
    FMyStringField.Size := 80; 
    FMyStringField.DataSet := Self; 
end; 

function TMyDataSet.GetMyStringField: TStringField; 
begin 
    Result := FMyStringField; 
end; 

Vous devriez être en mesure d'identifier facilement la façon dont votre code doit modifier travailler De même. Vous omettez le Size du StringField pour une chose.

[tbc]

+0

Merci, je pense que le AOwner du champ doit être le propriétaire du DataSet, c'est ce qui a fonctionné quand je modifié mon code – Ludo

+0

Savez-vous comment je peux empêcher la modification de la DFM par l'utilisateur? (empêcher l'ajout/la modification de champs)? – Ludo

+0

"éviter la modification ..." Pas désinvolte, mais j'ai un sentiment @ réponse de SertacAkyuz à ce q de la mine peut être pertinente pour cela et le fait que Delphi se plaint d'un champ doublon 'NAME' en utilisant mon code: http: //stackoverflow.com/questions/38293072/how-to-correctly-stream-a-tcollection-property-of-a-subcomponent-eg-the-colum – MartynA