2010-10-18 5 views
3

Je cherche un moyen de fournir un ListSource à un TDBLookupComboBox dans delphi sans avoir une table réelle sur le serveur de base de données pour dessiner cette liste. Le DataField pour la zone de liste déroulante est un champ à 1 caractère qui contient une valeur codée telle que 'A' = 'Driver License', 'B' = 'Passport', 'C' = 'Library Card', etc. que la table contient uniquement A, B ou C. L'application est responsable de l'affichage de «Drivers License» dans l'interface graphique. Normalement, une base de données peut avoir une table de consultation, mais cette base de données ne le fait pas et je ne peux pas en ajouter une. Mon idée est que DataSource et ListSource pour un contrôle DB Look-up ne doivent pas être la même base de données, donc s'il était possible de définir une petite table dans mon formulaire qui contient les données de recherche, je pourrais utiliser un pas besoin d'une vraie table de base de données.Incorporer un TDataSet dans un formulaire au moment du design

Est-ce que quelqu'un connaît un composant Delphi qui permet de définir un TDataSet sur un formulaire sans avoir de fichiers de données réels derrière lui?

Répondre

2

Une autre solution consiste à utiliser TComboBox plutôt que TDBLookupComboBox. Utilisez un TDictionary pour définir une recherche simple dans la mémoire.

type 
    TMyForm = class(TForm) 
    MyComboBox: TComboBox; 
    MyDataset: TSimpleDataSet; 
    procedure MyComboBoxChange(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private 
    ComboLookup: TDictionary<string, Char>; 
    end; 

implementation 

{$R *.dfm} 

procedure TMyForm.FormCreate(Sender: TObject); 
var 
    Key: string; 
begin 
    ComboLookup := TDictionary<string, Char>.Create; 
    ComboLookup.Add('Drivers License', 'A'); 
    ComboLookup.Add('Passport', 'B'); 
    ComboLookup.Add('Library Card', 'C'); 
    for Key in ComboLookup.Keys do 
    begin 
    MyComboBox.Items.Add(Key); 
    end; 
end; 

procedure TMyForm.MyComboBoxChange(Sender: TObject); 
begin 
    // This may be wrong didn't bother to look 
    //up the correct way to change a field's value in code. 
    MyDataset.Fields.FieldByName('IDCard').AsString := ComboLookup[MyComboBox.Text]; 
end; 

Vous pouvez utiliser TComboBox.Items.AddObject au lieu d'une table de recherche distincte mais vous devez créer une classe d'emballage pour stocker un char comme un TObject ou utiliser Chr pour le convertir en un entier puis convertion TObject mais un ci-dessus est plus simple à mon avis.

+0

Ce n'est pas ce que j'ai demandé, mais c'est une bonne solution.Mon seul problème est que le TDictionary doesn Je pense que vous suggérez l'utilisation d'une classe .Net, j'ai fini par créer un petit dictionnaire pour moi-même qui m'a permis d'utiliser cette solution. n'a pas tellement augmenté l'utilisation de la mémoire de mon programme et ne m'a pas obligé à ajouter quoi que ce soit à mon installateur, ce qui rend cette solution préférable à moi. –

-1

Si vous utilisez le jvcl, ce que vous voulez peut être accompli sans impliquer un ensemble de données. Utilisez simplement un TjvDBComboBox, utilisez la propriété Items pour définir les valeurs que l'interface utilisateur doit afficher et utilisez la propriété Values ​​pour définir les valeurs réelles stockées dans la base de données.

1

Utilisez un TClientDataset et définissez les champs, puis connectez-vous à une source de données. Dans l'événement oncreate du formulaire, procédez comme suit: exécutez la méthode createdataset du jeu de données client, puis remplissez-le avec les données A, B, C.

6

Je sais qu'il existe différents ensembles de données en mémoire. Delphi est livré avec TClientDataSet, que vous pouvez utiliser comme vous le souhaitez. Vous devez déployer midas.dll avec votre exécutable pour fonctionner, ou vous devez inclure le MidasLib dans votre clause uses afin de lier statiquement cette bibliothèque dans votre exécutable (pas midas.dll nécessaire à l'exécution).

Pour obtenir ce que vous voulez de TClientDataSet, vous pouvez créer des champs et:

  • stocker les enregistrements dans un fichier xml (par exemple avec un autre outil auxiliaire que vous avez fait). Lors de l'exécution, chargez les données avec la méthode LoadFromFile de TClientDataSet. De plus, vous pouvez stocker ce fichier XML en tant que ressource avec la directive $ R et manipuler cette ressource lors de l'exécution pour alimenter votre ClientDataSet avec les données contenues, afin d'empêcher le déploiement (et la modification éventuelle) du fichier xml avec votre exe.
  • utiliser la méthode CreateDataSet et insérer/remplir des dossiers avec ce que vous voulez à l'exécution

exemple de code:

procedure TFrom1.Init; 
begin 
    cdsIDType.CreateDataSet; 
    cdsIDType.InsertRecord('A', 'Drivers License'); 
    cdsIDType.InsertRecord('B', 'Passport'); 
    //etcetera. 
end; 
+0

Ceci est une réponse techniquement correcte, mais il a fait une augmentation significative de l'utilisation de la mémoire de mon programme, et la taille de l'installateur (ce qui est un problème parce que je distribue le programme électroniquement.) –

+0

J'ai fait un test simple avec Delphi 2007 aussi voir ce que vous considérez comme une augmentation significative de la taille d'un installateur. L'ajout du composant TClientDataSet et de MidasLib à la clause uses exe augmente de ~ 320Kb et l'installateur (fait avec inno setup + lzma) se développe ~ 120Kb.Sauf si vous le distribuez en utilisant des disquettes de 3.44 ", je pense que cette augmentation de la taille vaut la puissance que vous gagnez en utilisant ClientDataSets – jachguate

Questions connexes