----Problema 2 y solución
Además del contenido del archivo ISO, cada registro de la tabla importada también necesita el tipo de libro, el número de edición y el número de identificación. Por lo tanto, al insertar un nuevo registro, TPgCSV solo procesa los campos relacionados con los datos del archivo de texto. ,,El contenido de estos campos debe ser agregado por nosotros mismos. No hace falta decir que es natural pensar en el evento AfterInsert en la Tabla, pero el problema es que mi Tabla está en la unidad DataModule y debo pasar parámetros al evento AfterInsert. Al mismo tiempo, dicho procesamiento provocará un caos de mantenimiento. Los eventos que ocurren en una unidad deben ser manejados por funciones o procedimientos en esta unidad tanto como sea posible. Entonces, pensé en escribir un proceso de procesamiento en la unidad actual y luego asignar este proceso al evento AfterInsert de Table cuando el programa se está ejecutando, y luego deshabilitarlo una vez completada la importación. ¡Funciona, pero sigue siendo problemático! Dado que encontrará un problema de este tipo en la mayoría de los casos, ¿por qué no resolverlo de inmediato y resumir este incidente?
Igual que la pregunta 1, aquí todavía necesitamos un proceso de manejo de eventos AfterInsert. ¿Dónde debería agregarse esta vez? Definitivamente puedes verlo de un vistazo:
Procedimiento TPgCSV.CSVToDataSet;
comenzar
…
FDataset.DisableControls;
mientras que (no Eof(FFile)) y (no FStop) lo hacen
comenzar
//leer desde CSV
Readln(FFile,RecordString);
//modificación de xm4014
si está asignado (FRegulateString) entonces
FRegulateString(self,RecordString);
//agregar nuevo registro
intentar
FDataset.Append;
//¡Debería agregarse aquí!
//modificación de xm4014
si está asignado (FAfterInsert) entonces
AfterInsert(self,FDataset);
…
para i:=1 a CountMapItems hacer
…
fin;
De manera similar, aquí es necesario definir nuevas declaraciones de eventos y atributos de eventos, porque los parámetros de FDataSet deben pasarse. Para el código de declaración, consulte el uso de controles Delphi (2) (http://www.csdn. net/develop/read_article.asp?id=11855).
Después de volver a compilar el control, puede agregar código en el evento AfterInsert para asignar valores al tipo de libro, número de publicación y número de identificación.
----Problema 3 y solución
Los problemas relacionados con la base de datos ya se han resuelto. Pero todavía hay un problema de visualización. El programa requiere usar ProgressBar para mostrar el progreso de la importación. Para establecer el valor de ProgressBar.Max, necesito saber cuántos registros hay. el archivo ISO antes de importar, es decir, una propiedad similar a RecordCount, pero no existe tal propiedad en TPgCSV.
Entonces agreguemos un atributo como este
//modificación de xm4014
propiedad CSVRecordCount: entero leído FCSVRecordCount escrito FCSVRecordCount predeterminado 0;
¿Cómo asignarle un valor? Es muy simple. Puede usar ReadLn(F) para escanear el archivo ISO y luego acumular el número de escaneos.
La clave es dónde realizar este procesamiento. Obviamente, para el mismo archivo, dicho trabajo solo debe realizarse una vez. Dado que es necesario volver a calcular las estadísticas para diferentes archivos, podemos escanear el archivo de texto cada vez que configuramos el atributo de nombre de archivo.
Bien, busque el atributo de nombre de archivo de TPgCSV
propiedad CSVFile: cadena lee FCSVFile escribe FCSVFile;
Haz algunas pequeñas modificaciones.
nueva declaracion de propiedad
propiedad CSVFile: cadena lee FCSVFile escribe SetCSVFile;
Presione Ctrl+shift+c para escribir el código del método de SetCSVFile de la siguiente manera
procedimiento TPgCSV.SetFCSVFile (Valor constante: cadena);
var
F1:Archivo de texto;
iCount:entero;
comenzar
si FCSVFile<>Valor entonces
comenzar
ArchivoFCSV := Valor;
//Tan pronto como se cambie el nombre del archivo, vuelva a escanear y cambie el valor de FCSVRecordCount.
si el archivo existe (valor), entonces
comenzar
Asignar archivo (F1, valor);
Restablecer (F1);
iCount:=0;
mientras que no Eof(F1) lo hace
comenzar
LeerLn(F1);
Inc(iContar);
fin;
FCSVRecordCount:=iCount;
fin;
fin;
fin;
Después de la compilación, podemos llamar de forma segura a la propiedad CSVRecordCount para obtener el valor del registro antes de la operación de importación:
BarraProgreso1.Min:=0;
ProgressBar1.Max:=PgCSV1.CSVRecordCount;
El programa anterior pasó la depuración en Delphi 6.0/Win98
En este punto, básicamente ya terminé. De hecho, puedo contar los cambios que hice con mis dedos, pero es una actualización tan pequeña que me hace sentir más cómodo al usarlo. La próxima vez que lo use me daré cuenta cada vez más de su valor. Y después de tal análisis y modificación, he progresado mucho, unas gotas más de media cucharada, ¡jaja! Cabe señalar que TPgCSV es un control simple, no tiene relaciones muy complicadas ni implica llamar al contenido principal de VCL, por lo que no hay necesidad de preocuparse demasiado al modificarlo. Es una relación jerárquica muy compleja. , debe pensar detenidamente en cada línea de código que agregue o modifique; de lo contrario, puede afectar a todo el cuerpo y será difícil regresar al final. Por lo tanto, el principio de uso que mencioné en realidad se basa en el. controlar sus propias funciones sin ningún cambio en el contenido sustancial. Para lograr el estado de hacer lo que quieras, ¡todos (incluido yo) debemos continuar trabajando duro! (Adjunto: dirección de descarga de TPgCSV http://www.internet-bj.com/delphikongjian.asp?id=2 )