Tutorial básico de DELPHI: Desarrollo de funciones de gestión de datos basadas en objetos de Delphi (4) [2]
Evento OnSetName
Declarar propiedad OnSetName: TSetNameEvent;
El evento OnSetName ocurre antes de que el objeto Leer establezca la propiedad Nombre del componente. El parámetro var Nombre de. el proceso de procesamiento de eventos OnSetName es un parámetro var, por lo que el controlador de eventos puede modificar el valor de Nombre antes de asignar Nombre al componente. Esto es muy útil para filtrar los nombres de los componentes en el formulario.
Lo siguiente. El controlador de eventos OnSetName se denomina Los componentes cuyos nombres contienen Button se reemplazan con PushButton
procedimiento TForm ReaderSetName (Reader: TReader; Component: TComponent;
var Name: cadena)
var
PosBotón: Entero
comenzar
PosBotón := Pos(Nombre del botón)
if ButtonPos <> entonces
Nombre := Copiar(Nombre ButtonPos) + PushButton +
Copiar(Nombre ButtonPos + Longitud(Nombre))
fin;
Método ReadValue
Función de declaración ReadValue: TValueType;
El método ReadValue lee el tipo del elemento inmediatamente después de la secuencia. Después de que la función regresa, el puntero. de la secuencia se mueve después del indicador de tipo de valor
TValueType es un tipo de enumeración. Cada elemento almacenado en la secuencia del objeto Filer está precedido por un byte que identifica el tipo de elemento. Este byte se lee antes. cada elemento se lee para indicar qué método llamar. Para obtener el valor del byte del elemento, es uno de los tipos de valor definidos por TValuetype
Método NextValue
Función de declaración. Nextvalue: TValuetype;
La función del método Nextvalue También devuelve el tipo del siguiente elemento en el flujo de objetos Reader. La diferencia con ReadValue es que no mueve la posición del puntero.
Método ReadBoolean
Función de declaración ReadBoolean: Boolean;
El método ReadBoolean lee un valor booleano de la secuencia del objeto Reader y mueve el puntero de posición de la secuencia en consecuencia
Método ReadChar
Declara la función ReadChar: char;
El método ReadChar lee un carácter de la secuencia del objeto Reader
El método ReadFloat
Declarar la función ReadFloat: Extended;
El método ReadFloat lee un flotante de los puntos de flujo
Método ReadIdent
Función de declaración ReadIdent: string <; /p>
El método ReadIdent lee identificadores de la secuencia
Método ReadInteger
p>
Declarar función ReadInte
ger: Longin
El método ReadInteger lee números enteros de la secuencia
El método ReadString
declara la función Leer cadena: cadena
> El método ReadString lee una cadena de la secuencia del objeto Reader y devuelve el contenido de la cadena. La cadena es escrita por el método WriteString del objeto Writer
Implementación del objeto TReader
.Delphi utiliza principalmente la función del objeto Filer para leer y escribir varios tipos de datos (incluidos los objetos componentes) en archivos DFM. Una característica esencial de estos datos es la longitud variable, y el objeto Filer abstrae y empaqueta la lectura. y escribir operaciones de datos en objetos y proporciona una gran cantidad de Los métodos de lectura y escritura facilitan las llamadas a programas, por lo que el objeto Filer se puede usar ampliamente en aplicaciones para aprovechar al máximo la tecnología orientada a objetos de Delphi. El objeto Filer está incluido con Stream. Por un lado, se puede acceder a datos en cualquier formato en varios medios de almacenamiento. Por otro lado, debido al uso completo del enlace dinámico orientado a objetos, el uso de varios métodos de lectura y escritura es consistente, por lo que el método. La llamada es muy simple. A continuación nos centramos en la implementación de las propiedades y métodos relacionados con las operaciones de lectura y escritura de datos en el objeto Reader.
Implementación de los atributos de TReader
En la implementación de atributos de. Objeto TReader, nos centramos en la implementación de Position
La definición del atributo Position utiliza control de lectura y escritura. Son los métodos GetPosition y SetPosition
TReader = clase (TFiler)
privado
…
función GetPosition: Longint
procedimiento SetPosition (Valor: Longint)
público
…
propiedad Posición: Longint leer GetPosition escribir SetPosition;
end
p>
El método de control de lectura y escritura de Postition; es el siguiente
función TReader GetPosition: Longint
comenzar
Resultado:= FStream Position + FBufPos
p>
finalizar;
procedimiento TReader SetPosition(Valor: Longint)
comenzar
FStream Posición := Valor
FBufPos := ;
FBufEnd := ;
end;
Introducidas en el objeto TFiler del objeto principal TReader, las variables FBufPos y FBufEnd se asignan internamente en el objeto Filer A. Búfer de tamaño BufSize FBufPos se refiere a la posición relativa en el búfer FBufEnd se refiere a la posición al final de los datos en el búfer (es posible que los datos en el búfer no llenen todo el búfer)
En. En el método GetPosition, puede ver que el valor de Posición del objeto Reader y el valor de Posición del objeto Stream son diferentes. El objeto Reader tiene un valor de desplazamiento FButPos adicional
Implementación de los métodos Defineproperty y DefineBinaryproperty<. /p>
Estos dos métodos son métodos virtuales en TF
Los métodos abstractos en iler tienen implementaciones específicas en TReader y objetos riter
Su implementación en TReader es la siguiente
procedimiento TReader DefineProperty (const Name: string; ReadData: TReaderProc;
WriteData: riterProc; HasData: Boolean)
comenzar
si CompareText(Nombre FPropName) = entonces
comenzar
ReadData(Self)
FPropName :=
end;
end;
procedimiento TReader DefineBinaryProperty (const Nombre: cadena; /p>
ReadData WriteData: TStreamProc; HasData: Boolean)
var
Stream: TMemoryStream
Count: Longint; p> p>
comenzar
si CompareText(Nombre FPropName) = entonces
comenzar
si ReadValue <> vaBinary entonces
comenzar
Dec(FBufPos)
SkipValue
FCanHandleExcepts := Verdadero
PropValueError; finalizar;
Secuencia:= TMemoryStream Crear
intentar
Leer(Count SizeOf(Count))
Stream SetSize(Count)
p>
Leer(Transmitir memoria^ Contar)
FCanHandleExcepts := Verdadero
ReadData(Transmitir)
finalmente;
Transmitir gratis
fin
FPropName :=
fin
fin; p>
En ambos métodos, se compara el valor del parámetro Nombre con el nombre de la propiedad actual. Si son iguales, se realiza la operación de lectura. Se crea un flujo de memoria en DefineBinaryproperty. y luego se llama a ReadData para leer los datos.
Implementación de FlushBuffer
El método FlushBuffer se utiliza para borrar el contenido del búfer interno del objeto Reader y mantener el objeto Reader y la secuencia. sincronizado en posición (Position) Su implementación es la siguiente
procedimiento TReader FlushBuffer
begin
FStream Position:= FStream Position (FBufEnd FBufPos) p>
FBufPos := ;
FBufEnd :=
fin
ReadListBegi;
n Métodos ReadListEnd y EndOfList
Estos tres métodos se utilizan para leer una serie de elementos de la secuencia del objeto Reader, y estos elementos se inician con el indicador de escritura WriteListBegin y finalizan con el indicador de escritura WriteListEnd. EndOfList en el bucle de lectura para determinar que se utilizan a menudo cuando el objeto Reader lee datos en la secuencia. Su implementación es la siguiente
procedimiento TReader ReadListBegin
begin
.CheckValue(vaList)
fin
procedimiento TReader ReadListEnd
comenzar
CheckValue(vaNull)
fin;
función TReader EndOfList: booleano
comenzar
Resultado:= ReadValue = vaNull
Dec(FBufPos; )
end;
La marca de inicio de la lista de proyectos es VaList y la marca de final de la lista de proyectos es VaNull. Tanto VaList como VaNull son constantes definidas por el tipo de enumeración TValueType lishixinzhi. /Artículo/programa/Delphi/201311/ 25093