Home » Tutorials » Third-Party-Komponenten » DelphiZip

DelphiZip

TZipmaster-Ereignisse

Die Komponenten stellt einige interessante Ereignisse zur Verfügung:

  • OnCopyZipOverwrite
  • OnCRC32Error
  • OnDirUpdate
  • OnExtractOverwrite
  • OnExtractSkipped
  • OnFilecomment
  • OnGetNextDisk
  • OnMessage
  • OnNewName
  • OnPasswordError
  • OnProgress
  • OnSetNewName

Nehmen wir uns die Ereignisse einzeln vor.

OnCopyZipOverwrite

Dieses Ereignis wird von der Methode CopyZippedFiles ausgelöst. Steht der Parameter OverwriteDest dieser Methode auf dem Wert OvrConfirm, holt sich die Komponente mithilfe diesem Ereignis die Bestätigung.
Der Procedure-Kopf eines Event-Handlers hat folgenden Aufbau:

procedure TForm1.ZipMaster1CopyZipOverwrite(Sender: TObject;
  ForFile: String; var DoOverwrite: Boolean);

Der Parameter ForFile enthält die Einzeldatei in dem Archiv, die überschrieben werden soll. Wird der Referenzparameter DoOverwrite auf True gesetzt wird die Datei überschrieben. Der Standardwert ist False.

OnCRC32Error

Dieses Ereignis wird ausgelöst, falls beim Extrahieren von Dateien aus dem Archiv ein CRC-Fehler auftritt.

procedure TForm1.ZipMaster1CRC32Error(Sender: TObject; ForFile: String;
  FoundCRC, ExpectedCRC: Cardinal; var DoExtract: Boolean);

ForFile gibt die Datei in dem Archiv zurück. Die genaue Fehlerquelle liefern die Parameter FoundCRC und ExpectedCRC zurück. Bei FoundCRC handelt es sich um den berechneten CRC-Wert und ExpectedCRC hat den Wert des gespeicherten CRC. Über DoExtract lässt sich einstellen, ob die fehlerhafte Datei extrahiert werden soll (True) oder nicht (False).

OnDirUpdate

Dieses Ereignis wird ausgelöst, wenn die Komponente den Inhalt des Archivs neu einlist (Eigenschaft ZipContents). Dies ist Beispielsweise der Fall, wenn man die Eigenschaft ZipFilename ändert oder die Methode List aufruft.

OnExtractOverwrite

Dieses Ereignis wird ausgelöst, wenn während eines Entpackvorgangs eine Datei überschrieben werden könnte.

procedure TForm1.ZipMaster1ExtractOverwrite(Sender: TObject;
  ForFile: String; IsOlder: Boolean; var DoOverwrite: Boolean;
  DirIndex: Integer);

Bei ForFile handelt es sich wieder um die entsprechende Datei in dem Archiv. IsOlder hat den Wert True, wenn die Datei auf dem Datenträger älter als die Datei im Archiv ist. Setzt Du den Referenzparameter DoOverwrite auf True wird die Datei überschrieben. DirIndex gibt den Eintrag in der Liste ZipContents zurück. Über diese Liste lassen sich Informationen (Größe, Datum usw.) holen, um weitere Vergleiche anstellen zu können.

OnExtractSkipped

Dieses Ereignis wird ausgelöst, wenn eine Datei im Archiv übersprungen (to skip) wurde. Gründe kann es dafür mehrere geben:

UnZipSkipTypes = (stOnFreshen, stNoOverwrite, stFileExists, stBadPassword,
                    stNoEncryptionDLL, stCompressionUnknown, stUnknownZipHost,
                    stZipFileFormatWrong, stGeneralExtractError);
  • stOnFreshen: Die Datei auf dem Datenträger war aktueller
  • stNoOverwrite: Die Datei wurde nicht überschrieben
  • stFileExists: Die Datei existiert bereits
  • stBadPassword: Falsches Passwort
  • stNoEncryptionDll: Die entsprechende DLL wurde nicht gefunden
  • stCompressionUnknown: Die Kompression ist unbekannt
  • stUnknownZipHost: ??
  • stZipfileFormatWrong: Falsches Zip-Format
  • stGeneralExtractError: Allgemeiner Fehler beim Entpacken

Diese Informationen befinden sich im Parameter SkipType. ForFile gibt den Namen der Datei an und über ExtError wird ein Fehlercode übermittelt.

OnFilecomment

Dieses Ereignis wird ausgelöst, wenn der Header des Zip-Archivs geschrieben werden. Dort kann dann für jede Datei ein Kommentar abgegeben werden.

procedure TForm1.ZipMaster1FileComment(Sender: TObject; ForFile: String;
  var FileComment: String; var IsChanged: Boolean);

ForFile gibt den Dateinamen zurück. Der Kommentar, welcher auf 511 Zeichen begrentzt ist, wird dem Parameter FileComment übergeben. Beachte, dass die Kommentare nicht komprimiert werden und das Archiv somit aufblähen. Soll der Kommentar letztendlich wirklich gesetzt werden, muss der Parameter IsChanged auf True gesetzt werden.

OnGetNextDisk

Wird ein Archiv auf mehrere Datenträger verteilt, wird dieses Ereignis immer dann aufgerufen, wenn ein neuer Datenträger benötigt wird.

procedure TForm1.ZipMaster1GetNextDisk(Sender: TObject; DiskSeqNo,
  DiskTotal: Integer; Drive: String; var AbortAction: Boolean);

DiskSeqNo enthält die Nummer des Datenträgers, welche benötigt wird. Die Gesamtanzahl der benötigten Datenträger lässt sich über den Parameter DiskTotal ermitteln. Das Laufwerk, auf dem nach dem Datenträger gesucht werden soll, wird dem Parameter Drive übergeben. Der ganze Vorgang kann durch das Setzen auf True des Parameters AbortAction abgebrochen werden.

OnMessage

Dieses Ereignis wird ausgelöst, wenn die Komponente eine Nachricht sendet. Die Eigenschaften Verbose und Tracert haben wesentlichen Einfluss auf die Anzahl der eintreffenden Nachrichten.

OnNewName

Liest die Komponente den Header des Zip-Archivs ein und findet dabei neue Einträge wird dieses Ereignis ausgelöst.

procedure TForm1.ZipMaster1NewName(Sender: TObject; SeqNo: Integer;
  ZipEntry: ZipDirEntry);

SeqNo gibt den aktuellen Datensatz in dem Archiv an (Zahl von 1 bis Anzahl der Dateien). Über den Parameter ZipEntry lassen sich weitere Informationen zu diesem Eintrag ermitteln. ZipEntry.Filnemae gibt Beispielsweise den Dateinamen zurück oder mithilfe von ZipEntry.CompressedSize lässt sich die komprimierte Größe ermitteln.

OnPasswordError

Archive können mit einem Passwort geschützt werden. Ist das Passwort fehlerhaft wird dieses Ereignis ausgelöst. Ist dem Ereignis kein Event-Handler zugeordnet wird ein Standard-Dialog angezeigt.

procedure TForm1.ZipMaster1PasswordError(Sender: TObject;
  IsZipAction: Boolean; var NewPassword: String; ForFile: String;
  var RepeatCount: Cardinal; var Action: TPasswordButton);

Ein Passwort kann beim Entpacken sowie beim Hinzufügen von Dateien in ein Archiv benötigt werden. Der Parameter IsZipAction kommt die Anfrage direkt von der ZipDLL. Das neue Passwort musst du dem Referenzparameter NewPassword übergeben. ForFile gibt den Dateinamen des Archivs zurück. RepeatCount is quasi ein Zähler, der die Anzahl der verbleinen Versuche runterzählt. Beeinflusst werden kann er über die Eigenschaft PasswordReqCount (Standardwert: 1). Der Parameter Action hat wesentlichen Einfluss auf den weiteren Verlauf des Entpackens. Es handelt sich hierbei um eine Aufzählung:

Type TPasswordButton  = ( pwbOk, pwbCancel, pwbCancelAll, pwbAbort );

pwbOk bedeutet, dass ein weiterer Versuch stattfindet die Datei zu entpacken. pwdCancel überspringt die Datei, pwbCancelAll überspringt alle Dateien und pwdAbort bricht alle weiteren Vorgänge ab.

OnProgress

Dieses Ereignis wird während eines Pack- bzw. Entpackvorgangs ausgelöst. Die Procedure des Event-Handlers kann so aussehen:

procedure TForm1.ZipMaster1Progress(Sender: TObject; ProgrType: ProgressType;
  Filename: string; FileSize: Integer);

ProgrType kann folgende Werte annehmen:

  • TotalSize2Process: Die Größe der Datei(en), die bearbeitet werden sollen in Bytes.
  • TotalFiles2Process: Anzahl der Dateien, die bearbeitet werden sollen.
  • NewFile: Es wird eine neue Einzeldatei bearbeitet.
  • ProgressUpdate: Dieser Wert ist wichtig, wenn man den Verlauf in Form einer Fortschirttsanziege visualisieren möchte.
  • EndOfBatch: Ist der Bearbeitungsablauf beendet steht ProgrType auf diesem Wert.

Der Parameter FileName gibt den aktuellen Dateinamen der Einzeldatei an. Erst wenn ProgrType auf NewFile steht, ist dieser Parameter gefüllt. FileSize gibt die Größe der Gesamtdateien an. Steht ProgrType allerdings auf ProgressUpdate gibt FileSize die Größe des Arbeitsprozesses an.

OnSetNewName

Mithilfe dieses Ereignisses ist es möglich, die originale Verzeichnisstruktur/Dateistruktur vor dem Packvorgang zu beeinflussen.

procedure TForm1.ZipMaster1SetNewName(Sender: TObject;
  var OldFileName: String; var IsChanged: Boolean);

Der neue Dateiname (inkl. Pfad) kann dem Referenzparameter OldFilename übergeben werden. Sollen die Änderungen nun übernommen werden muss der Parameter IsChanged auf True gesetzt werden.