Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TDBComboBox mit mapped Values (https://www.delphipraxis.net/183383-tdbcombobox-mit-mapped-values.html)

Sherlock 6. Jan 2015 14:25

TDBComboBox mit mapped Values
 
Ich versuche gerade mit den Bordmitteln in XE7 ein wenig nachzubauen, was ich die letzten 14 Jahre problemlos mit zugekauften Komponenten erledigt hatte (die erforderliche Komponentenversion konnte ich meinem Chef noch nicht aus dem Kreuz leiern). Bisher hatte ich von InfoPower eine TwwDBComboBox verwendet, die es erlaubt einem Anzeigetext einen zu speichernden Wert zuzuordnen. Es ist also möglich zB eine ComboBox zu erstellen, deren auswählbare Werte (Männlich, Weiblich, Intersex, k.A.) sind, und gespeichert wird dann (1,2,3,4). Umgekehrt wird dieses DB-gebundene Komponente dann beim einlesen des Wertes 2 zB direkt "Weiblich" als Inhalt anzeigen.

Ich dachte ernsthaft das wäre mit der Delphi-eigenen DBComboBox auch ohne weiteres möglich. In der Tat finde ich jedoch keine "einfache" Möglichkeit dies zu tun. Übersehe ich etwas? Würden die Livebindings da nützen? Ich habe kurz in die TDBLookupComboBox geschaut, aber die erwartet eine DataSource als Lookup-Menge, was mich auf den ersten bis zweiten Blick auch nicht wirklich weiterbringt. Macht Ihr sowas? Wenn ja wie?

Mein konkreter Anwendungsfall ist eine Software die bestimmte medizinische Sachverhalte nach Standardschlüsseln auflöst und sie dann exportiert. Es ist also nur auf der Oberfläche nötig "Weiblich" zu sehen. Die weitere Verwurschtelung der Daten wünscht sich die "2". Darum war es bisher so praktisch mit der wwDBComboBox.

Sherlock

Sir Rufo 6. Jan 2015 16:42

AW: TDBComboBox mit mapped Values
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hattest du an sowas gedacht? :stupid:
Delphi-Quellcode:
unit Form.Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Datasnap.DBClient, Vcl.DBCtrls,
  Vcl.Grids, Vcl.DBGrids, Vcl.StdCtrls, Vcl.Mask, Vcl.ExtCtrls;

type
  TMainForm = class( TForm )
    GenderMappingData: TClientDataSet;
    PersonData: TClientDataSet;
    GenderMappingData_Gender: TIntegerField;
    GenderMappingData_DisplayName: TStringField;
    Person_Gender: TDBLookupComboBox;
    GenderMapping: TDataSource;
    PersonData_FirstName: TStringField;
    PersonData_LastName: TStringField;
    PersonData_Gender: TIntegerField;
    Person: TDataSource;
    PersonNavigator: TDBNavigator;
    Person_FirstName: TDBEdit;
    Person_LastName: TDBEdit;
    PersonGrid: TDBGrid;
    PersonData_GenderName: TStringField;
  private
    { Private-Deklarationen }
  public
    procedure AfterConstruction; override;

  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}
{ TForm1 }

procedure TMainForm.AfterConstruction;
begin
  inherited;

  {GenderMappingData}
  GenderMappingData.CreateDataSet;
  GenderMappingData.LogChanges := False;
  GenderMappingData.AppendRecord( [1, 'Männlich'] );
  GenderMappingData.AppendRecord( [2, 'Weiblich'] );
  GenderMappingData.AppendRecord( [3, 'Intersex'] );
  GenderMappingData.AppendRecord( [4, 'Unbestimmt'] );

  {PersonData}
  PersonData.CreateDataSet;
  PersonData.LogChanges := False;
end;

end.
und mal die DFM dazu
Code:
object MainForm: TMainForm
  Left = 0
  Top = 0
  Caption = 'MainForm'
  ClientHeight = 232
  ClientWidth = 811
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Person_Gender: TDBLookupComboBox
    Left = 262
    Top = 176
    Width = 145
    Height = 21
    DataField = 'Gender'
    DataSource = Person
    KeyField = 'Gender'
    ListField = 'DisplayName'
    ListSource = GenderMapping
    TabOrder = 2
  end
  object PersonNavigator: TDBNavigator
    Left = 8
    Top = 8
    Width = 240
    Height = 25
    DataSource = Person
    TabOrder = 0
  end
  object Person_FirstName: TDBEdit
    Left = 8
    Top = 176
    Width = 121
    Height = 21
    DataField = 'FirstName'
    DataSource = Person
    TabOrder = 3
  end
  object Person_LastName: TDBEdit
    Left = 135
    Top = 176
    Width = 121
    Height = 21
    DataField = 'LastName'
    DataSource = Person
    TabOrder = 4
  end
  object PersonGrid: TDBGrid
    Left = 8
    Top = 39
    Width = 769
    Height = 120
    DataSource = Person
    TabOrder = 1
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'Tahoma'
    TitleFont.Style = []
  end
  object GenderMappingData: TClientDataSet
    Aggregates = <>
    Params = <>
    Left = 648
    Top = 56
    object GenderMappingData_Gender: TIntegerField
      FieldName = 'Gender'
    end
    object GenderMappingData_DisplayName: TStringField
      FieldName = 'DisplayName'
      Size = 50
    end
  end
  object PersonData: TClientDataSet
    Aggregates = <>
    Params = <>
    Left = 648
    Top = 112
    object PersonData_FirstName: TStringField
      FieldName = 'FirstName'
      Size = 50
    end
    object PersonData_LastName: TStringField
      FieldName = 'LastName'
      Size = 50
    end
    object PersonData_Gender: TIntegerField
      FieldName = 'Gender'
      Visible = False
    end
    object PersonData_GenderName: TStringField
      FieldKind = fkLookup
      FieldName = 'GenderName'
      LookupDataSet = GenderMappingData
      LookupKeyFields = 'Gender'
      LookupResultField = 'DisplayName'
      KeyFields = 'Gender'
      Size = 50
      Lookup = True
    end
  end
  object GenderMapping: TDataSource
    AutoEdit = False
    DataSet = GenderMappingData
    Left = 504
    Top = 56
  end
  object Person: TDataSource
    DataSet = PersonData
    Left = 504
    Top = 112
  end
end

Sherlock 7. Jan 2015 07:07

AW: TDBComboBox mit mapped Values
 
:shock:

Ich hatte komplett aus den Augen verloren, daß Datasets beliebige Datenquellen haben können. Super!

Vielen Dank.

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz