----Problema 2 e solução
Além do conteúdo do arquivo ISO, cada registro da tabela importada também necessita do tipo de livro, número de emissão e número de identificação. Ao inserir um novo registro, o TPgCSV processa apenas os campos relacionados aos dados do arquivo de texto. , ,O conteúdo desses campos precisa ser adicionado por nós mesmos. Escusado será dizer que é natural pensar no evento AfterInsert em Table. Mas o problema é que minha Table está na unidade DataModule e devo passar parâmetros para o evento AfterInsert Trouble! Ao mesmo tempo, tal processamento causará caos na manutenção. Os eventos que ocorrem em uma unidade devem ser tratados por funções ou procedimentos nesta unidade, tanto quanto possível. Então, pensei em escrever um processo de processamento na unidade atual e, em seguida, atribuir esse processo ao evento AfterInsert da Tabela quando o programa estiver em execução e desativá-lo após a conclusão da importação. Funciona, mas ainda é problemático! Já que você encontrará esse tipo de problema na maioria dos casos, por que não resolvê-lo imediatamente e encapsular esse incidente?
Igual à pergunta 1, aqui ainda precisamos de um processo de manipulação de eventos AfterInsert. Onde ele deve ser adicionado desta vez?
Procedimento TPgCSV.CSVToDataSet;
começar
…
FDataset.DisableControls;
while (não Eof(FFile)) e (não FStop) fazem
começar
//lê do CSV
Readln(FFile,RecordString);
//modificação do xm4014
se atribuído (FRegulateString) então
FREgulateString(self,RecordString);
//adiciona novo registro
tentar
FDataset.Append;
//Deve ser adicionado aqui!
//modificação do xm4014
se atribuído (FAfterInsert) então
AfterInsert(self,FDataset);
…
para i:=1 para CountMapItems fazer
…
fim;
Da mesma forma, novas declarações de eventos e atributos de eventos precisam ser definidos aqui, porque os parâmetros de FDataSet precisam ser passados. Para o código de declaração, consulte o uso de controles Delphi (2) (http://www.csdn. net/desenvolver/ler_artigo.asp?id=11855).
Depois de recompilar o controle, você pode adicionar código no evento AfterInsert para atribuir valores ao tipo de livro, número de emissão e número de ID.
----Problema 3 e solução
Os problemas envolvendo o banco de dados já foram resolvidos, mas ainda há um problema de exibição. O programa requer o uso de ProgressBar para exibir o progresso da importação. Para definir o valor de ProgressBar.Max, preciso saber quantos registros existem. o arquivo ISO antes de importar, que é uma propriedade semelhante a RecordCount, mas não existe tal propriedade em TPgCSV.
Então vamos adicionar um atributo como este
//modificação do xm4014
propriedade CSVRecordCount: inteiro lido FCSVRecordCount gravação FCSVRecordCount padrão 0;
Como atribuir um valor a ele? É muito simples. Você pode usar ReadLn(F) para digitalizar o arquivo ISO e então acumular o número de digitalizações.
A chave é onde realizar esse processamento. Obviamente, para o mesmo arquivo, esse trabalho só precisa ser feito uma vez. Como as estatísticas precisam ser recalculadas para arquivos diferentes, podemos verificar o arquivo de texto sempre que definirmos o atributo do nome do arquivo.
OK, encontre o atributo de nome de arquivo de TPgCSV
propriedade CSVFile: string leitura FCSVFile gravação FCSVFile;
Faça algumas pequenas modificações
nova declaração de propriedade
propriedade CSVFile: string leitura FCSVFile gravação SetCSVFile;
Pressione Ctrl+shift+c para escrever o código do método SetCSVFile da seguinte forma
procedimento TPgCSV.SetFCSVFile(valor const: string);
var
F1:ArquivoTexto;
iCount:inteiro;
começar
se FCSVFile<>Valor então
começar
Arquivo FCSV := Valor;
//Assim que o nome do arquivo for alterado, verifique novamente e altere o valor de FCSVRecordCount.
se FileExists(Valor) então
começar
AssignFile(F1, Valor);
Redefinir(F1);
iCont:=0;
enquanto não Eof(F1) faça
começar
LerLn(F1);
Inc(iCont);
fim;
FCSVRecordCount:=iContagem;
fim;
fim;
fim;
Após a compilação, podemos chamar com segurança a propriedade CSVRecordCount para obter o valor do registro antes da operação de importação:
ProgressBar1.Min :=0;
ProgressBar1.Max:=PgCSV1.CSVRecordCount;
O programa acima passou na depuração no Delphi 6.0/Win98
Neste ponto, basicamente terminei. Na verdade, posso contar as alterações que fiz nos dedos, mas é uma atualização tão pequena que me deixa mais confortável para usá-la. de novo na próxima vez, quando eu usar, vou perceber cada vez mais seu valor. E depois de tanta análise e modificação, fiz muito progresso, algumas gotas mais do que meio furo, haha! Deve-se ressaltar que TPgCSV é um controle simples, não possui relacionamentos muito complicados nem envolve a chamada do conteúdo principal da VCL, portanto, não há necessidade de se preocupar muito ao modificá-lo, uma vez que o código-fonte está envolvido. é uma relação hierárquica muito complexa , você precisa pensar cuidadosamente sobre cada linha de código adicionada ou modificada, caso contrário, isso pode afetar todo o corpo e será difícil voltar atrás no final. Portanto, o princípio de uso que mencionei é, na verdade, baseado no. controlar suas próprias funções sem quaisquer alterações no conteúdo substantivo. Para alcançar o estado de fazer o que quiser, todos (inclusive eu) devem continuar a trabalhar duro! (Anexo: endereço de download TPgCSV http://www.internet-bj.com/delphikongjian.asp?id=2 )