var //Globale Variablenvergabe
UserDirPageCAE : TInputDirWizardPage;
DOSBoxConf : TStringList;
GPSDirCheckBox : TRadioButton;
SplashImage: TBitmapImage;
SplashForm: TForm;
a, b, c, d : word;
SetupMajor, SetupMinor, SavedMajor, SavedMinor : dword;
UserFolderCAE, tmp, SplashFileName, DOSBoxCAE2000Path, DOSBoxCAE2000UninstallString,
DOSBoxCAE2000UninstallPath, DOSBoxCAE2000UninstallName, DOSBoxCAE2000UninstallPathRemovedQuotes,
DOSBoxCAE2000UninstallNameRemovedQuotes, DOSBoxCAE2000UninstallStringRemovedQuotes, CAE2000Path,
GPSPath, GetCAE2000Path :
string;
GPSDirCheckBoxChecked, ResultDOSBoxCAE2000PathCheck, ResultAktuelleAppFound, ResultDOSBoxCAE2000DontDeinstall : boolean;
I: Integer;
function CreateDWord(
const Hi, Lo: word): dword;
//Registry-Schlüssel für die Versionsnummer
begin
Result := (Hi
shl 16)
or Lo;
end;
function DecodeVersion(
const dwMajor, dwMinor: dword):
string;
//Entschlüsselung der Versionsnummer
begin
a := word(dwMajor
shr 16);
b := word(dwMajor
and not $ffff0000);
c := word(dwMinor
shr 16);
d := word(dwMinor
and not $ffff0000);
Result := Format('
%d.%d.%d.%d',[a,b,c,d])
end;
function IsSetupNewer: boolean;
//Versionsabgleich der vorhandenen Installation zur neuen Installation
var
ResultCode : integer;
begin
if (
not RegQueryDWordValue(
HKLM,'
{#UNINSTKEY}','
MajorVer',
SavedMajor))
or
(
not RegQueryDWordValue(
HKLM,'
{#UNINSTKEY}','
MinorVer',
SavedMinor))
then
begin
if (RegQueryStringValue(
HKLM,'
{#UNINSTKEY}',
'
UninstallString',tmp))
and
(tmp <> '
')
and
(fileexists(tmp))
then
begin
Result := (MsgBox(ExpandConstant('
{cm:NotVerifiedVersionFound}'),mbConfirmation,MB_YESNO
or MB_DEFBUTTON2) = IDYES);
exit;
end;
end;
SetupMajor := CreateDWord(
{#MAJOR},
{#MINOR});
SetupMinor := CreateDWord(
{#RELEASE},
{#BUILD});
//Neuere Version ist installiert
Result := (SetupMajor > SavedMajor)
or ((SetupMajor = SavedMajor)
and (SetupMinor >= SavedMinor));
//Gleiche Version ist bereits installiert
ResultAktuelleAppFound := (SetupMajor = SavedMajor)
or ((SetupMajor = SavedMajor)
and (SetupMinor = SavedMinor));
//Ermitteln und Umformen des Deinstallationspfades
RegQueryStringValue(
HKLM,'
{#UNINSTKEY}','
UninstallString',DOSBoxCAE2000UninstallString);
DOSBoxCAE2000UninstallPath := (ExtractFileDir(DOSBoxCAE2000UninstallString) + '
\' + '
"');
DOSBoxCAE2000UninstallName := ('
"' + ExtractFileName(DOSBoxCAE2000UninstallString));
DOSBoxCAE2000UninstallStringRemovedQuotes := RemoveQuotes(DOSBoxCAE2000UninstallString);
DOSBoxCAE2000UninstallPathRemovedQuotes := RemoveQuotes(DOSBoxCAE2000UninstallPath);
DOSBoxCAE2000UninstallNameRemovedQuotes := RemoveQuotes(DOSBoxCAE2000UninstallName);
if not Result
then
begin
if RegQueryStringValue(
HKLM,'
{#UNINSTKEY}','
InstallLocation',DOSBoxCAE2000Path)
then
begin
result := DirExists(DOSBoxCAE2000Path);
end;
if not Result
then
begin
//Installationspfad der vorhandenen Installation kann nicht ermittelt werden
MsgBox(ExpandConstant('
{cm:DOSBoxPathNotFound}'),mbError,MB_OK);
//Abbruch der Installation wenn der Pfad akteuelle Installationspfad nicht ermittelt werden konnte
ResultDOSBoxCAE2000PathCheck := false;
end;
//Messagebox das eine aktuellere Version installiert ist
if MsgBox(ExpandConstant('
{cm:NewerAppFound}'),mbError,MB_YESNO
or MB_DEFBUTTON2) = IDYES
then
begin
//Silent-Ausführung der Deinstallation wenn aktuellere Version installiert ist und Benutzer dem zustimmte
Exec(ExpandConstant(DOSBoxCAE2000UninstallStringRemovedQuotes),'
/SILENT','
',SW_SHOW,ewWaitUntilTerminated,ResultCode);
end else
//Abbruch des Setups sobald der Benutzer sich gegen eine Deinstallation der aktuellen Version entscheidet
ResultDOSBoxCAE2000DontDeinstall := true;
end;
if ResultAktuelleAppFound = true
then
begin
//Messagebox das die aktuellere Version gleich der zu installierenden ist
MsgBox(Format(ExpandConstant('
{cm:AktuelleAppFound}'),[DecodeVersion(SavedMajor,SavedMinor)]),mbConfirmation,MB_OK);
end;
end;
function SaveVersionInfo: boolean;
//Aktuelle Versionsnummer in die Registry schreiben
begin
Result := (RegWriteDWordValue(
HKLM,'
{#UNINSTKEY}','
MajorVer',
CreateDWord(
{#MAJOR},
{#MINOR})))
and
(RegWriteDWordValue(
HKLM,'
{#UNINSTKEY}','
MinorVer',
CreateDWord(
{#RELEASE},
{#BUILD})));
end;
function InitializeSetup: boolean;
begin
UserFolderCAE := '
';
Result := true;
Result := IsSetupNewer;
if ResultDOSBoxCAE2000PathCheck = true
then //Abbruchfunktion wenn der aktuelle Installationspfad nicht \
ermittelt werden konnte
begin
result := false;
end;
if ResultDOSBoxCAE2000DontDeinstall = true
then //Abbruchfunktion wenn der Benutzer sich gegen eine \
Deinstallation entschieden hat
begin
result := false;
end;
if ResultAktuelleAppFound = true
then //Abbruchfunktion wenn bereits die aktuelle Version installiert ist
begin
result := false;
end;
end;
function InstallCae(Param:
String):
String;
//Schreiben des, vom Benutzer ermittelten, CAE2000-Pfades
begin
Result := UserDirPageCAE.Values[0];
CAE2000Path := UserDirPageCAE.Values[0];
RegWriteStringValue(
HKLM, '
{#UNINSTKEY}','
CAE2000Location', CAE2000Path);
//Erstellen eines Registry-Eintrages für den CAE2000-Pfad
end;
function GPSDir(Param:
String):
String;
begin
GPSPath := UserDirPageCAE.Values[1];
end;
procedure GPSDirCheckBoxOnClick(Sender: TObject);
//Einblenden und Einstellen eines separaten GPS-Pfades
begin
if GPSDirCheckBox.Checked
then
begin
UserDirPageCAE.Add('
Zielverzeichnis des GPS Ordner´s');
//GPS-Verzeichnisauswahlfenster
UserDirPageCAE.Values[1] := ExpandConstant('
C:\CAE2000\');
//GPS-Standardpfad in der Verzeichnisauswahl
end
end;
procedure InitializeWizard;
begin
SplashFileName := ExpandConstant('
{tmp}\WISAG Logo weiß.bmp');
//Einblenden vom WISAG-Logo für Zeit x
ExtractTemporaryFile(ExtractFileName(SplashFileName));
//WISAG-Logo aus dem tmp-Verzeichnis aufrufen
SplashForm := TForm.create(
nil);
with SplashForm
do
begin
BorderStyle := bsNone;
Position := poScreenCenter;
// Bildposition angeben
ClientWidth := 980;
// Bildgröße angeben (Breite in px)
ClientHeight := 467;
// Bildgröße angeben (Höhe in px)
end;
SplashImage := TBitmapImage.Create(SplashForm);
with SplashImage
do
begin
Bitmap.LoadFromFile(SplashFileName);
Stretch := true;
Align := alClient;
Parent := SplashForm;
end;
with SplashForm
do
begin
Show;
for I := 1
to 2
do // Anzeigedauer in Sekunden; 1 to 2 = 2 Sekunden)
begin
Repaint;
Sleep(1000);
end;
Close;
Free;
end;
UserDirPageCAE := CreateInputDirPage(wpSelectDir,
//Zusätzliche Verzeichnisauswahlseite einbinden
ExpandConstant('
{cm:CAEVerzeichnis}'),
ExpandConstant('
{cm:SpeicherortPRTDEF}'),
ExpandConstant('
{cm:SpeicherzielPRTDEF}'),
false,
'
Neuer Ordner');
UserDirPageCAE.Add('
Zielverzeichnis der CAE2000.EXE');
//CAE-Verzeichnisauswahlfenster
UserDirPageCAE.Values[0] := ExpandConstant('
C:\CAE2000\');
//CAE-Standardpfad in der Verzeichnisauswahl
GPSDirCheckBox := TRadioButton.Create(UserDirPageCAE);
//Radio-Button zum Einblenden bei separaten GPS-Pfad
with GPSDirCheckBox
do //Parameter für die GPS-CheckBox
begin
GPSDirCheckBox.Parent := UserDirPageCAE.Surface;
Caption := ExpandConstant('
{cm:GPSVerzeichnis}');
Left := ScaleX(0);
Top := ScaleY(120);
Width := ScaleX(400);
Height := ScaleY(40);
Checked := GPSDirCheckBoxChecked;
OnClick := @GPSDirCheckBoxOnClick;
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
//Eintragen der benutzerspezifischen Pfadangaben \
in die DOSBox-Konfigurationsdatei
begin
if CurStep=ssPostInstall
then
begin;
DOSBoxConf := TStringList.Create;
DOSBoxConf.LoadFromFile((ExpandConstant('
{localappdata}\DOSBox\dosbox-SVN_MB6.conf')));
DOSBoxConf[298] := copy(DOSBoxConf[298],1,22)+(ExpandConstant('
{app}\PrintOut\SELECT.PCL'))+copy(DOSBoxConf[298],30,length(DOSBoxConf[298]));
DOSBoxConf[355] := copy(DOSBoxConf[355],1,9)+(ExpandConstant('
"{code:InstallCae}\"'))+copy(DOSBoxConf[355],24,length(DOSBoxConf[355]));
DOSBoxConf[356] := copy(DOSBoxConf[356],1,9)+(ExpandConstant('
"{app}\"'))+copy(DOSBoxConf[356],24,length(DOSBoxConf[356]));
if GPSDirCheckBox.Checked
then
begin
DOSBoxConf[357] := copy(DOSBoxConf[357],1,1)+'
mount D '+(ExpandConstant('
"{code:GPSDir}\"'))+copy(DOSBoxConf[357],24,length(DOSBoxConf[357]));
end;
DOSBoxConf.SaveToFile((ExpandConstant('
{localappdata}\DOSBox\dosbox-SVN_MB6.conf')));
DOSBoxConf.Free;
SaveVersionInfo;
end;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
//Code für deinstallation
begin
RegQueryStringValue(
HKLM,'
{#UNINSTKEY}','
CAE2000Location',GetCAE2000Path);
if CurUninstallStep = usAppMutexCheck
then
begin
//Kopieren der Backupdatei ins Originalverzeichnis
FileCopy(ExpandConstant(GetCAE2000Path) + '
\Backup\PRTDEF.GER', ExpandConstant(GetCAE2000Path) + '
\PRTDEF.GER', false);
end;
if CurUninstallStep=usDone
then
begin
RegDeleteKeyIncludingSubkeys(
HKLM, '
{#UNINSTKEY}');
//Löschen des Rigistry-Eintrages nach der Deinstallation
end;
end;