2008-12-18 1153 views
5

Estoy clonando un TClientDataSet y quiero copiar todos los campos al clon (que es un nuevo DataSet), sé que puedo recorrer los campos y copiar la información, o hacer 2 instancias de mi clase y simplemente clonar el cursor, pero ¿hay alguna forma mejor? ¿Algo así como crear un nuevo DataSet y asignar la información de los campos?¿Hay alguna forma mejor de copiar todos los campos de DataSet y sus propiedades a otro DataSet?

EDIT:

El siguiente método auxiliar de clase que funciona para mí:

procedure TDataSetHelper.CopyFieldDefs(Source: TDataSet); 
var 
    Field, NewField: TField; 
    FieldDef: TFieldDef; 
begin 
    for Field in Source.Fields do 
    begin 
    FieldDef := FieldDefs.AddFieldDef; 
    FieldDef.DataType := Field.DataType; 
    FieldDef.Size := Field.Size; 
    FieldDef.Name := Field.FieldName; 

    NewField := FieldDef.CreateField(Self); 
    NewField.Visible := Field.Visible; 
    NewField.DisplayLabel := Field.DisplayLabel; 
    NewField.DisplayWidth := Field.DisplayWidth; 
    NewField.EditMask := Field.EditMask; 

    if IsPublishedProp(Field, 'currency') then 
    SetPropValue(NewField, 'currency', GetPropValue(Field, 'currency')); 

    end; 
end; 

alguien tiene una mejor manera de hacer esto?

Respuesta

4

¿Está buscando una forma más estética de hacerlo o una forma más rápida de hacerlo?

Si es el primero, cree sus propias clases que oculten el ciclo.

Si es lo último, ni siquiera se preocupe por ello. Un codificador muy sabio me dijo una vez: costos de acceso al disco; costos de acceso a la red; tal vez los costos de acceso a la pantalla; todo lo demás es gratis.

No confunda el tamaño del código fuente con el tiempo de ejecución. El bucle mil veces a través de la memoria y la copia de bits no se puede detectar en comparación con el saludo inicial de una conexión de base de datos.

Saludos

1

¿CloneCursor funcionaría para usted?

7

Si lo que desea es copiar las definiciones de campo que puede hacer lo siguiente:

ds2.FieldDefs.Assign(ds1.FieldDefs); 
ds2.CreateDataSet; 
ds2.Open; 

Por supuesto, esto supone que ha creado para FieldDefs DS1.

+0

No funcionó como esperaba, algunas propiedades como "moneda" no se copiaron en el nuevo conjunto de datos, quiero mantener todas las configuraciones del campo en el DataSet clonado. –

2

Si usted va a recorrer el conjunto de datos para hacer una copia, recuerde llamar DisableControls en él antes, y EnableControl después.

Sin eso, las cosas pueden ponerse realmente lentas si tienes controles visuales que muestran los datos del conjunto de datos en tu formulario.

-2

NO PROGRAMABLE MÉTODO

  • primera TClientDataSet: editor de campos abiertos. agregue todos los campos si aún no se muestran. selecciona todos los campos copiar al portapapeles.

  • segundo tclientdataset: abrir campos editor. pegar el portapapeles en el editor de campos. hecho

ahora debería ver FieldDefs idénticos para ambos tclientdatasets ahora.

Cuestiones relacionadas