Frage

Ich bin auf der Suche nach einer Möglichkeit, eine Listsource zu einer TDBLookupComboBox in delphi bereitzustellen, ohne eine tatsächliche Tabelle Server auf der Datenbank, die von dieser Liste zu ziehen. Die Datafield für die Combo-Box ist ein 1 Zeichenfeld, das einen codierten Wert wie ‚A‘ enthält = ‚Führerschein‘, ‚B‘ = ‚Pass‘, ‚C‘ = ‚Bibliotheksausweis‘ usw. Das heißt nur, dass die Tabelle enthält A, B oder C. die Anwendung ist verantwortlich für ‚Führerschein‘ in der GUI angezeigt. Normalerweise könnte eine Datenbank, die eine Nachschlagtabelle, aber diese Datenbank nicht und kann ich nicht hinzufügen. Meine Idee ist, dass die Datasource und Listsource für einen DB-Look-up-Steuer nicht die gleiche Datenbank enthalten sein müssen, so dass, wenn es möglich wäre, einen kleinen Tisch in meiner Form zu definieren, die die Look-Up-Daten enthält, dann könnte ich, dass ein verwenden keine echte Datenbanktabelle benötigen.

Kennt jemand eine Delphi-Komponente, die eine TDataSet auf einem Formular definiert werden können, ohne dahinter keine tatsächlichen Datendateien mit?

War es hilfreich?

Lösung

Eine alternative Lösung ist TComboBox statt TDBLookupComboBox zu verwenden. Verwenden Sie einen TDictionary einen einfachen Speicher-Lookup zu definieren.

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;

Sie könnten TComboBox.Items.AddObject verwenden anstelle eines separaten Lookup-Tabelle aber man müsste eine Wrapper-Klasse erstellen, die als TObject ein Zeichen zu speichern oder Chr verwenden Sie es auf eine ganze Zahl zu konvertieren, dann muss er in TObject aber ein die oben ist einfacher meiner Meinung nach.

Andere Tipps

Ich weiß, es ist etwas anderes In-Memory-Datensatz. Delphi kommt mit TClientDataSet, mit dem Sie die Art und Weise verwenden können, die Sie wollen. Sie haben die midas.dll mit ausführbarer, um zur Arbeit zu implementieren, oder Sie müssen die die MidasLib in Ihrer uses-Klausel enthalten, um statisch diese Bibliothek in der ausführbaren Datei verknüpfen (keine midas.dll zur Laufzeit erforderlich).

bekommen, was Sie von der TClientDataSet möchten, können Sie Felder anlegen und:

  • speichert die Datensätze in einer XML-Datei (zum Beispiel mit einem anderen Hilfsmittel Du gemacht). Zur Laufzeit laden die Daten mit der Methode Loadfromfile des TClientDataSet. Zusätzlich können Sie diese XML als Ressource speichern mit der $ R-Richtlinie und manipulieren diese Ressource zur Laufzeit Ihrer ClientDataSet mit den enthaltenen Daten zu füttern, zu verhindern, dass der Einsatz (und mögliche Modifikation) der XML-Datei mit Ihrem exe.
  • verwenden, um die CreateDataSet Methode und insert / bevöl Aufzeichnungen mit dem, was Sie zur Laufzeit wollen

Codebeispiel:

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

Verwenden Sie ein TClientDataset und definieren Sie die Felder, dann zu einer Datenquelle verbinden. Im oncreate-Ereignis des Formulars wie folgt vorgehen: die CreateDataSet Verfahren der ClientDataSet auszuführen und dann bevöl mit dem A, B, C-Daten.

If you use the jvcl, what you want can be accomplished without involving a dataset. Just use a TjvDBComboBox, use the Items property to set the values you want the UI to display, and use the Values property to set the actual values stored in the database.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top