Domanda

Sto cercando un modo per fornire un ListSource ad un TDBLookupComboBox in Delphi senza avere un tabella effettiva sul server di database di trarre tale elenco da. Il DataField per la casella combinata è un campo di 1 carattere che contiene un valore codificato come 'A' = 'patente', 'B' = 'passaporto', 'C' = 'tessera della biblioteca', ecc Vale a dire che la tabella contiene solo a, B o C. l'applicazione è responsabile per la visualizzazione 'patente' nella GUI. Normalmente un database potrebbe avere uno sguardo da tavolo, ma questo database non lo fa e non posso aggiungere uno. La mia idea è che il DataSource e ListSource per un controllo DB Look-up non devono essere lo stesso database, quindi se fosse possibile definire un tavolino nella mia forma che contiene i dati di look-up quindi ho potuto utilizzare che un non richiede una tabella di database vero e proprio.

Qualcuno sa di un componente Delphi che consente a un TDataSet da definire in un modulo senza avere file di dati effettivi dietro?

È stato utile?

Soluzione

Una soluzione alternativa è quella di utilizzare TComboBox piuttosto che TDBLookupComboBox. Utilizzare un TDictionary per definire una semplice ricerca nella memoria.

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;

Si potrebbe usare TComboBox.Items.AddObject al posto di una tabella di ricerca indipendente, ma che avrebbe dovuto creare una classe wrapper per memorizzare un carattere come TObject o utilizzare Chr per convertirlo in un intero poi gettarlo ai TObject ma un quanto sopra è più semplice a mio parere.

Altri suggerimenti

So che ci sono diversi set di dati in memoria. Delphi è dotato di TClientDataSet, che si può usare nel modo desiderato. È necessario distribuire il midas.dll con il vostro eseguibile per lavoro, o è necessario includere la l'MidasLib nel vostro clausola uses al fine di collegare in modo statico questa libreria nel vostro eseguibile (senza midas.dll necessaria in fase di esecuzione).

Per ottenere quello che vuoi dalla TClientDataSet, è possibile creare i campi e:

  • memorizzare i record in un file XML (per esempio con un altro strumento ausiliario che hai fatto). Con carico runtime i dati con il metodo LoadFromFile del TClientDataSet. Inoltre è possibile memorizzare questo XML come una risorsa con la direttiva $ R e manipolare questa risorsa in fase di esecuzione per alimentare il vostro ClientDataSet con i dati contenuti, per evitare la diffusione (e l'eventuale modifica) del file XML con l'exe.
  • utilizzare il metodo CreateDataSet e l'inserimento / record compilato con ciò che si vuole in fase di esecuzione

Esempio di codice:

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

Usa un TClientDataset e definire i campi, quindi collegare a un'origine dati. In caso OnCreate del form fare questo: eseguire il metodo CreateDataSet del ClientDataSet e quindi popolare con la A, B, C dati.

Se si utilizza il JVCL , ciò che si vuole può essere realizzato senza coinvolgere un insieme di dati. Basta usare un TjvDBComboBox, utilizzare la proprietà Items per impostare i valori desiderati l'interfaccia utente per visualizzare e utilizzare la proprietà Valori per impostare i valori effettivi memorizzati nel database.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top