Pregunta

Estoy buscando una manera de proporcionar una ListSource a un TDBLookupComboBox en Delphi sin tener una tabla real en el servidor de base de datos para elaborar esa lista de. El DataField para el cuadro combinado es un campo 1 de caracteres que contiene un valor codificado como 'A' = 'licencia de conducir', 'B' = 'pasaporte', 'C' = 'tarjeta de biblioteca', etc. Es decir que la tabla sólo contiene a, B o C. la aplicación se encarga de mostrar 'licencia de conducir' en la GUI. Normalmente, una base de datos puede tener una tabla de consulta pero esta base de datos no y no puedo agregar uno. Mi idea es que el origen de datos y ListSource para un control de base de datos de consulta no tienen que ser la misma base de datos, por lo que si fuera posible definir una pequeña mesa en mi formulario que contiene los datos de consulta entonces podría utilizar que un no requiere una tabla de base de datos real.

¿Alguien sabe de un componente Delphi que permite una TDataSet a ser definida en un formulario sin tener cualquier archivo de datos reales detrás de él?

¿Fue útil?

Solución

Una solución alternativa es utilizar TComboBox en lugar de TDBLookupComboBox. Use un TDictionary para definir un simple en las operaciones de búsqueda de 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;

Se podría utilizar TComboBox.Items.AddObject en lugar de una tabla de búsqueda por separado, pero que tendría que crear una clase de contenedor para almacenar un char como TObject o utilizar Chr para convertirlo en un entero y luego convertirlo a TObject sino una lo anterior es más simple en mi opinión.

Otros consejos

Sé que hay diferentes conjunto de datos en memoria. Delphi viene con TClientDataSet, que se puede utilizar de la manera deseada. Usted tiene que desplegar el midas.dll con su ejecutable con el fin de trabajo, o se debe incluir el del MidasLib en su cláusula de usos con el fin de enlazar estáticamente esta biblioteca en el ejecutable (sin midas.dll necesaria en tiempo de ejecución).

Para conseguir lo que desea de la TClientDataSet, puede crear campos y:

  • almacenar los registros de un archivo XML (por ejemplo, con otra herramienta auxiliar que hizo). A carga de tiempo de ejecución los datos con el método LoadFromFile de la TClientDataSet. Además, puede almacenar esta xml como un recurso con la directiva $ R y manipular este recurso en tiempo de ejecución para alimentar a su ClientDataSet con los datos que contiene, para evitar el despliegue (y posible modificación) del archivo XML con su exe.
  • utilizar el método CreateDataSet e insertar / registros pueblan con lo que quieres en tiempo de ejecución

Ejemplo de código:

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

Utilice un TClientDataset y definir los campos, a continuación, se conectan a una fuente de datos. En el evento OnCreate de la forma de hacer esto: ejecutar el método CreateDataSet de la ClientDataSet y luego rellenarlo con la A, B, C de datos.

Si utiliza la jvcl , lo que quiere que se puede lograr sin la participación de un conjunto de datos. Sólo tiene que utilizar un TjvDBComboBox, utilice la propiedad Items para establecer los valores que desea que la interfaz de usuario para mostrar y utilizar la propiedad Valores para establecer los valores reales almacenados en la base de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top