home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Best of the Best
/
_.img
/
w037
/
test.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1992-08-16
|
15KB
|
472 lines
{ Beispielprogramm fⁿr die Verwendung der Biblithek UNZIP100.DLL }
{$R TEST.RES}
Uses
WinTypes,
WObjects,
WinProcs,
WinDOS,
Strings,
WUZHelp, { Hilfsdialog zur Darstellung einer Balkenanzeige }
WUZ; { Diese Unit erm÷glicht den Zugriff auf UNZIP100.DLL }
Const
id_Start = 110;
id_Abort = 111;
id_Info = 112;
id_OverWrite = 120;
id_Quiet = 121;
id_Time = 122;
Const
OverWrite : Boolean = False; { Bestehende Dateien werden nicht ⁿberschrieben }
Quiet : Boolean = False; { Das Entpacken der Dateien wird angezeigt. }
Time : Boolean = False; { Die ben÷tigte Zeit wird nicht angezeigt. }
Type
TApp = Object(TApplication)
Procedure InitMainWindow; Virtual;
End;
Type
PUnzipDlg = ^TUnZipDlg;
TUnZipDlg = Object(TDlgWindow)
Worker : PWorkingDlg;
Procedure Abort(Var Msg: TMessage); Virtual id_First + id_Abort;
Procedure DefWndProc(Var Msg: TMessage); Virtual;
Procedure Start(Var Msg: TMessage); Virtual id_First + id_Start;
Procedure Info(VAr Msg: TMessage); Virtual id_First + id_Info;
Procedure wmCommand(Var Msg : TMessage); Virtual wm_First + wm_Command;
Procedure wmLocalZIPFile(VAR Msg: TMessage);
Procedure wmPercentOne(Var Msg: TMessage);
Procedure wmPercentTen(Var Msg: TMessage);
Procedure wmWUZErrorStr(VAR Msg : TMessage);
Procedure wmWUZQuestion(VAR Msg : TMessage);
Procedure wmWUZUnzipThisFile(Var Msg: TMessage);
End;
Procedure TUnZipDlg.Abort;
Begin
Cancel(Msg)
End;
Procedure TUnZipDlg.DefWndProc(VAR Msg: TMessage);
Begin
TDlgWindow.DefWndProc(Msg);
{ DefWndProc fΣngt die fⁿr uns bestimmten Nachrichten ab }
If Msg.Message = wm_PercentDoneOneStep
Then
wmPercentOne(Msg)
Else
If Msg.Message = wm_PercentDoneTenStep
Then
wmPercentTen(Msg)
Else
If Msg.Message = wm_NameOfLocalZIPFile
Then
wmLocalZIPFile(Msg)
Else
If Msg.Message = wm_WUZErrorStr
Then
wmWUZErrorStr(Msg)
Else
If Msg.Message = wm_WUZQuestionOverWrite
Then
wmWUZQuestion(Msg)
Else
If Msg.Message = wm_WUZUnzipThisFile
Then
wmWUZUnzipThisFile(Msg)
End;
Procedure TUnZipDlg.Start;
{ Diese Prozedur wickelt das gesamte Entpacken des Archives ab }
Var
ZIPArchive : Array [0..128] Of Char;
UnZIPDir : Array [0..128] Of Char;
StopperStart : LongInt;
StopperEnd : LongInt;
StopperDiv : LongInt;
Buffer : Array [0..55] Of Char;
Begin
{ Soll die ben÷tigte Zeit angezeigt werden ? }
If Time
Then
StopperStart := GetTickCount;
{ Archiv und Zielverzeichnis holen }
GetDlgItemText(HWindow, 107, ZIPArchive, SizeOf(ZIPArchive));
GetDlgItemText(HWindow, 108, UnZIPDir, SizeOf(UnZipDir));
{ Soll das Entpacken des Archives angezeigt werden ? }
If Not Quiet
Then
Begin
{ Hilfsfenster mit Balkenanzeige aktivieren }
Worker := New(PWorkingDlg, Init(@Self, PChar(10)));
{ Achtung! Modale Dialoge verhindern eine Bearbeitung von Botschaften }
Application^.MakeWindow(Worker);
{ Balkenanzeige zurⁿcksetzen }
Worker^.ClearMeter;
End;
{ UnzipDLL initialisieren und starten }
InitDll;
{ Sollen bestehende Dateien ⁿberschrieben werden ? }
If OverWrite
Then
WUZOverWriteAlways(True)
Else
WUZOverWriteAlways(False);
{ UNZIP100 den Betriebsmodus mitteilen }
If Quiet
Then
WUZQuiet(True)
Else
WUZQuiet(False);
{ und los gehts ... }
ProzessUnzip(ZIPArchive, UnZIPDir);
{ Soll die ben÷tigte Zeit angezeigt werden ? }
If Time
Then
Begin
{ ben÷tigte Zeit anzeigen }
StopperEnd := GetTickCount;
StopperDiv := StopperEnd - StopperStart;
wvsPrintF(Buffer, '%li Millisekunden.', StopperDiv);
MessageBox(HWindow, Buffer, 'Zeitbedarf', mb_OK);
End;
{ Alles erledigt, aufrΣumen }
DoneDLL;
If Not Quiet
Then
Dispose(Worker, Done);
{ Focus auf das Hauptfenster }
SetActiveWindow(HWindow);
End;
Procedure TUnZipDlg.Info;
{
Diese Prozedur demonstriert die M÷glichkeit gepackte Dateien "On the Fly" zu
entpacken und zu verwenden. Hierzu wird die Datei INFO.INF unter INFO.TMP
entpackt und in NOTEPAD geladen.
ACHTUNG : Die Prozedur sucht die Datei im eigenen Pfad. Wenn Sie TEST.PAS in
der IDE compilieren und ausfⁿhren, mu▀ die Datei INFO.INF in Ihrem EXE & TPU
Verzeichnis stehen !
}
Var
ZIPArchive : Array [0..128] Of Char;
UnZIPDir : Array [0..128] Of Char;
Buffer : Array [0..128] Of Char;
Dummy : String;
Dir : Array [0..128] Of Char;
Name : Array [0..fsFileName] Of Char;
Ext : Array [0..fsExtension] Of Char;
Begin
StrPCopy(Buffer, ParamStr(0));
FileSplit(Buffer, Dir, Name, Ext);
StrCopy(UnZIPDir, Dir);
StrCat(Dir, 'INFO.INF');
StrCopy(ZIPArchive, Dir);
{
UNZIP100 initialisieren und starten.
Anstatt die DLL bei jedem Aufruf erneut zu initialisieren und anschlie▀end
wieder freizugeben, k÷nnen Sie die Methoden InitDLL und DoneDLL selbstver-
stΣndlich auch in den INIT und DONE Methoden Ihrer Applikation einbinden.
Sie sollten dann allerdings verhindern, das gleichzeitige Zugriffe auf die
DLL stattfinden ( UNZIP100.DLL kann immer nur eine Datei bearbeiten ! ).
Ein Vorteil dieser Vorgehensweise ist, das Sie das Copyrightfenster der
DLL dann nur ein einziges Mal angezeigt bekommen.
}
InitDll;
{ bestehende Dateien ⁿberschreiben }
WUZOverWriteAlways(True);
{ UNZIP100 den Betriebsmodus mitteilen }
WUZQuiet(True);
{ und los gehts ... }
ProzessUnzip(ZIPArchive, UnZIPDir);
StrCopy(Buffer, 'NOTEPAD.EXE ');
StrCat(Buffer, UnZipDir);
StrCat(Buffer, 'INFO.TMP');
WinExec(Buffer, sw_ShowMaximized);
{ UNZIP100 wieder Freigeben }
DoneDLL;
{
WICHTIG: Dieses Demo verzichtet darauf, die Datei INFO.TMP nach dem Gebrauch
zu l÷schen. Ihre Applikation sollte dies tun und darⁿberhinaus das TEMP
Verzeichnis verwenden - sonst geht der eigentliche Zweck des Entpackens
"On the Fly" verloren.
}
End;
Procedure TUnZipDlg.wmCommand;
Procedure FlipFlop(Var Flipper : Boolean);
Begin
{ Dreht den ⁿbergebenen Wert um ... }
If Flipper
Then
Flipper := False
Else
Flipper := True;
End;
Begin
{ Wurde ein Schalter im Dialogfenster gedrⁿckt ? }
Case HiWord(Msg.lParam) Of
bn_Clicked : Begin
{ Uns interessieren nur die Konfigurationsschalter }
Case Msg.wParam Of
id_OverWrite : Begin
FlipFlop(OverWrite);
DefWndProc(Msg);
End;
id_Quiet : Begin
FlipFlop(Quiet);
DefWndProc(Msg);
End;
id_Time : Begin
FlipFlop(Time);
DefWndProc(Msg);
End;
Else
TDlgWindow.WMCommand(Msg)
End
End;
Else
TDlgWindow.WMCommand(Msg);
End;
End;
Procedure TUnZipDlg.wmLocalZIPFile;
Var
wo : Array [0..1] Of Word;
s : Array [0..128] Of Char;
Begin
{ Balkenanzeige zurⁿcksetzen }
Worker^.ClearMeter;
{ Adresse mit Dateinamen einlesen.
Msg.wParam enthΣlt den Offset,
Msg.lParam das Segment des Strings im Speicher }
Wo[0] := Word(Msg.wParam); { Offset des Strings }
Wo[1] := Word(Msg.lParam); { Segment des Strings }
wvsPrintF(s, '%s', wo); { String formatieren }
Worker^.SetWorkingFile(s); { im Dialog ausgeben }
{ Die Botschaften wm_LocalZIPFile, wm_PercentDoneTenStep und
wm_PercentDoneOneStep k÷nnen durch einen Aufruf der Procedure
WUZQuiet(TRUE) unterdrⁿckt werden. Durch dieses Vorgehen wird
das Entpacken beschleunigt, da UNZIP100.DLL auf das Versenden
von einigen hundert Botschaften verzichtet.
}
End;
Procedure TUnZipDlg.wmPercentOne;
Begin
{ Balkenanzeige um einen Schritt erh÷hen, Msg.wParam wird nicht ben÷tigt }
Worker^.IncMeter;
{
Msg.wParam enthΣlt den aktuellen Prozentwert, es ist also
alternativ auch m÷glich den Prozentwert in Zahlen auszugeben
}
End;
Procedure TUnZipDlg.wmPercentTen;
Var
d : String;
p : Array [0..4] Of Char;
Begin
{ Msg.wParam enthΣlt den aktuellen Prozentwert / 10 }
wvsPrintF(p, '%d', Msg.wParam);
Worker^.SetPercent(p);
End;
Procedure TUnzipDlg.wmWUZErrorStr;
Var
wo : Array [0..1] Of Word;
s : Array [0..128] Of Char;
Begin
{
UNZIP100.DLL ⁿbergibt der Anwendung einen vollstΣndigen String
mit der Fehlerangabe. Diesen k÷nnen Sie einfach in einer
MessageBox oder einem selbst getalteten Dialogfenster ausgeben.
Adresse mit Dateinamen einlesen. Msg.wParam enthΣlt den Offset,
Msg.lParam das Segment des Strings im Speicher
}
Wo[0] := Word(Msg.wParam); { Offset des Strings }
Wo[1] := Word(Msg.lParam); { Segment des Strings }
wvsPrintF(s, '%s', wo); { String formatieren }
MessageBox(HWindow, s, 'Fehler ...', mb_OK);
End;
Procedure TUnzipDlg.wmWUZQuestion;
Var
wo : Array [0..1] Of Word;
s : Array [0..128] Of Char;
Result : Word;
Begin
{
Anfrage von UNZIP100.DLL an das aufrufende Programm, ob eine
bereits bestehende Datei ⁿberschrieben werden soll.
Adresse mit Dateinamen einlesen. Msg.wParam enthΣlt den Offset,
Msg.lParam das Segment des Strings im Speicher
}
Wo[0] := Word(Msg.wParam); { Offset des Strings }
Wo[1] := Word(Msg.lParam); { Segment des Strings }
wvsPrintF(s, '%s', wo); { String formatieren }
{ Die Antwort auf die Frage wird in Msg.wParam festgehalten ... }
Msg.wParam := MessageBox(HWindow, s, 'Frage', mb_IconQuestion Or mb_YesNo);
{ ... und an UNZIP100.DLL zurⁿckgegeben }
WUZReplyMessage(Msg.Message, Msg.wParam);
{
Wenn Sie bereits bestehende Dateien grundsΣtzlich ⁿberschreiben
lassen wollen, k÷nnen Sie die Procedure WUZOverWriteAlways(TRUE)
aufrufen. In diesem Fall verzichtet die Bibliothek auf die Anfrage
ganz und ⁿberschreibt alle Dateien
}
End;
Procedure TUnzipDlg.wmWUZUnzipThisFile;
Var
wo : Array [0..1] Of Word;
s : Array [0..128] Of Char;
Buffer : Array [0..128] Of Char;
SRec : TSearchRec;
Begin
{
Diese Methode mⁿssen Sie auf jeden Fall in Ihr Programm aufnehmen.
Wenn Sie grundsΣtzlich jede Datei des Archivs entpacken wollen,
geben Sie in WUZReplyMessage als 2.Parameter immer id_Yes
zurⁿck.
WMWUZUnzipThisFile dient als Filter. Sie k÷nnen hier beliebige
Prⁿfroutinen einfⁿhren, z.B. bei einer Programminstallation fest-
stellen, ob sich die Datei BWCC.DLL im Windows\System Verzeichnis
befindet, ist dies der Fall, verzichten Sie auf das Entpacken,
ansonsten installieren Sie die Bibliothek.
}
Wo[0] := Word(Msg.wParam); { Offset des Strings }
Wo[1] := Word(Msg.lParam); { Segment des Strings }
wvsPrintF(s, '%s', wo); { String formatieren }
{
Der von UNZIP100.DLL ⁿbergebene Dateiname befindet sich jetzt in
dem String "S".
Im Programmbeispiel ⁿberprⁿfen Wir das Entpacken nur fⁿr die
Bibliothek BWCC.DLL
}
If StrPos(s, 'BWCC.DLL') <> NIL
Then
Begin
{ Systemverzeichnis von Windows ermitteln }
If GetSystemDirectory(Buffer, SizeOf(Buffer)) <> 0
Then
Begin
{ BWCC.DLL an die Pfadangabe anhΣngen }
StrCat(Buffer, '\BWCC.DLL');
{ Prⁿfen ob sich BWCC.DLL im Pfad befindet }
FindFirst(Buffer, faAnyFile, SRec);
If DosError = 0
Then
{
BWCC.DLL befindet sich im Systemverzeichnis und mu▀
deshalb nicht noch einmal installiert werden.
}
Msg.wParam := id_No
Else
{
Befindet sich nicht im Systemverzeichnis, also wird
die Bibliothek BWCC.DLL installiert
}
Msg.wParam := id_Yes
End
Else
{
Systemverzeichnis konnte nicht ermittelt werden, also
entpacken wir vorsichtshalber BWCC.DLL
}
Msg.wParam := id_Yes;
End
Else
{ Alle ⁿbrigen Dateien aus dem Archiv werden entpackt }
Msg.wParam := id_Yes;
{
Das Ergebnis der Filterfunktion mu▀ UNZIP100.DLL mitgeteilt werden.
Hierzu wird als 1.Parameter die bearbeitete Botschaft, und als
2.Parameter das Ergebnis (id_Yes oder id_No) angegeben
}
WUZReplyMessage(Msg.Message, Msg.wParam);
End;
Procedure TApp.InitMainWindow;
Begin
MainWindow := New(PUnzipDlg,Init(NIL, PChar(102)));
End;
Var
WinUnZipApp : TApp;
Begin
WinUnZipApp.Init('UnZip for Windows');
WinUnZipApp.Run;
WinUnZipApp.Done;
End.