Copie du wikimiroir

Ceci est un miroir du wiki de pascal.chat. La modification, l’historique et la connexion se trouvent là-bas.

TDBLookupComboBox/fr

English · Français

TDBLookupComboBox est un TComboBox lié aux données (doublement). Il peut être trouvé sur l'onglet Data Controls de la palette de composants.

Le contrôle TDBLookupCombobox obtient une liste de valeur depuis sa ListSource qui représente la donnée d'une autre table (p.ex. des produits). Alors, il

Le ComboBox stocke le résultat (i.e. la valeur KeyField) dans la propriété DataField, p.ex. le champ "ProduitID" dans la propriété DataSource (p.ex. une table "Commandes").

La différence avec le TDBComboBox est que le TDBComboBox est un "contrôle individuellement lié aux données" (en quelque sorte).

Utilisation sans liaison

Vous pouvez obtenir la combobox pour rechercher des valeurs d'une table sans enregistrer les résultats dans une autre en laissant les propriétés DataSource et KeyField 'vides.

L'extrait de code exemple suivant :

L'extrait de code exemple suivant NE :

pascal
interface
  type
    TForm1 = class(TForm)
      cboLookup: TDBLookupComboBox;
      dsSource: TDatasource;
      dsetSource: TDataset;
      ...
    protected
      FDisplayField: string;
      FKeyField: string;
      FPreviousKeyValue: string;  // May be any datatype - see below
    ...
    end;

...

implementation

...
  // Remember previous value
  FPreviousKeyValue:= load_from_settings_in_your_preferred_way_;

...
  // Configure DBLookupCombo
  dsSource.Dataset := dsetSource;
  cboLookup.ListSource := dsSource;

  cboLookup.ScrollListDataset := True;   // This ensures that changing the ComboBox will automatically scroll
                                         // the dataset
  cboLookup.Style := csDropDownList;

  cboLookup.KeyField := FKeyField;       
  cboLookup.ListField := FDisplayField;  // This is the field that will appear in the contents of the ComboBox
  
  dsetSource.Open;  // The ComboBox should now be populated, however intially no text is displayed
                    // So right now there is no relationship between the selected record in the dataset
                    // and the contents of the ComboBox

  // cboLookup.KeyValue reads and writes a Variant, so you may actually define
  // FPreviousKeyValue as any data type you feel is appropriate.

  // Remember a previous value
  if FPreviousKeyValue <> '' then
  begin
    dsetSource.Locate(FKeyField, FPreviousKeyValue, []);  // Note: This will fail to correctly set the ComboBox, 
                                                          // But will set the Datatset to the correct record.
 
    // Now the dataset is on the correct record, lets ensure the DBLookupCombo
    // is showing the same value as the selected record
    If (cboLookup.KeyValue = Null) And (dsetSource.RecordCount > 0) Then
      cboLookup.KeyValue := dsetSource.FieldByName(FKeyField).AsVariant;
  end;

... 
  // Save current value for next time
  FPreviousKeyValue:= cboLookup.KeyValue;
  write_to_settings_in_your_preferred_way_(FPreviousValue);

Bugs

Au moins pour TDBLookupComboBox, il y a un bug avec FPC 2.6.0 (utilisé dans Lazarus 1.0, 1.0.2 etc) qui nécessite que la listfield aussi bien que la DataSource soit présents.

Solution de contournement : vous pouvez passez outre ceci en déclarant un champ calculé avec le même nom que la ListField dans la DataSource du DataSet qui ne fait rien.

Contrôle alternatif

Les contrôles Rx (dans le paquet RxNew) ont le RxDBLookupCombobox qui dispose de fonctionnalités supplémentaires ; il permet p.ex. d'afficher de multiples champs/colonnes à côté l'un de l'autre (un peu comme les ComboBox MS Access) :

pascal
RxDBLookupCombo.LookupDisplay = 'field1;field2'; //takes a semicolon-delimited list of fields

Il a en plus une propriété DisplayAllFields (soit afficher tous les champs).

Voir aussi


From the Free Pascal wiki, page "TDBLookupComboBox/fr", as it stood on 2020-02-29 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Version 1, dernière modification par WikiArchive .