----Problem 2 und Lösung
Zusätzlich zum Inhalt in der ISO-Datei benötigt jeder Datensatz in der importierten Tabelle auch den Buchtyp, die Heftnummer und die ID-Nummer. Beim Einfügen eines neuen Datensatzes verarbeitet TPgCSV daher nur die Felder, die sich auf die Daten in der Textdatei beziehen , ,Der Inhalt dieser Felder muss von uns selbst hinzugefügt werden. Es ist unnötig zu erwähnen, dass es natürlich ist, an das AfterInsert-Ereignis in der Tabelle zu denken. Das Problem besteht jedoch darin, dass sich meine Tabelle in der DataModule-Einheit befindet und ich Parameter an das AfterInsert-Ereignis übergeben muss. Gleichzeitig führt eine solche Verarbeitung zu Wartungschaos. Ereignisse, die in einer Einheit auftreten, sollten so weit wie möglich von Funktionen oder Prozeduren in dieser Einheit verarbeitet werden. Deshalb habe ich darüber nachgedacht, einen Verarbeitungsprozess in der aktuellen Einheit zu schreiben und diesen Prozess dann dem AfterInsert-Ereignis von Table zuzuweisen, wenn das Programm ausgeführt wird, und ihn dann zu deaktivieren, nachdem der Import abgeschlossen ist. Es funktioniert, aber es ist immer noch problematisch! Da Sie in den meisten Fällen auf ein solches Problem stoßen, warum lösen Sie es nicht sofort und fassen diesen Vorfall zusammen?
Wie bei Frage 1 benötigen wir hier noch einen Event-Handling-Prozess AfterInsert. Wo soll er dieses Mal auf jeden Fall eingefügt werden?
PROzedur TPgCSV.CSVToDataSet;
beginnen
…
FDataset.DisableControls;
while (not Eof(FFile)) und (not FStop) tun dies
beginnen
//aus CSV lesen
Readln(FFile,RecordString);
//xm4014s Modifikation
if Assigned(FRegulateString) then
FRegulateString(self,RecordString);
//Neuen Datensatz hinzufügen
versuchen
FDataset.Append;
//Sollte hier hinzugefügt werden!
//xm4014s Modifikation
wenn Assigned(FAfterInsert), dann
AfterInsert(self,FDataset);
…
für i:=1 bis CountMapItems tun
…
Ende;
Ebenso müssen hier neue Ereignisdeklarationen und Ereignisattribute definiert werden, da die Parameter von FDataSet übergeben werden müssen. Den Deklarationscode finden Sie unter Verwendung von Delphi-Steuerelementen (2) (http://www.csdn. net/develop/read_article. asp?id=11855).
Nach der Neukompilierung des Steuerelements können Sie im AfterInsert-Ereignis Code hinzufügen, um dem Buchtyp, der Ausgabenummer und der ID-Nummer Werte zuzuweisen.
----Problem 3 und Lösung
Die Probleme mit der Datenbank sind nun behoben. Es besteht jedoch immer noch ein Anzeigeproblem. Das Programm erfordert die Verwendung von ProgressBar, um den Wert von ProgressBar.Max festzulegen Die ISO-Datei vor dem Import, das ist eine Eigenschaft ähnlich wie RecordCount, aber es gibt keine solche Eigenschaft in TPgCSV.
Dann fügen wir ein Attribut wie dieses hinzu
//xm4014s Modifikation
Eigenschaft CSVRecordCount: Ganzzahl lesen FCSVRecordCount schreiben FCSVRecordCount Standard 0;
Wie kann man ihr einen Wert zuweisen? Es ist sehr einfach, die ISO-Datei mit ReadLn(F) zu scannen und dann die Anzahl der Scans zu akkumulieren.
Der Schlüssel liegt darin, wo diese Verarbeitung durchgeführt werden soll. Offensichtlich muss diese Arbeit für dieselbe Datei nur einmal durchgeführt werden. Da die Statistiken für verschiedene Dateien neu berechnet werden müssen, können wir die Textdatei jedes Mal scannen, wenn wir das Dateinamenattribut festlegen.
OK, suchen Sie das Dateinamenattribut von TPgCSV
Eigenschaft CSVFile: String read FCSVFile write FCSVFile;
Nehmen Sie einige kleine Änderungen vor
neue Eigentumserklärung
Eigenschaft CSVFile: String read FCSVFile write SetCSVFile;
Drücken Sie Strg+Umschalt+C, um den Methodencode von SetCSVFile wie folgt zu schreiben
procedure TPgCSV.SetFCSVFile(const Value: string);
var
F1:Textdatei;
iCount:integer;
beginnen
wenn FCSVFile<>Value dann
beginnen
FCSVFile := Wert;
//Sobald der Dateiname geändert wird, scannen Sie erneut und ändern Sie den Wert von FCSVRecordCount.
wenn FileExists(Value), dann
beginnen
AssignFile(F1, Wert);
Zurücksetzen(F1);
iCount:=0;
während Eof(F1) dies nicht tut
beginnen
ReadLn(F1);
Inc(iCount);
Ende;
FCSVRecordCount:=iCount;
Ende;
Ende;
Ende;
Nach der Kompilierung können wir die CSVRecordCount-Eigenschaft sicher aufrufen, um den Datensatzwert vor dem Importvorgang abzurufen:
ProgressBar1.Min :=0;
ProgressBar1.Max:=PgCSV1.CSVRecordCount;
Das obige Programm hat das Debuggen unter Delphi 6.0/Win98 bestanden
An diesem Punkt bin ich im Grunde fertig, ich kann die Änderungen, die ich vorgenommen habe, an meinen Fingern abzählen, aber es ist nur so ein kleines Upgrade, das mir das Gefühl gibt, es zu verwenden Wenn ich es das nächste Mal verwende, werde ich seinen Wert immer mehr erkennen. Und nach dieser Analyse und Modifikation habe ich große Fortschritte gemacht, ein paar Tropfen mehr als eine halbe Kugel, haha! Es sollte darauf hingewiesen werden, dass es sich bei TPgCSV um ein einfaches Steuerelement handelt, das weder sehr komplizierte Beziehungen aufweist noch den Kerninhalt von VCL aufruft, sodass bei der Änderung des Quellcodes kein Grund zur Sorge besteht ist eine sehr komplexe hierarchische Beziehung Sie müssen sorgfältig über jede Codezeile nachdenken, die Sie hinzufügen oder ändern. Andernfalls kann sich dies auf den gesamten Körper auswirken und es wird am Ende schwierig sein, zurückzukehren. Daher basiert das von mir erwähnte Verwendungsprinzip tatsächlich auf dem ohne inhaltliche Änderungen die eigenen Funktionen steuern zu können. Um den Zustand zu erreichen, in dem Sie tun können, was Sie wollen, müssen alle (ich eingeschlossen) weiterhin hart arbeiten! (Anhang: TPgCSV-Download-Adresse http://www.internet-bj.com/delphikongjian.asp?id=2 )