la Aplicación de FoxPro de Dispersión y Reunir Memvar en Delphi.
| Desarrolladores de Delphi | de febrero de 2001 | derechos de Autor Pinnacle Publishing, Inc. Todos los derechos reservados.
la Aplicación de FoxPro de Dispersión y Reunir Memvar en Delphi
Steve Zimmelman
la Tecnología siempre avanza, que generalmente conduce a más desarrollo productivo. Sin embargo, hay veces cuando se alcanza en el pasado puede ser útil, también. Replicar o la comparación de los datos de la tabla de FoxPro era una tarea bastante simple. Steve Zimmelman argumenta que tal vez esta tecnología es que vale la pena llegar a la espalda.
FoxPro Dispersión y Reunir los comandos fueron siempre es útil para la copia de los registros de una tabla a otra, la comparación de los datos o registro de replicación entre varias tablas. Para aquellos de ustedes que no han tenido el placer de trabajar con FoxPro, la Dispersión y Reunir los comandos de trabajo como este.
Supongamos que usted necesita para copia de un registro de una tabla a otra. Te gustaría hacer algo como:
Select Tabla1
Scatter Memvar
Seleccione la Tabla2
Recopilar Memvar
La Dispersión de comandos lee todos los campos para el
registro y los coloca en variables de memoria. Cada una de las variables
creado con la Dispersión tiene el mismo nombre que el campo desde el que se
se originó. El Reunir comando actualiza el registro actual con las variables de memoria que tienen nombres que corresponden a los campos. Así que si Tabla1 tiene los campos de Nombre, Dirección y Teléfono, y las variables Nombre, la Dirección y el Teléfono de existir, entonces, cuando se Reúnen se ejecuta el comando actualiza el registro con el valor almacenado en las variables.
Hay muchas maneras de lograr esto con Delphi, pero no hay nada de forma nativa, suministrado en la VCL que trabaja en el TDataSet nivel. En mi última aplicación esfuerzo, yo tenía una necesidad para la edad de Dispersión y Reunir funcionalidad. Así, terminé de escribir mi propia ScatterMemvar y GatherMemvar métodos.
la Creación de la Dispersión y de Reunir funciones
Ambos de estos métodos son contenedores para un objeto llamado TMemvar. TMemvar mantiene una matriz dinámica de un registro que se llama TMemVarFields. Cada elemento de la MemVarFields matriz contiene el nombre del campo, Tipo de datos, y el Valor de un campo correspondiente en un conjunto de datos. Para cada instancia de TMemvar contiene los datos de un solo registro de la tabla.
& nbsp & nbsp & nbsp Tipo de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MemVarField = Lleno de Registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FieldName : String
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Valor : Variante
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Tipo de datos : TFieldType
& nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp TMemVarFields = Array De TMemVarField
Cuando el ScatterMemvar se invoca la función, se crea una instancia de TMemvar y devuelve un puntero a esa instancia. Cuando TMemvar es creado, las cargas de los campos de la designada conjunto de datos en la matriz. Para evitar conjunto de datos de la duplicación, cada instancia de TMemvar es identificado por su conjunto de datos de la propiedad. Antes de que una nueva instancia de TMemvar se crea, se realiza una búsqueda de una coincidencia con el conjunto de datos en todas las instancias existentes de TMemvar. Si se encuentra uno, el correspondiente instancia se reutiliza. Si no, una nueva instancia es creada.
Función ScatterMemvar(DataSet:TDataSet) : TMemVar
Begin
& nbsp & nbsp & nbsp Si (conjunto de datos = Nil) Then
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Elevar la Excepción.Create('conjunto de datos No puede Ser NULO')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Reutilizar el objeto, si ya existe.
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := FindMemvarObject(conjunto de datos)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp If (Resultado = Nil) Then Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := TMemvar.Crear(conjunto de datos)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp End Else Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado.LoadFieldData
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Final
Constructor TMemVar.Crear(DataSet:TDataSet)
Begin
& nbsp & nbsp & nbsp FFlds := Nil
& nbsp & nbsp & nbsp FDataSet := conjunto de datos
& nbsp & nbsp & nbsp Si (FDataSet = Nil) Then Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Elevar la Excepción.Create('conjunto de datos No puede Ser NULO')
& nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Si (FScatterList = Nil) Then
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FScatterList := TList.Crear
& nbsp & nbsp & nbsp FScatterList.Add(Self)
& nbsp & nbsp & nbsp LoadFieldData
Fin
Procedimiento TMemVar.LoadFieldData
Var
& nbsp & nbsp & nbsp i : Integer
Begin
& nbsp & nbsp & nbsp Si No del conjunto de datos.Activa, Conjunto De Datos.Abierto
& nbsp & nbsp & nbsp FFlds := Nil
& nbsp & nbsp & nbsp // establecer la longitud del array del registro.
& nbsp & nbsp & nbsp SetLength(FFlds,FieldCount)
& nbsp & nbsp & nbsp For i := 0 A (conjunto de datos.FieldCount-1) Do Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Con el conjunto de datos.Campos[I] Do Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FFlds[i].FieldName := FieldName
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FFlds[i].Valor := Valor
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FFlds[i].Tipo de datos := Tipo de datos
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Final
Fin
Normalmente, cuando se crea un objeto, es necesario liberar el objeto cuando ya no sean necesarios. Pero la unidad que contiene el código para este objeto mantiene su propia lista interna de TMemvar instancias y los destruye automáticamente cuando se cierra la aplicación. Así que usted puede liberar los objetos cuando no se necesitan, o ignorarlos y dejar que la unidad se toma el cuidado de sí mismo.
Para administrar la TMemvar los objetos que se crean para cada ScatterMemvar de uso, puedo añadir cada nueva instancia de TMemvar a FScatterList, un tipo de TList. La unidad que se encarga de todas las de este código contiene la Inicialización y Finalización de las secciones. La Inicialización se asegura de FScatterList se establece a cero. Esto se hace para que el método Create de TMemvar puede interrogar el valor de FScatterList y crear una instancia de ella sólo cuando sea necesario. Esto mantiene a los recursos que la unidad requiere a un mínimo. La Finalización de la
sección de giros a través de la lista y libera cualquier TMemvar objetos a los que hace referencia.
Procedimiento FreeScatterList
Var i : Integer
Begin
& nbsp & nbsp & nbsp Si (FScatterList = Nil) Then Exit
& nbsp & nbsp & nbsp Probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp For i:=(FScatterList.Count-1) DownTo 0 Do Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp TMemVar(FScatterList.Los elementos[i]).Libre
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Excepto
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FScatterList.Libre
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FScatterList := Nil
& nbsp & nbsp & nbsp Final
Fin
Inicialización
& nbsp & nbsp & nbsp FScatterList := Nil
la Finalización
& nbsp & nbsp & nbsp FreeScatterList
Para evitar el acceso potencial excepciones, TMemvar se aleja de la FScatterList cuando es liberado. También te darás cuenta de que si todos los artículos han sido borrados de FScatterList, la lista es liberado. De nuevo, esto se hace para mantener el uso de los recursos hacia abajo.
Destructor TMemVar.Destruir
& nbsp & nbsp & nbsp Var i : Integer
Begin
& nbsp & nbsp & nbsp // Desactive los elementos de la matriz.
& nbsp & nbsp & nbsp FFlds := Nil
& nbsp & nbsp & nbsp For i := 0 A (FScatterList.Count-1) Do Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Si (TMemvar(FScatterList.Los elementos[i]).Conjunto de datos = FDataSet), a Continuación, Empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FScatterList.Eliminar(i)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Excepto
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Si (FScatterList.Count = 0) Then Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FScatterList.Libre
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FScatterList := Nil
& nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Heredado
Fin
Después de ScatterMemvar ha sido utilizado para colocar un conjunto de datos en memoria, que específica TMemvar objeto se puede acceder desde cualquier unidad en la aplicación. Porque cada instancia de TMemvar se almacena en FScatterList, puede ser considerado como un objeto Global que se puede acceder por cualquier unidad que tiene una referencia a la Memvar unidad en su Usa la instrucción.
El método GatherMemvar se utiliza para poner los datos en la misma tabla de la que originalmente vino o, si es necesario, una tabla diferente. GatherMemvar giros a través de los campos almacenados en el TMemvar objeto y actualiza el registro de destino con los campos que coincidan con el nombre del campo y el Tipo de datos. Para que los campos en el TMemvar objeto no tiene que ser exacto estructural coincida con el destino. Los campos que no coincide con el nombre del campo y el Tipo de datos son ignorados. Además, TMemvar del campo de valores pueden ser modificados antes de usar GatherMemvar, así que usted puede replicar ligeramente diferentes de datos en caso de necesidad.
GatherMemvar se implementa en dos sabores, el uso de la Sobrecarga de la directiva en la declaración del método:
Procedimiento GatherMemVar(Fuente:TMemVar de Destino:TDataSet
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Opciones:TGatherOptions) Sobrecarga
Procedimiento GatherMemVar(de Origen,de Destino:TDataSet
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Opciones:TGatherOptions) Sobrecarga
La única diferencia entre estos dos métodos es el primer parámetro. La primera aplicación utiliza el real TMemvar objeto de referencia. El segundo utiliza el conjunto de datos que se utilizó para crear la instancia de TMemvar. Aparte de eso, ambos son idénticos. De hecho, la primera aplicación de realidad llama a la segunda. También hay algunas opciones que le permiten controlar cómo el GatherMemvar método reúne los datos. Usted puede Sustituir o añadir datos, emitir un Post, o liberar el objeto una vez que la recopilación es completa. Si no
opciones están presentes en el parámetro, el valor predeterminado es Reemplazar el
Objetivo del conjunto de datos de registro y dejarlo en estado de Edición después de que modifica los datos de campo.
TGatherOption = (goReplace, goAppend, goPost, goFree)
TGatherOptions = Conjunto De TGatherOption
Procedimiento GatherMemVar(Fuente:TMemVar Objetivo:TDataSet
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Opciones:TGatherOptions)
Begin
& nbsp & nbsp & nbsp Si (Fuente = Nil) Then
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Elevar la Excepción.Create('Fuente TMemVar Objeto No puede Ser NULO')
& nbsp & nbsp & nbsp GatherMemVar(de Origen.Conjunto de datos,Destino,Opciones)
Fin
Procedimiento GatherMemVar(Origen,Destino:TDataSet Opciones:TGatherOptions)
Var
& nbsp & nbsp & nbsp i : Integer
& nbsp & nbsp & nbsp iIndex : Integer
& nbsp & nbsp & nbsp MemObj : TMemvar
& nbsp & nbsp & nbsp FR : TMemvarField
Begin
& nbsp & nbsp & nbsp MemObj := FindMemvarObject(Fuente)
& nbsp & nbsp & nbsp Si (MemObj = Nil) Then Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Elevar la Excepción.Create('Fuente de datos ('
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Fuente.Nombre ') No Ha Sido Esparcidos!')
& nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Si (goAppend En Opciones), a Continuación, Empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Destino.Anexar
& nbsp & nbsp & nbsp End Else Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Si No (de Destino.Estado En [dsEdit,dsInsert]) Entonces
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Destino.Editar
& nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp For i := 0 To (de Destino.FieldCount-1) Do Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp iIndex := MemObj.FindFieldIndex(De Destino.Campos[i].FieldName)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Si iIndex >= 0 then Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Si (de Destino.Campos[i].DataType = MemObj.Campos[iIndex].Tipo de datos), a Continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Destino.Campos[i].Valor := MemObj.Campos[iIndex].Valor
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Si (goPost En Opciones), a Continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Destino.Puesto
& nbsp & nbsp & nbsp Si (goFree En Opciones), a Continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MemObj.Libre
Fin
& nbsp
Poniendo las nuevas funciones de uso
Aquí hay un par de ejemplos de cómo se pueden utilizar estos métodos.
Procedimiento MyExample1 campo copias de los datos de la Tabla1 y agrega un registro a la Tabla2 con los datos de la Tabla1. El parámetro de opciones goPost y goFree indicar el método para emitir un Post a la Tabla2, a continuación, libere el TMemvar objeto.
Procedimiento MyExample1
& nbsp & nbsp & nbsp Var
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MemObj : TMemvar
Begin
& nbsp & nbsp & nbsp MemObj := ScatterMemvar(Tabla1)
& nbsp & nbsp & nbsp //
& nbsp & nbsp & nbsp // Añadir un registro a la Tabla2, puesto que,
& nbsp & nbsp & nbsp // entonces libre el TMemvar objeto.
& nbsp & nbsp & nbsp GatherMemvar(MemObj,Tabla2,[goAppend,goPost,goFree])
Fin
Procedimiento MyExample2 campo copias de los datos de la Tabla1, se anexa un registro a la Tabla2 con los datos de la Tabla1, a continuación, se modifica el Nombre de campo antes de añadir un registro a la Tabla3. En tanto GatherMemvar de los casos, el expediente es enviado. La última también libera al TMemvar objeto.
Procedimiento MyExample2
& nbsp & nbsp & nbsp Var
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MemObj : TMemvar
Begin
& nbsp & nbsp & nbsp MemObj := ScatterMemvar(Tabla1)
& nbsp & nbsp & nbsp //
& nbsp & nbsp & nbsp // Añadir un registro a la Tabla2 & Tabla3, Post,
& nbsp & nbsp & nbsp // entonces libre el TMemvar objeto.
& nbsp & nbsp & nbsp GatherMemvar(Tabla1,Tabla2,[goAppend,goPost])
& nbsp & nbsp & nbsp // Cambio de una memvar valor del campo antes de anexar
& nbsp & nbsp & nbsp // un registro a Tabla3.
& nbsp & nbsp & nbsp MemObj.FieldValue['Nombre'] := 'Steve Zimmelman'
& nbsp & nbsp & nbsp GatherMemvar(Tabla1,Tabla3,[goAppend,goPost,goFree])
Fin
La aplicacion de foxpro de dispersion y reunir memvar en delphi
La aplicacion de foxpro de dispersion y reunir memvar en delphi : Multi-millones de consejos para hacer su vida mas facil.
la Aplicacion de FoxPro de Dispersion y Reunir Memvar en Delphi.
| Desarrolladores de Delphi | de febrero de 2001 | derechos de Autor Pinnacle Publishing, Inc. Todos los derechos reservados.
la Aplicacion de FoxPro de Dispersion y Reunir Memvar en Delphi
Steve Zimmelman
la Tecnologia siempre avanza, que generalmente conduce a mas desarrollo productivo. Sin embargo, hay veces cuando se alcanza en el pasado puede ser util, tambien. Replicar o la comparacion de los datos de la tabla de FoxPro era una tarea bastante simple. Steve Zimmelman argumenta que tal vez esta tecnologia es que vale la pena llegar a la espalda.
FoxPro Dispersion y Reunir los comandos fueron siempre es util para la copia de los registros de una tabla a otra, la comparacion de los datos o registro de replicacion entre varias tablas. Para aquellos de ustedes que no han tenido el placer de trabajar con FoxPro, la Dispersion y Reunir los comandos de trabajo como este.
Supongamos que usted necesita para copia de un registro de una tabla a otra. Te gustaria hacer algo como:
Select Tabla1
Scatter Memvar
Seleccione la Tabla2
Recopilar Memvar
La Dispersion de comandos lee todos los campos para el
registro y los coloca en variables de memoria. Cada una de las variables
creado con la Dispersion tiene el mismo nombre que el campo desde el que se
se origino. El Reunir comando actualiza el registro actual con las variables de memoria que tienen nombres que corresponden a los campos. Asi que si Tabla1 tiene los campos de Nombre, Direccion y Telefono, y las variables Nombre, la Direccion y el Telefono de existir, entonces, cuando se Reunen se ejecuta el comando actualiza el registro con el valor almacenado en las variables.
Hay muchas maneras de lograr esto con Delphi, pero no hay nada de forma nativa, suministrado en la VCL que trabaja en el TDataSet nivel. En mi ultima aplicacion esfuerzo, yo tenia una necesidad para la edad de Dispersion y Reunir funcionalidad. Asi, termine de escribir mi propia ScatterMemvar y GatherMemvar metodos.
la Creacion de la Dispersion y de Reunir funciones
Ambos de estos metodos son contenedores para un objeto llamado TMemvar. TMemvar mantiene una matriz dinamica de un registro que se llama TMemVarFields. Cada elemento de la MemVarFields matriz contiene el nombre del campo, Tipo de datos, y el Valor de un campo correspondiente en un conjunto de datos. Para cada instancia de TMemvar contiene los datos de un solo registro de la tabla.
& nbsp & nbsp & nbsp Tipo de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MemVarField = Lleno de Registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FieldName : String
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Valor : Variante
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Tipo de datos : TFieldType
& nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp TMemVarFields = Array De TMemVarField
Cuando el ScatterMemvar se invoca la funcion, se crea una instancia de TMemvar y devuelve un puntero a esa instancia. Cuando TMemvar es creado, las cargas de los campos de la designada conjunto de datos en la matriz. Para evitar conjunto de datos de la duplicacion, cada instancia de TMemvar es identificado por su conjunto de datos de la propiedad. Antes de que una nueva instancia de TMemvar se crea, se realiza una busqueda de una coincidencia con el conjunto de datos en todas las instancias existentes de TMemvar. Si se encuentra uno, el correspondiente instancia se reutiliza. Si no, una nueva instancia es creada.
Funcion ScatterMemvar(DataSet:TDataSet) : TMemVar
Begin
& nbsp & nbsp & nbsp Si (conjunto de datos = Nil) Then
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Elevar la Excepcion.Create('conjunto de datos No puede Ser NULO')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Reutilizar el objeto, si ya existe.
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := FindMemvarObject(conjunto de datos)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp If (Resultado = Nil) Then Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := TMemvar.Crear(conjunto de datos)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp End Else Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado.LoadFieldData
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Final
Constructor TMemVar.Crear(DataSet:TDataSet)
Begin
& nbsp & nbsp & nbsp FFlds := Nil
& nbsp & nbsp & nbsp FDataSet := conjunto de datos
& nbsp & nbsp & nbsp Si (FDataSet = Nil) Then Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Elevar la Excepcion.Create('conjunto de datos No puede Ser NULO')
& nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Si (FScatterList = Nil) Then
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FScatterList := TList.Crear
& nbsp & nbsp & nbsp FScatterList.Add(Self)
& nbsp & nbsp & nbsp LoadFieldData
Fin
Procedimiento TMemVar.LoadFieldData
Var
& nbsp & nbsp & nbsp i : Integer
Begin
& nbsp & nbsp & nbsp Si No del conjunto de datos.Activa, Conjunto De Datos.Abierto
& nbsp & nbsp & nbsp FFlds := Nil
& nbsp & nbsp & nbsp // establecer la longitud del array del registro.
& nbsp & nbsp & nbsp SetLength(FFlds,FieldCount)
& nbsp & nbsp & nbsp For i := 0 A (conjunto de datos.FieldCount-1) Do Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Con el conjunto de datos.Campos[I] Do Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FFlds[i].FieldName := FieldName
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FFlds[i].Valor := Valor
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FFlds[i].Tipo de datos := Tipo de datos
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Final
Fin
Normalmente, cuando se crea un objeto, es necesario liberar el objeto cuando ya no sean necesarios. Pero la unidad que contiene el codigo para este objeto mantiene su propia lista interna de TMemvar instancias y los destruye automaticamente cuando se cierra la aplicacion. Asi que usted puede liberar los objetos cuando no se necesitan, o ignorarlos y dejar que la unidad se toma el cuidado de si mismo.
Para administrar la TMemvar los objetos que se crean para cada ScatterMemvar de uso, puedo añadir cada nueva instancia de TMemvar a FScatterList, un tipo de TList. La unidad que se encarga de todas las de este codigo contiene la Inicializacion y Finalizacion de las secciones. La Inicializacion se asegura de FScatterList se establece a cero. Esto se hace para que el metodo Create de TMemvar puede interrogar el valor de FScatterList y crear una instancia de ella solo cuando sea necesario. Esto mantiene a los recursos que la unidad requiere a un minimo. La Finalizacion de la
seccion de giros a traves de la lista y libera cualquier TMemvar objetos a los que hace referencia.
Procedimiento FreeScatterList
Var i : Integer
Begin
& nbsp & nbsp & nbsp Si (FScatterList = Nil) Then Exit
& nbsp & nbsp & nbsp Probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp For i:=(FScatterList.Count-1) DownTo 0 Do Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp TMemVar(FScatterList.Los elementos[i]).Libre
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Excepto
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FScatterList.Libre
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FScatterList := Nil
& nbsp & nbsp & nbsp Final
Fin
Inicializacion
& nbsp & nbsp & nbsp FScatterList := Nil
la Finalizacion
& nbsp & nbsp & nbsp FreeScatterList
Para evitar el acceso potencial excepciones, TMemvar se aleja de la FScatterList cuando es liberado. Tambien te daras cuenta de que si todos los articulos han sido borrados de FScatterList, la lista es liberado. De nuevo, esto se hace para mantener el uso de los recursos hacia abajo.
Destructor TMemVar.Destruir
& nbsp & nbsp & nbsp Var i : Integer
Begin
& nbsp & nbsp & nbsp // Desactive los elementos de la matriz.
& nbsp & nbsp & nbsp FFlds := Nil
& nbsp & nbsp & nbsp For i := 0 A (FScatterList.Count-1) Do Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Si (TMemvar(FScatterList.Los elementos[i]).Conjunto de datos = FDataSet), a Continuacion, Empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FScatterList.Eliminar(i)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Excepto
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Si (FScatterList.Count = 0) Then Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FScatterList.Libre
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FScatterList := Nil
& nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Heredado
Fin
Despues de ScatterMemvar ha sido utilizado para colocar un conjunto de datos en memoria, que especifica TMemvar objeto se puede acceder desde cualquier unidad en la aplicacion. Porque cada instancia de TMemvar se almacena en FScatterList, puede ser considerado como un objeto Global que se puede acceder por cualquier unidad que tiene una referencia a la Memvar unidad en su Usa la instruccion.
El metodo GatherMemvar se utiliza para poner los datos en la misma tabla de la que originalmente vino o, si es necesario, una tabla diferente. GatherMemvar giros a traves de los campos almacenados en el TMemvar objeto y actualiza el registro de destino con los campos que coincidan con el nombre del campo y el Tipo de datos. Para que los campos en el TMemvar objeto no tiene que ser exacto estructural coincida con el destino. Los campos que no coincide con el nombre del campo y el Tipo de datos son ignorados. Ademas, TMemvar del campo de valores pueden ser modificados antes de usar GatherMemvar, asi que usted puede replicar ligeramente diferentes de datos en caso de necesidad.
GatherMemvar se implementa en dos sabores, el uso de la Sobrecarga de la directiva en la declaracion del metodo:
Procedimiento GatherMemVar(Fuente:TMemVar de Destino:TDataSet
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Opciones:TGatherOptions) Sobrecarga
Procedimiento GatherMemVar(de Origen,de Destino:TDataSet
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Opciones:TGatherOptions) Sobrecarga
La unica diferencia entre estos dos metodos es el primer parametro. La primera aplicacion utiliza el real TMemvar objeto de referencia. El segundo utiliza el conjunto de datos que se utilizo para crear la instancia de TMemvar. Aparte de eso, ambos son identicos. De hecho, la primera aplicacion de realidad llama a la segunda. Tambien hay algunas opciones que le permiten controlar como el GatherMemvar metodo reune los datos. Usted puede Sustituir o añadir datos, emitir un Post, o liberar el objeto una vez que la recopilacion es completa. Si no
opciones estan presentes en el parametro, el valor predeterminado es Reemplazar el
Objetivo del conjunto de datos de registro y dejarlo en estado de Edicion despues de que modifica los datos de campo.
TGatherOption = (goReplace, goAppend, goPost, goFree)
TGatherOptions = Conjunto De TGatherOption
Procedimiento GatherMemVar(Fuente:TMemVar Objetivo:TDataSet
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Opciones:TGatherOptions)
Begin
& nbsp & nbsp & nbsp Si (Fuente = Nil) Then
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Elevar la Excepcion.Create('Fuente TMemVar Objeto No puede Ser NULO')
& nbsp & nbsp & nbsp GatherMemVar(de Origen.Conjunto de datos,Destino,Opciones)
Fin
Procedimiento GatherMemVar(Origen,Destino:TDataSet Opciones:TGatherOptions)
Var
& nbsp & nbsp & nbsp i : Integer
& nbsp & nbsp & nbsp iIndex : Integer
& nbsp & nbsp & nbsp MemObj : TMemvar
& nbsp & nbsp & nbsp FR : TMemvarField
Begin
& nbsp & nbsp & nbsp MemObj := FindMemvarObject(Fuente)
& nbsp & nbsp & nbsp Si (MemObj = Nil) Then Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Elevar la Excepcion.Create('Fuente de datos ('
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Fuente.Nombre ') No Ha Sido Esparcidos!')
& nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Si (goAppend En Opciones), a Continuacion, Empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Destino.Anexar
& nbsp & nbsp & nbsp End Else Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Si No (de Destino.Estado En [dsEdit,dsInsert]) Entonces
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Destino.Editar
& nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp For i := 0 To (de Destino.FieldCount-1) Do Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp iIndex := MemObj.FindFieldIndex(De Destino.Campos[i].FieldName)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Si iIndex >= 0 then Begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Si (de Destino.Campos[i].DataType = MemObj.Campos[iIndex].Tipo de datos), a Continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Destino.Campos[i].Valor := MemObj.Campos[iIndex].Valor
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Final
& nbsp & nbsp & nbsp Si (goPost En Opciones), a Continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Destino.Puesto
& nbsp & nbsp & nbsp Si (goFree En Opciones), a Continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MemObj.Libre
Fin
& nbsp
Poniendo las nuevas funciones de uso
Aqui hay un par de ejemplos de como se pueden utilizar estos metodos.
Procedimiento MyExample1 campo copias de los datos de la Tabla1 y agrega un registro a la Tabla2 con los datos de la Tabla1. El parametro de opciones goPost y goFree indicar el metodo para emitir un Post a la Tabla2, a continuacion, libere el TMemvar objeto.
Procedimiento MyExample1
& nbsp & nbsp & nbsp Var
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MemObj : TMemvar
Begin
& nbsp & nbsp & nbsp MemObj := ScatterMemvar(Tabla1)
& nbsp & nbsp & nbsp //
& nbsp & nbsp & nbsp // Añadir un registro a la Tabla2, puesto que,
& nbsp & nbsp & nbsp // entonces libre el TMemvar objeto.
& nbsp & nbsp & nbsp GatherMemvar(MemObj,Tabla2,[goAppend,goPost,goFree])
Fin
Procedimiento MyExample2 campo copias de los datos de la Tabla1, se anexa un registro a la Tabla2 con los datos de la Tabla1, a continuacion, se modifica el Nombre de campo antes de añadir un registro a la Tabla3. En tanto GatherMemvar de los casos, el expediente es enviado. La ultima tambien libera al TMemvar objeto.
Procedimiento MyExample2
& nbsp & nbsp & nbsp Var
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MemObj : TMemvar
Begin
& nbsp & nbsp & nbsp MemObj := ScatterMemvar(Tabla1)
& nbsp & nbsp & nbsp //
& nbsp & nbsp & nbsp // Añadir un registro a la Tabla2 & Tabla3, Post,
& nbsp & nbsp & nbsp // entonces libre el TMemvar objeto.
& nbsp & nbsp & nbsp GatherMemvar(Tabla1,Tabla2,[goAppend,goPost])
& nbsp & nbsp & nbsp // Cambio de una memvar valor del campo antes de anexar
& nbsp & nbsp & nbsp // un registro a Tabla3.
& nbsp & nbsp & nbsp MemObj.FieldValue['Nombre'] := 'Steve Zimmelman'
& nbsp & nbsp & nbsp GatherMemvar(Tabla1,Tabla3,[goAppend,goPost,goFree])
Fin
La aplicación de foxpro de dispersión y reunir memvar en delphi
By Consejos Y Trucos
La aplicación de foxpro de dispersión y reunir memvar en delphi : Multi-millones de consejos para hacer su vida más fácil. Consejos Y Trucos www.consejosytrucos.net Ciempozuelos, Madrid Extramuros 82 ES-M 28350 Spain 674 192 969