Inno Setup - Como sair de um loop após realizar a chamada de um evento de clique de um botão cancelar?

Delphi

12/11/2013

Pessoal bom dia!

Tenho um projeto que utilizo o Inno Setup p/ realizar a atualização do meu sistema e estou com o problema, que é sair de um loop quando o usuário desejar cancelar o processo.
Eu preciso sair deste loop quando o usuário clicar no "botão cancelar" da tela do inno Setup.

Alguém saberia me dizer qual seria o comando ou rotina que poderia colocar no código abaixo , similar ao DoEvents do VB6, para que eu consiga permitir ao usuário cancelar o processo?

//RetornaMinutos => função que me retorna o tempo em minutos.
//AtualizaStatus => função p/ atualizar o andamento do processo através de um label que criei.

//AGUARDA ATÉ A HORA AGENDADA
while (RetornaMinutos(EditHora.Text) > RetornaMinutos('''''''')) do
begin
TimeShow := (RetornaMinutos(EditHora.Text) - RetornaMinutos(''''''''));
AtualizaStatus(TimeShow + '''' min para iniciar o processo.'''', clBlue);

//DoEvents

//sleep(1000);
end;



Eu preciso de alguma forma permitir que o usuário consiga cancelar o processo uma vez que o usuário iniciou o processo e não estou sabendo como sair deste loop.
Porem no Inno não sei fazer isso.

Segue abaixo o código completo do meu projeto.



#define public SourceFileDir ''''C:\VB6\MANAGER\CFSw\Setup''''
#define public SourceVBDir ''''C:\VB6\MANAGER''''
#define public SourceVB6 ''''C:\VB6\''''

;!!!!!!!!!!!!!!!ATENÇÃO: NECESSÁRIOS INFORMAR VERSÃO DO BANCO PARA GERAR CORRETAMENTE A VERSÃO !!!!!!!!!!!!!!
;PADRÃO SHOPPING GSHOP => XXX.XX.XX e BD => XX.XX
;DEMAIS SISTEMAS GROUP => XX.XX.XX e BD => XX.XX

#define BDVersion "1170"
#define VerMajor
#define VerMinor
#define VerBuild
#define VerRevision

#expr ParseVersion(AddBackslash(SourceVBDir) + "\CFSW\GManager.exe", VerMajor, VerMinor, VerBuild, VerRevision)
#if (Len(str(VerRevision))) <= 1
#define AppVersion str(VerMajor) + "." + str(VerMinor) + "." + "0" + str(VerRevision)
#define AppBuild str(VerMajor) + str(VerMinor) + "0" + str(VerRevision)
#else
#define AppVersion str(VerMajor) + "." + str(VerMinor) + "." + str(VerRevision)
#define AppBuild str(VerMajor) + str(VerMinor) + str(VerRevision)
#endif

;!!!!!!!!!!!!!!!ATENÇÃO: NECESSÁRIOS INFORMAR VERSÃO DO BANCO PARA GERAR CORRETAMENTE A VERSÃO !!!!!!!!!!!!!!

;#define public VersaoNormal true
;#define public VersaoFlex false
;#define public VersaoCorp false
;#define public VersaoOracle false

;#define public Operacao 0

;#IF VersaoNormal
#define public AppName "Group Manager"
;#ELIF VersaoCorp
; #define public AppName "Group Manager - Corporate"
;#ELIF VersaoFlex
;#ELSE
; #define public AppName "Group Manager - Flex"
;#ELSE
; #define public AppName "Group Manager - ORACLE"
;#ENDIF


[Setup]
AppName={#AppName} Versão: {#AppVersion}
AppVersion={#AppVersion}
AppVerName={#AppName}

AppPublisher=Group Software Sistemas
AllowNoIcons=no
WindowVisible=yes
OutputDir={#SourceFileDir}\Instalador


;#IF VersaoNormal
OutputBaseFilename=Vr_Manager_{#BDVersion}_{#AppBuild}
;OutputBaseFilename=Vr_Manager_{code:GetVersaoBD|''''''''}_AppVersion

;#ELIF VersaoCorp
; OutputBaseFilename=Vr_Manager_Corp_{#BDVersion}_{#AppBuild}
;#ELIF VersaoFlex
; OutputBaseFilename=Vr_Manager_Flex_{#BDVersion}_{#AppBuild}
;#ELSE
; OutputBaseFilename=Vr_Manager_Oracle_{#BDVersion}_{#AppBuild}
;#endif

SetupIconFile={#SourceFileDir}\Instalador\ico_manager.ico
SolidCompression=yes
AppPublisherURL=www.groupsoftware.com.br
AppSupportURL=www.groupsoftware.com.br
AppUpdatesURL=www.groupsoftware.com.br
DefaultDirName=\Group Software\Manager
Compression=lzma/ultra64
VersionInfoVersion={#AppVersion}
VersionInfoCompany=Group Software
VersionInfoCopyright=AVISO: Este programa de computador é protegido por leis de direitos autorais e tratados internacionais. A reprodução ou distribuição não autorizada deste programa, ou de qualquer parte dele, resultará em severas punições civis e criminais, e os infratores serão punidos sob a máxima extensão possível dentro da lei.
VersionInfoProductName=Manager
VersionInfoProductVersion={#AppVersion}
AppCopyright=AVISO: Este programa de computador é protegido por leis de direitos autorais e tratados internacionais. A reprodução ou distribuição não autorizada deste programa, ou de qualquer parte dele, resultará em severas punições civis e criminais, e os infratores serão punidos sob a máxima extensão possível dentro da lei.
WizardImageFile={#SourceFileDir}\Instalador\Instalador.bmp
WizardSmallImageFile={#SourceFileDir}\Instalador\Logo_Manager.bmp
WizardImageStretch=true
UserInfoPage=false
AppSupportPhone=(31)2103-5700
DisableProgramGroupPage=yes
AppendDefaultGroupName=false
AppendDefaultDirName=false
DisableStartupPrompt=TRUE
DisableFinishedPage=false
DisableReadyPage=true
DisableDirPage =false
UsePreviousGroup=true
ShowLanguageDialog=no
LanguageDetectionMethod=locale
UsePreviousUserInfo=false
SetupLogging=true
Uninstallable=no

[Languages]
;Name: "brazilianportuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese_Manager_Atualizador.isl"
Name: brazilianportuguese; MessagesFile: compiler:Languages\BrazilianPortuguese.isl

[Files]
; Add the ISSkin DLL used for skinning Inno Setup installations.
Source: "{#SourceFileDir}\bin\ISSkin.dll"; DestDir: ""; Flags: dontcopy

; Add the Visual Style resource contains resources used for skinning,
; you can also use Microsoft Visual Styles (*.msstyles) resources.
Source: "{#SourceFileDir}\Instalador\Templates\Office2007.cjstyles"; DestDir: ""; Flags: dontcopy


;Source: "{#SourceVB6}\Atualizador Automatico\Atualizador.exe"; DestDir: ""; Flags: ignoreversion recursesubdirs createallsubdirs overwritereadonly deleteafterinstall; Check: GetOperacao
Source: "{#SourceVBDir}\CFSW\GManager.exe"; DestDir: ""; DestName: "GManager.exe"; Flags: ignoreversion overwritereadonly; Check: GetOperacao
Source: "{#SourceVBDir}\CFSw\RegAsm.exe"; DestDir: ""; Flags: ignoreversion overwritereadonly; Check: GetOperacao

Source: "{#SourceVBDir}\CFSw\*.rpt"; DestDir: ""; Flags: ignoreversion overwritereadonly; Check: GetOperacao
Source: "{#SourceVBDir}\CFSw\*.bmp"; DestDir: ""; Flags: ignoreversion overwritereadonly; Check: GetOperacao
Source: "{#SourceVBDir}\CFSw\NFSe_Util.dll"; DestDir: ""; Flags: ignoreversion overwritereadonly; Check: GetOperacao
Source: "{#SourceVBDir}\CFSw\NFSe_Util_nat.dll"; DestDir: ""; Flags: ignoreversion overwritereadonly; Check: GetOperacao
Source: "{#SourceVBDir}\CFSw\registraDLL.bat"; DestDir: ""; Flags: ignoreversion overwritereadonly; Check: GetOperacao
Source: "{#SourceVBDir}\CFSw\desregistraDLL.bat"; DestDir: ""; Flags: ignoreversion overwritereadonly; Check: GetOperacao
Source: "{#SourceVBDir}\Upgrade\UpgGM.mdb"; DestDir: ""; Flags: ignoreversion recursesubdirs createallsubdirs overwritereadonly; Check: GetOperacao

;FAZ BACKUP DA PASTA INTEIRA
;Source: \*; DestDir: \BackupAtualizador; Flags: external skipifsourcedoesntexist uninsneveruninstall; Check: GetOperacao

[Dirs]
; POSSIBILITA A CRIAÇÃO DE OUTRAS PASTAS DURANTE A INSTALAÇÃO (exemplos: log, eventos, erros, etc.)
Name: \BackupAtualizador; Check: GetOperacao
;Name: \erros


[Run]
Filename: \GManager.exe; Description: {cm:LaunchProgram,Manager}; Flags: nowait postinstall skipifsilent unchecked postinstall

[InstallDelete]
;Type: files; Name:

[Registry]
Root: HKLM; SubKey: Software\ODBC\ODBC.INI\ODBC Data Sources; ValueType: string; ValueName: CRSS; ValueData: SQL Server; Flags: createvalueifdoesntexist uninsdeletevalue
Root: HKLM; SubKey: Software\ODBC\ODBC.INI\CRSS; Flags: createvalueifdoesntexist uninsdeletevalue; ValueName: Driver; ValueType: string; ValueData: C:\Windows\system32\SQLSRV32.dll
Root: HKLM; SubKey: Software\ODBC\ODBC.INI\CRSS; Flags: createvalueifdoesntexist uninsdeletevalue; ValueName: LastUser; ValueType: string; ValueData: SISTEMA



[tagcod]
const
adCmdUnspecified = $FFFFFFFF;
adCmdUnknown = $00000008;
adCmdText = $00000001;
adCmdTable = $00000002;
adCmdStoredProc = $00000004;
adCmdFile = $00000100;
adCmdTableDirect = $00000200;
adOptionUnspecified = $FFFFFFFF;
adAsyncExecute = $00000010;
adAsyncFetch = $00000020;
adAsyncFetchNonBlocking = $00000040;
adExecuteNoRecords = $00000080;
adExecuteStream = $00000400;
adExecuteRecord = $00000800;
chave = ''''SEGURANCA'''';

var
Page: TWizardPage;
CabecalhoStaticText, FormatoHStaticText, FormatoMStaticText, DataStaticText, HoraStaticText: TNewStaticText;
EditData: TNewEdit;
EditHora: TNewEdit;
//Edit3: TEdit;
//UserPage: TInputQueryWizardPage;
UsagePage: TInputOptionWizardPage;
//DataDirPage: TInputDirWizardPage;
FinishedInstall: Boolean;
CodOperacao: Integer;

//ProgressBar, ProgressBar2, ProgressBar3: TNewProgressBar;
ProgressBar3: TNewProgressBar;
CancelButton: TNewButton;

//BOTÃO P/ TESTE DE CONEXÃO
StatusLabel: TLabel;
ConnectButton: TButton;

//CONEXÃO
Cnn: Variant;
gCaminho: String;

// Importing LoadSkin API from ISSkin.DLL
procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external ''''LoadSkin@files:isskin.dll stdcall'''';

// Importing UnloadSkin API from ISSkin.DLL
procedure UnloadSkin();
external ''''UnloadSkin@files:isskin.dll stdcall'''';

// Importing ShowWindow Windows API from User32.DLL
function ShowWindow(hWnd: Integer; uType: Integer): Integer;
external ''''ShowWindow@user32.dll stdcall'''';

procedure ExitProcess(exitCode:integer);
external ''''ExitProcess@kernel32.dll stdcall'''';

//procedure DoEvents;
//var
// //Msg: TMsg;
// Msg: String;
//begin
// while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
// begin
// TranslateMessage(Msg);
// DispatchMessage(Msg);
// end;
//end;


//procedure OptionOnClick(Sender: TObject);
Function AbrirArquivo(): String;
var
Filename: string;
begin

//CreateMutex(''''MyProgramsMutexName'''');

gCaminho:= ''''''''
Result:= ''''''''
if GetOpenFileName('''''''', Filename, '''''''', ''''Backup (*.bkp;*.bak)|*.bkp;*.bak|All Files|*.*'''', ''''bkp'''') then begin
gCaminho:= Filename
Result:= Filename
end;
end;


Function InitializeSetup(): Boolean;
//var
//Version: TWindowsVersion;
begin

ExtractTemporaryFile(''''Office2007.cjstyles'''');
LoadSkin(ExpandConstant(''''\Office2007.cjstyles''''), ''''NormalAqua.ini'''');
Result := true;
end;

Function AtualizaStatus(Texto: string; Cor: Variant): String;
begin
StatusLabel.Font.Color := Cor;
StatusLabel.Caption := Texto;
StatusLabel.refresh
end;


function InStr(Start: integer; Source: string; SourceToFind: string): integer;
begin
Result := pos(SourceToFind,copy(Source,Start,Length(Source) - (Start - 1)));
end;

function Split(Source, Deli: string; StringList: TStringList): TStringList;
var
EndOfCurrentString: byte;
begin
repeat
EndOfCurrentString := Pos(Deli, Source);
if EndOfCurrentString = 0 then
StringList.add(Source)
else
StringList.add(Copy(Source, 1, EndOfCurrentString - 1));
Source := Copy(Source, EndOfCurrentString + length(Deli), length(Source) - EndOfCurrentString);
until EndOfCurrentString = 0;
result := StringList;
end;

function Replace(sData: String; sSubstring: String; sNewsubstring: string): String;
var
i: integer;
lSub: Longint;
lData: Longint;
begin
i := 1;
lSub := Length(sSubstring);
lData := Length(sData);
repeat begin
i := InStr(i, sData, sSubstring);
If i = 0 Then begin
sNewSubString := sData;
Exit
end Else
sData := Copy(sData, 1, i - 1) + sNewsubstring + Copy(sData, i + lSub, lData);
i := i + lSub;
End;
Until i > lData;
Result := sData;
end;

function Left(Const Str: String; Size: Word): String;
begin
Result := Copy(Str,1,Size)
end ;

function Mid(Source: string; Start: integer; Length: integer): string;
begin
Result := copy(Source,Start,Length);
end;

Function Right (S: String; Index: Integer): String;
begin
Result := Copy(S, Length(S) - Index + 1, 255);
end;

function RetornaMinutos(vTime: string): double;
var
vTime1: string;
vTime2: string;
begin

if trim(vTime) = '''''''' then begin
Result := (strToInt(GetDateTimeString(''''hh'''', #0, #0)) * 60) + strToInt(GetDateTimeString(''''nn'''', #0, #0));
end else begin

vTime1:= Left(vTime,2);
vTime2:= Right(vTime,2);

Result := (strToint(vTime1) * 60) + strToint(vTime2);
end;
end;

Function DesCriptoSimples(Texto: String; Valor: Byte): String;
var
ErrorCode: Integer;
indchave: Integer;
chartmp: Byte;
Strtmp: String;
ChaveMin: String;
i: Integer;

begin
try
result := '''''''';
ChaveMin := LowerCase(chave);
indchave := 1;
for i := 1 to Length(Texto) do
begin

//Mid(Texto, i, 1)[1] => [1] conversão p/ char necessária, pois a função Ord recebe um char como parametro.
chartmp := Ord(Mid(Texto, i, 1)[1]) - Ord(Mid(ChaveMin, indchave, 1)[1]) - Valor
//ORIGINAL => chartmp := Asc(Mid(Texto, i, 1)) - Asc(Mid(ChaveMin, indchave, 1)) - Valor
Strtmp := Strtmp + Chr(chartmp);
//MsgBox(Strtmp, mbInformation, MB_OK);
indchave := indchave + 1;
If indchave > Length(ChaveMin) Then begin
indchave := 1
End;

end;
Result := Strtmp
//MsgBox(Strtmp, mbInformation, MB_OK);
except
Result := ''''ERRO'''';
end;
end;


Function GetStringConexao(): String;
var
FileName: String;
strCnn: AnsiString;
begin
FileName := ExpandConstant(''''\GsSql.gs'''');
if FileExists(FileName) then begin
LoadStringFromFile(FileName, strCnn);
strCnn := DesCriptoSimples(strCnn,0);
//MsgBox(strCnn, mbInformation, MB_OK);
Result := strCnn;
end else begin
MsgBox(''''Não foi localizado o arquivo GSSQL.GS na diretório: '''' + ExpandConstant('''''''') + #13#13 ''''Este arquivo é necessário para este processo!'''', mbError, MB_OK);
end
end;

Function FecharConexao(): Boolean;
begin
try
Cnn.Close;
Result := True;
except
//Cnn.Close;
//MsgBox(GetExceptionMessage, mbError, MB_OK);
Result := False;
end;
end;

Function Next_Reg(Tabela: String; Coluna: String): Longint;
var
ErrorCode: Integer;
ADOCommand: Variant;
ADORecordset: Variant;
begin

//Result := 1;
try
ADOCommand := CreateOleObject(''''ADODB.Command'''');
ADOCommand.ActiveConnection := Cnn;
//ADOCommand.CommandText := ''''SELECT Max('''' + Tabela + ''''.'''' + Coluna + '''') as MaxReg FROM '''' + Tabela;
ADOCommand.CommandText := ''''SELECT ISNULL((SELECT MAX('''' + Coluna + '''') FROM '''' + Tabela + ''''), 0) + 1 AS MaxReg'''' ;

ADOCommand.CommandType := adCmdText;
ADORecordset := ADOCommand.Execute;

//msgbox(''''ADOCommand.CommandText = '''' + ADOCommand.CommandText,mbInformation, MB_OK);
//msgbox(''''ADORecordset.RecordCount = '''' + ADORecordset.RecordCount,mbInformation, MB_OK);
//If ADORecordset.RecordCount > 0 Then begin
If Not ADORecordset.EOF Then begin
// If Not VarIsNull(ADORecordset.Fields(0)) then begin
//Result := strToint(ADORecordset.Fields(0)) + 1;
Result := strToint(ADORecordset.Fields(0));
// End;
end else begin
Result := 1;
End;

except
MsgBox(GetExceptionMessage, mbError, MB_OK);
end;

end;

Function GravaAgendamento(Data: String; Hora: String): Boolean;
var
FileName: String;
Sql: String;
ADOCommand: Variant;
begin
try

ADOCommand := CreateOleObject(''''ADODB.Command'''');
ADOCommand.ActiveConnection := Cnn;

Sql := ''''Insert Into AS_AgendaAtualizacao (id, datagravacao, dataAgenda, horaAgenda)'''' + chr(13)
//If (Trim(Data) <> '''''''') AND (Trim(Hora) <> '''''''') Then Begin
Sql := Sql + ''''Values ('''' + IntToStr(Next_Reg(''''AS_AgendaAtualizacao'''', ''''id'''')) + '''', '''''''''''' + GetDateTimeString(''''ddddd'''', #0, #0) + '''''''''''','''''''''''' + Data + '''''''''''','''''''''''' + Hora + '''''''''''')'''' + chr(13)
//End Else Begin
// Sql := Sql + ''''Values ('''' + IntToStr(Next_Reg(''''AS_AgendaAtualizacao'''', ''''id'''')) + '''', '''''''''''' + GetDateTimeString(''''ddddd'''', #0, #0) + '''''''''''','''''''''''' + '''''''' + '''''''''''','''''''''''' + '''''''' + '''''''''''')'''' + chr(13)
//End;
//Sql := Sql + ''''Values ('''' + Next_Reg(''''AS_AgendaAtualizacao'''', ''''id'''') + '''', '''''''''''' + Data_Servidor(True) + '''''''''''','''''''''''' + Data + '''''''''''','''''''''''' + Hora + '''''''''''')'''' + chr(13)
//msgbox(Sql,mbInformation, MB_OK);

ADOCommand.CommandText := Sql;
ADOCommand.Execute(NULL, NULL, adCmdText or adExecuteNoRecords);

Result := True;

except
AtualizaStatus (''''Falha ao gravar o agendamento.'''', clRed)
MsgBox(GetExceptionMessage, mbError, MB_OK);
Result := False;
end;
end;

Function SetarConfig(Campo: String; Valor: String): Boolean;
var
ErrorCode: Integer;
ADOCommand: Variant;
Sql: String;
begin

Result := False;

try
ADOCommand := CreateOleObject(''''ADODB.Command'''');
ADOCommand.ActiveConnection := Cnn;

Sql := ''''UPDATE ConfiguracoesIniciais ''''
Sql := Sql + ''''SET ConfiguracoesIniciais.'''' + Campo + '''' = '''' + Valor
ADOCommand.CommandText := Sql;
ADOCommand.Execute(NULL, NULL, adCmdText or adExecuteNoRecords);

Result := True;

except
//MsgBox(GetExceptionMessage, mbError, MB_OK);
MsgBox(''''Não foi possível gravar o agendamento.'''', mbError, MB_OK);
end;

end;

Function RetornaConfig(Campo: String): String;
var
ErrorCode: Integer;
ADOCommand: Variant;
ADORecordset: Variant;
begin
Result := ''''''''

try
ADOCommand := CreateOleObject(''''ADODB.Command'''');
ADOCommand.ActiveConnection := Cnn;

ADOCommand.CommandText := ''''SELECT '''' + Campo + '''' FROM ConfiguracoesIniciais'''';
ADOCommand.CommandType := adCmdText;
ADORecordset := ADOCommand.Execute;

Result := ADORecordset.Fields(0);

except
MsgBox(GetExceptionMessage, mbError, MB_OK);
end;

end;


Function DateDiff(intervalo: String; Data1: String; Data2: String): String;
var
ErrorCode: Integer;
ADOCommand: Variant;
ADORecordset: Variant;
Sql: String;
begin
Result := ''''0''''

try
ADOCommand := CreateOleObject(''''ADODB.Command'''');
ADOCommand.ActiveConnection := Cnn;

Sql:= ''''set dateformat dmy'''' + chr(13)
Sql:= Sql + ''''select Convert(varchar, DATEDIFF('''' + intervalo + '''','''''''''''' + Data1 + '''''''''''','''''''''''' + Data2 + ''''''''''''))''''
ADOCommand.CommandText := Sql ; //''''select Convert(varchar, DATEDIFF('''' + intervalo + '''','''''''''''' + Data1 + '''''''''''','''''''''''' + Data2 + ''''''''''''))'''';
ADOCommand.CommandType := adCmdText;
ADORecordset := ADOCommand.Execute;

Result := ADORecordset.Fields(0);

except
MsgBox(GetExceptionMessage, mbError, MB_OK);
end;

end;

Function AbrirConexao(): Boolean;
var
BancoAux: string;
ServidorAux: string;
LoginAdm: string;
SenhaAdm: string;

begin
try

Cnn := CreateOleObject(''''ADODB.Connection'''');
Cnn.ConnectionString := GetStringConexao;
Cnn.Open;

If CodOperacao = 2 Then Begin
LoginAdm := DesCriptoSimples(RetornaConfig(''''LoginAdm''''),0);
SenhaAdm := DesCriptoSimples(RetornaConfig(''''SenhaAdm''''),0);
ServidorAux:= Cnn.Properties(''''Data Source Name'''');
BancoAux:= Cnn.DefaultDatabase;

Cnn.close;
Cnn.Mode := 12; //adModeShareExclusive;
Cnn.IsolationLevel := 1048576; //adXactIsolated;
Cnn.ConnectionString := ''''Provider=SQLOLEDB;'''' + // provider
''''Data Source='''' + ServidorAux + '''';'''' + // server name
''''Initial Catalog='''' + BancoAux + '''';'''' + // default database
''''User Id='''' + LoginAdm + '''';'''' + // user name
''''Password='''' + SenhaAdm + '''';''''; // password
//''''User Id=sa;'''' + // user name
//''''Password=gr0upsac0rp;'''' // password
//MsgBox(Cnn.ConnectionString, mbInformation, MB_OK);
Cnn.Open;
End;

Result := True;
except
//Cnn.Close;
MsgBox(GetExceptionMessage, mbError, MB_OK);
Result := False;
end;
end;


//Function AbrirConexao(): Boolean;
Function GetVersaoBD(param: String): String;
var
ErrorCode: Integer;
ADOCommand: Variant;
ADORecordset: Variant;
begin
try

Cnn := CreateOleObject(''''ADODB.Connection'''');
Cnn.ConnectionString := ''''Provider=Microsoft.Jet.OLEDB.4.0;'''' +
''''Mode=Share Deny None;'''' +
''''Data Source=C:\VB6\MANAGER\Upgrade\UpgGM.mdb'''' //+
///''''Jet OLEDB:Database Password='''';
Cnn.Open;

Result := ''''''''
try
ADOCommand := CreateOleObject(''''ADODB.Command'''');
ADOCommand.ActiveConnection := Cnn;

ADOCommand.CommandText := ''''SELECT Max(versao) FROM Upg'''';
ADOCommand.CommandType := adCmdText;
ADORecordset := ADOCommand.Execute;

Result := ADORecordset.Fields(0);
msgbox(Result,mbInformation, MB_OK);

except
MsgBox(GetExceptionMessage, mbError, MB_OK);
end;

Cnn.Close;

except
MsgBox(GetExceptionMessage, mbError, MB_OK);
end;
end;


Function Retorna_VersaoSQL(): Variant;
var
ErrorCode: Integer;
ADOCommand: Variant;
ADORecordset: Variant;
begin
Result := ''''''''

try
ADOCommand := CreateOleObject(''''ADODB.Command'''');
ADOCommand.ActiveConnection := Cnn;

ADOCommand.CommandText := ''''SELECT SERVERPROPERTY(''''''''ProductVersion'''''''') As Versao'''';
ADOCommand.CommandType := adCmdText;
ADORecordset := ADOCommand.Execute;
ADORecordset.MoveFirst

if Left(ADORecordset.Fields(''''Versao''''),2) = ''''8.'''' then begin
Result := ''''2000'''';
end if Left(ADORecordset.Fields(''''Versao''''),2) = ''''9.'''' then begin
Result := ''''2005'''';
end if Left(ADORecordset.Fields(''''Versao''''),2) = ''''10'''' then begin
Result := ''''2008'''';
end else begin
Result := ''''0'''';
end;
except
MsgBox(GetExceptionMessage, mbError, MB_OK);
end;

end;

procedure DecodeVersion (verstr: String; var verint: array of Integer);
var
i,p: Integer; s: string;
begin
// initialize array
verint := [0,0,0,0];
i := 0;
while ((Length(verstr) > 0) and (i < 4)) do
begin
p := pos (''''.'''', verstr);
if p > 0 then
begin
if p = 1 then s:= ''''0'''' else s:= Copy (verstr, 1, p - 1);
verint[i] := StrToInt(s);
i := i + 1;
verstr := Copy (verstr, p+1, Length(verstr));
end
else
begin
verint[i] := StrToInt (verstr);
verstr := '''''''';
end;
end;

end;

//PEGA A VERSÃO DO EXECUTÁVEL
function GetVersaoExe(PathExe: String): String;
//var
// sVersion: String;
begin
// sVersion := '''''''';
GetVersionNumbersString(PathExe , Result);
//msgbox(Result,mbInformation, MB_OK);
// Result := sVersion;
end;

// This function compares version strings
// return -1 if ver1 < ver2
// return 0 if ver1 = ver2
// return 1 if ver1 > ver2
function ComparaVersao (ver1, ver2: String): Integer;
var
verint1, verint2: array of Integer;
i: integer;
begin

SetArrayLength (verint1, 4);
DecodeVersion (ver1, verint1);

SetArrayLength (verint2, 4);
DecodeVersion (ver2, verint2);

Result := 0; i := 0;
while ((Result = 0) and ( i < 4 )) do
begin
if verint1[i] > verint2[i] then
Result := 1
else
if verint1[i] < verint2[i] then
Result := -1
else
Result := 0;
i := i + 1;
end;

end;

Function IsExeDetected(ExeMinVerNeeded: String): boolean;
var
ExeVer: String;
vercomp: Integer;
begin
RegQueryStringValue(HKLM, ''''Software\Microsoft\DataAccess'''', ''''FullInstallVer'''', ExeVer);

//Was there any data returned?
if Length( ExeVer ) > 0 then
begin
//Compare versions
vercomp := ComparaVersao(ExeVer, ExeMinVerNeeded);

//Version smaller
if vercomp < 0 then
begin
Result := false;
end;

//Same version
if vercomp = 0 then
begin
Result := true;
end;

//Version bigger
if vercomp > 0 then
begin
Result := true;
end;
end
else
begin
Result := false;
end;
end;



Function ValidaBackup(): Boolean;
var
Msg: String;
DataAux: String;
DataAtual: String;
NumDias: Integer;
Begin
Try

Result := True;

DataAux := RetornaConfig(''''DataBackup'''');
//If IsDate(DataAux) Then Begin
//DataAux = Format(DataAux, "dd/mm/yyyy")
If (DataAux <> '''''''') Then begin

DataAtual := GetDateTimeString(''''dd/mm/yyyy'''', #0, #0);
NumDias := strToInt(DateDiff(''''D'''', DataAux, DataAtual));

If (NumDias = 0) Then Begin
Msg := ''''ATENÇÃO!'''' + chr(13)
Msg := Msg + ''''O backup foi gerado hoje.'''' + chr(13)
Msg := Msg + ''''Este processo pode acarretar em perda de dados!'''' + chr(13)
Msg := Msg + ''''Deseja realmente restaurar todos os arquivos e o banco de dados?''''

If MsgBox(Msg, mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = IDNo Then begin
//ExitProcess(0);
Result := False;
End

End Else If (NumDias <= 3) Then begin

Msg := ''''ATENÇÃO!'''' + chr(13)
Msg := Msg + ''''O backup foi gerado pela última vez há '''' + intTostr(NumDias) + '''' dia(s).'''' + chr(13)
Msg := Msg + ''''Este processo pode acarretar em perda de dados!'''' + chr(13)
Msg := Msg + ''''Deseja realmente restaurar todos os arquivos e o banco de dados?''''

If MsgBox(Msg, mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = IDNo Then Begin
//ExitProcess(0);
Result := False;
End

End Else If (NumDias > 3) Then begin

Msg := ''''O backup foi gerado pela última vez há '''' + intTostr(NumDias) + '''' dia(s).'''' + chr(13)
//''''Msg = Msg + ''''É recomendado que seja realizado um backup agora.'''' + chr(13) '''', INCONSICON, INCONS
Msg := Msg + ''''Faça um backup antes de realizar o processo de restauração ou entre em contato com o suporte da Group Software para auxilío neste processo.''''
MsgBox(Msg, mbError, MB_OK)

//ExitProcess(0);
//Result := False;

End;
End;
//End;

except
MsgBox(GetExceptionMessage, mbError, MB_OK);
end;

End;


Function GeraBackupBD(NomeBackup: String): Boolean;
var
FileName: string;
ADOCommand: Variant;
begin
try
AtualizaStatus (''''Aguarde... Gerando backup do banco.'''', clBlue)

ADOCommand := CreateOleObject(''''ADODB.Command'''');
ADOCommand.ActiveConnection := Cnn;

if trim(NomeBackup) = '''''''' then begin
FileName := ExpandConstant(''''\'''' + GetDateTimeString(''''ddmmyyyy'''', #0, #0) + ''''.bkp'''');
end else begin
FileName := ExpandConstant(''''\'''' + Nomebackup + ''''.bkp'''');
end;
//msgbox(FileName,mbInformation, MB_OK);

ADOCommand.CommandText := ''''BACKUP DATABASE ['''' + Cnn.DefaultDatabase + ''''] TO Disk = '''''''''''' + FileName + '''''''''''''''';
//msgbox(ADOCommand.CommandText,mbInformation, MB_OK);
ADOCommand.Execute(NULL, NULL, adCmdText or adExecuteNoRecords);

if FileExists(FileName) then begin
AtualizaStatus (''''Backup gerado com sucesso.'''', clGreen)
//msgbox(''''Backup gerado com sucesso.'''',mbInformation, MB_OK);
Result := True;
end else begin
AtualizaStatus (''''Falha ao gerar o backup.'''', clRed)
Result := False;
end;
except
AtualizaStatus (''''Falha ao gerar o backup.'''', clRed)
//msgbox(''''Falha ao gerar o backup.'''',mbInformation, MB_OK);
MsgBox(GetExceptionMessage, mbError, MB_OK);
Result := False;
end;
end;


Function RestauraBackupBD(NomeBanco: string; PathArquivo: string; LoginAdm: string; SenhaAdm: string ): Boolean;
var
FileName: String;
ADOCommand: Variant;
SQL1: AnsiString;
SQL2: AnsiString;
strCnn: String;

RegsAfetados: Integer;
begin
Result := False;
try

ADOCommand := CreateOleObject(''''ADODB.Command'''');
ADOCommand.ActiveConnection := Cnn;

//************************ REALIZA BACKUP DE SEGURANÇA *****************************
GeraBackupBD(''''BackupSeguranca'''')
//************************ REALIZA BACKUP DE SEGURANÇA *****************************


//************************ CRIA O USUÁRIO COM PERMISSÃO *************************************
//1) Criação do login com a permissão necessaria.
//SQL1 := SQL1 + ''''USE [master]'''' + Chr(13)
//SQL1 := SQL1 + ''''CREATE LOGIN [group_login] WITH PASSWORD=N''''''''group_login'''''''',CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF'''' + Chr(13)
//SQL1 := SQL1 + ''''ALTER SERVER ROLE [dbcreator] ADD MEMBER [group_login]'''' + Chr(13)
//MsgBox(SQL1,mbInformation, MB_OK);
//ADOCommand.CommandText := SQL1;
//ADOCommand.Execute(RegsAfetados, NULL, adCmdText or adExecuteNoRecords);
//AtualizaStatus (''''Usuário criado com sucesso.'''', clGreen)
//sleep(300);
//************************ CRIA O USUÁRIO COM PERMISSÃO *************************************



// *********************** ADD O USUÁRIO NO BANCO ******************************************
//Concede as permissões necessarias na base a ser restaurada
//SQL1 := ''''USE ['''' + NomeBanco + '''']'''' + Chr(13)
//SQL1 := SQL1 + ''''CREATE USER [group_login] FOR LOGIN [group_login]'''' + Chr(13)
//SQL1 := SQL1 + ''''USE ['''' + NomeBanco + '''']'''' + Chr(13)
//SQL1 := SQL1 + ''''ALTER ROLE [db_owner] ADD MEMBER [group_login]''''
//MsgBox(SQL1,mbInformation, MB_OK);
//ADOCommand.CommandText := SQL1;
//ADOCommand.Execute(RegsAfetados, NULL, adCmdText or adExecuteNoRecords);
//AtualizaStatus (''''Adiciona usuário no banco.'''', clGreen)
//sleep(300);
// *********************** ADD O USUÁRIO NO BANCO ******************************************


// *********************** Concedendo privilégios ************************************
//AtualizaStatus (''''Aguarde... Verificando privéligios.'''', clBlue)
//SQL1 := ''''USE ['''' + NomeBanco + '''']'''' + Chr(13)
//SQL1 := ''''USE [master]'''' + Chr(13)
//SQL1 := SQL1 + ''''EXEC sp_addsrvrolemember @loginame = N''''''''group_login'''''''', @rolename = N''''''''sysadmin'''''''''''' + Chr(13)
//SQL1 := SQL1 + ''''EXEC sp_addrolemember N''''''''db_owner'''''''', N''''''''group_login''''''''''''
//MsgBox(SQL1,mbInformation, MB_OK);
//ADOCommand.CommandText := SQL1;
//ADOCommand.Execute(RegsAfetados, NULL, adCmdText or adExecuteNoRecords);
//AtualizaStatus (''''Privéligios OK.'''', clGreen)
//sleep(300);
// *********************** Concedendo privilégios ************************************


//===================================== RESTAURA O BANCO ========================================================
AtualizaStatus (''''Aguarde... restaurando banco.'''', clBlue)
SQL1 := ''''USE [master]'''' + Chr(13)
//SQL1 := SQL1 + ''''RESTORE FILELISTONLY FROM DISK = '''' + PathArquivo + '''''''' + Chr(13)
//SQL1 := SQL1 + ''''ALTER DATABASE '''' + NomeBanco + '''' SET SINGLE_USER WITH ROLLBACK IMMEDIATE'''' + Chr(13)
SQL1 := SQL1 + ''''ALTER DATABASE '''' + NomeBanco + '''' SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE'''' + Chr(13)
SQL1 := SQL1 + ''''RESTORE DATABASE '''' + NomeBanco + '''' FROM DISK = '''''''''''' + PathArquivo + '''''''''''' WITH REPLACE'''' + Chr(13)
SQL1 := SQL1 + ''''ALTER DATABASE '''' + NomeBanco + '''' SET MULTI_USER '''' + Chr(13)
//MsgBox(SQL1,mbInformation, MB_OK);

ADOCommand.CommandText := SQL1;
ADOCommand.Execute(RegsAfetados, NULL, adCmdText or adExecuteNoRecords);
AtualizaStatus (''''Backup restaurado com sucesso.'''', clGreen)
sleep(300);
//===================================== RESTAURA O BANCO ========================================================


//================================= CRIA USUÁRIO DO BANCO =========================================================
AtualizaStatus (''''Aguarde... Criando usuário do banco.'''', clBlue)

If Retorna_VersaoSQL = ''''2000'''' Then begin
SQL2 := ''''USE ['''' + NomeBanco + '''']'''' + Chr(13)
SQL2 := SQL2 + ''''IF NOT EXISTS (SELECT * FROM dbo.sysusers WHERE name = N''''''''group_login'''''''') EXEC dbo.sp_grantdbaccess @loginame = N''''''''group_login'''''''', @name_in_db = N''''''''group_login'''''''''''' + Chr(13)
SQL2 := SQL2 + ''''IF EXISTS (SELECT * FROM dbo.sysusers WHERE name = N''''''''group_login'''''''') EXEC dbo.sp_revokedbaccess N''''''''group_login'''''''''''' + Chr(13)
SQL2 := SQL2 + ''''IF EXISTS (SELECT * FROM dbo.sysusers WHERE name = N''''''''group_login'''''''') EXEC SP_ADDROLEMEMBER ''''''''DB_OWNER'''''''', ''''''''group_login'''''''''''' + Chr(13)
SQL2 := SQL2 + ''''EXEC sp_defaultlanguage ''''''''group_login'''''''', ''''''''brazilian'''''''''''' + Chr(13)
End Else begin
SQL2 := ''''USE ['''' + NomeBanco + '''']'''' + Chr(13)
SQL2 := SQL2 + ''''IF EXISTS (SELECT * FROM sys.schemas WHERE name = N''''''''group_login'''''''') DROP SCHEMA [group_login]'''' + Chr(13)
SQL2 := SQL2 + ''''IF EXISTS (SELECT * FROM sys.database_principals WHERE name = N''''''''group_login'''''''') DROP USER [group_login]'''' + Chr(13)
SQL2 := SQL2 + ''''CREATE USER [group_login] FOR LOGIN [group_login] WITH DEFAULT_SCHEMA=[dbo]'''' + Chr(13)
SQL2 := SQL2 + ''''EXEC SP_ADDROLEMEMBER ''''''''DB_OWNER'''''''', ''''''''group_login'''''''''''' + Chr(13)
SQL2 := SQL2 + ''''ALTER LOGIN [group_login] WITH DEFAULT_LANGUAGE = Brazilian'''' + Chr(13)
End
ADOCommand.CommandText := SQL2;
ADOCommand.Execute(RegsAfetados, NULL, adCmdText or adExecuteNoRecords);
//MsgBox(''''SQL2 = '''' + IntToStr(RegsAfetados),mbInformation, MB_OK);
//MsgBox(SQL2,mbInformation, MB_OK);
AtualizaStatus (''''Usuário criado com sucesso.'''', clGreen)
sleep(300);
//================================= CRIA USUÁRIO DO BANCO =========================================================

//AtualizaStatus (''''Backup restaurado com sucesso.'''', clGreen)

Result := True;
except
AtualizaStatus (''''Falha ao restaurar o backup.'''', clRed)
//msgbox(''''Falha ao restaurar o backup.'''',mbInformation, MB_OK);
MsgBox(''''Vá em Arquivo / Ferramentas de Administração / aba Usuário e clique no botão Permissão de Backup e certifique que o usuário que esta configurado no manager tenha permissões de adiministrador no banco!'''' + #13#13
''''Descrição: '''' + AddPeriod(GetExceptionMessage),mbError, MB_OK);
//MsgBox(GetExceptionMessage, mbError, MB_OK);
Result := False;
end;
end;

procedure ConnectButtonClick(Sender: TObject);
begin

AtualizaStatus (''''Aguarde... Testando conexão'''', clBlue);
If AbrirConexao then begin
msgbox(''''Conexão estabelecida com sucesso.'''',mbInformation, MB_OK);
AtualizaStatus (''''Conectou com sucesso.'''', clGreen)

WizardForm.NextButton.Enabled := True

End else begin
AtualizaStatus (''''Falha na conexão.'''', clRed);
//msgbox(''''Falha na conexão com o banco de dados.'''',mbError, MB_OK);

WizardForm.NextButton.Enabled := False;

End;

End;

procedure InitializeWizard;
begin
{ Create the pages }

//TELA: (BACKUP E RESTORE)
UsagePage := CreateInputOptionPage(wpWelcome,''''Configurações'''', ''''Selecione a opção que deseja executar.'''',
''''Por favor, especifique qual operação você deseja executar, em seguida clique em Avançar.'''',True, False);
UsagePage.Add(''''Atualizar o sistema realizando um backup de seus arquivos e do banco dados'''');
UsagePage.Add(''''Voltar a versão anterior. (ATENÇÃO! Esta operação irá desconectar TODOS usuários)'''');
//UsagePage.Add(''''Restore Sistema - Não atualiza o sistema, apenas volta versão anterior do sistema'''');

//UsagePage.SelectedValueIndex.OnClick := @OptionOnClick;
//case GetPreviousData(''''UsageMode'''', '''''''') of
// ''''Backup'''': UsagePage.SelectedValueIndex := 0;
// ''''Restore'''': UsagePage.SelectedValueIndex := 1;
//else
UsagePage.SelectedValueIndex := 0;
//end;

////SELECIONAR O DIRETÓRIO
//DataDirPage := CreateInputDirPage(wpSelectDir,
// ''''Selecione Diretório'''', ''''Onde é que os arquivos de dados pessoais deve ser instalado?'''',
// ''''Selecione a pasta na qual a Instalação deve instalar arquivos de dados pessoais, em seguida, clique em Avançar.'''', False, '''''''');
//DataDirPage.Add(''''Arquivo'''');
//DataDirPage.Values[0] := GetPreviousData(''''Arquivo'''', '''''''');


Page := CreateCustomPage(wpSelectDir, ''''Configurações'''', ''''Agende o início do processo'''');

//CABEÇALHO
CabecalhoStaticText := TNewStaticText.Create(Page);
CabecalhoStaticText.Top := ScaleX(0);
CabecalhoStaticText.Height := ScaleY(0);
CabecalhoStaticText.Caption := ''''ATENÇÃO!'''' #13#13''''Certifique que você possui permissões de administrador para o diretório selecionado!''''#13#13 ''''Esta operação só pode ser realizada se não houver nenhum usuário conectado!'''' #13#13 ''''Para continuar, especifique a data e hora que você deseje iniciar o processo, '''' #13#13 ''''em seguida clique em Avançar.'''';
CabecalhoStaticText.AutoSize := True;
CabecalhoStaticText.Parent := Page.Surface;


//LABEL DATA
DataStaticText := TNewStaticText.Create(Page);
DataStaticText.Top := CabecalhoStaticText.Top + CabecalhoStaticText.Height + 20 + ScaleY(0);
DataStaticText.Height := ScaleY(23);
DataStaticText.Caption := ''''Data'''';
//DataStaticText.AutoSize := True;
DataStaticText.Parent := Page.Surface;

//TEXT DATA
EditData := TNewEdit.Create(Page);
EditData.Left := DataStaticText.Width + ScaleY(8)
EditData.Top := DataStaticText.Top ; //EditData.top + Button.Height + ScaleY(8);
EditData.Width := Page.SurfaceWidth div 4 - ScaleX(8);
//EditData.Text := ''''__/__/____'''';
//EditData.Text := FormatDateTime(''''dd-mm-yyyy'''', EditData.Text)
EditData.Text := GetDateTimeString(''''ddddd'''', #0, #0);
EditData.Parent := Page.Surface;


// FORMATO (DD/MM/YYYY)
FormatoHStaticText := TNewStaticText.Create(Page);
FormatoHStaticText.Left := EditData.Left + EditData.Width + ScaleY(8)
FormatoHStaticText.Top := EditData.Top;
FormatoHStaticText.Caption := ''''O formato deve ser => DD/MM/YYYY'''';
FormatoHStaticText.AutoSize := True;
FormatoHStaticText.Parent := Page.Surface;


//LABEL HORAS
HoraStaticText := TNewStaticText.Create(Page);
HoraStaticText.Top := EditData.Top + EditData.Height + ScaleY(8);
HoraStaticText.Caption := ''''Hora'''';
HoraStaticText.AutoSize := True;
HoraStaticText.Parent := Page.Surface;

//TEXT HORA
EditHora := TNewEdit.Create(Page);
EditHora.Left := EditData.Left; //HoraStaticText.Width + ScaleY(8);
EditHora.Top := HoraStaticText.Top; //HoraStaticText.top + HoraStaticText.Height + ScaleY(8);
EditHora.Width := Page.SurfaceWidth div 4 - ScaleX(8);
//EditHora.Text := ''''__:__'''';
//EditHora.Text := GetDateTimeString(''''hh:nn'''', #0, #0);
//EditHora.Text := GetDateTimeString(''''ddddd tt'''', #0, #0);

EditHora.Parent := Page.Surface;

// FORMATO (HH:MM)
FormatoMStaticText := TNewStaticText.Create(Page);
FormatoMStaticText.Left := EditData.Left + EditData.Width + ScaleY(8)
FormatoMStaticText.Top := EditHora.Top;
FormatoMStaticText.Caption := ''''O formato deve ser => HH:MM'''';
FormatoMStaticText.AutoSize := True;
FormatoMStaticText.Parent := Page.Surface;


//CancelButton := TNewButton.Create(Page);
//CancelButton.Parent := Page.Surface;
//CancelButton.Width := ScaleX(75);
//CancelButton.Height := ScaleY(23);
//CancelButton.Left := Page.ClientWidth - ScaleX(75 + 10);
//CancelButton.Top := Page.ClientHeight - ScaleY(23 + 10);
//CancelButton.Caption := ''''testetttttsgfsdhfuig'''';
//CancelButton.ModalResult := mrCancel;
//CancelButton.Cancel := True;


//ProgressBarLabel := TNewStaticText.Create(Page);
//ProgressBarLabel.Top := StaticText.Top + StaticText.Height + ScaleY(8);
//ProgressBarLabel.Caption := ''''TNewProgressBar'''';
//ProgressBarLabel.AutoSize := True;
//ProgressBarLabel.Parent := Page.Surface;

//ProgressBar := TNewProgressBar.Create(Page);
//ProgressBar.Left := ProgressBarLabel.Width + ScaleX(8);
//ProgressBar.Top := ProgressBarLabel.Top;
//ProgressBar.Width := Page.SurfaceWidth - ProgressBar.Left;
//ProgressBar.Height := ProgressBarLabel.Height + ScaleY(8);
//ProgressBar.Parent := Page.Surface;
///ProgressBar.Position := 25;

//ProgressBar3 := TNewProgressBar.Create(Page);
//ProgressBar3.Left := ProgressBarLabel.Width + ScaleX(8);
//ProgressBar3.Top := ProgressBar2.Top + ProgressBar2.Height + ScaleY(4);
//ProgressBar3.Width := Page.SurfaceWidth - ProgressBar.Left;
//ProgressBar3.Height := ProgressBarLabel.Height + ScaleY(8);
//ProgressBar3.Parent := Page.Surface;
//{ Note: TNewProgressBar.Style property only has an effect on Windows XP and newer }
//ProgressBar3.Style := npbstMarquee;



//BOTÃO P/ TESTE DE CONEXÃO
ConnectButton := TButton.Create(WizardForm);
ConnectButton.Parent := WizardForm;
ConnectButton.Left := 2;
ConnectButton.Width := 65;
ConnectButton.Height := 23;
ConnectButton.Top := WizardForm.ClientHeight -
ConnectButton.ClientHeight - 8;
ConnectButton.Caption := ''''Conectar'''';
ConnectButton.OnClick := @ConnectButtonClick;
ConnectButton.Enabled := false;

StatusLabel := TLabel.Create(WizardForm);
StatusLabel.Parent := WizardForm;
StatusLabel.Left := ConnectButton.Left + ConnectButton.Width + 8;
StatusLabel.Top := ConnectButton.Top + 6;
StatusLabel.Font.Style := [fsBold];
StatusLabel.Font.Color := clBlue;

End;

Function GetOperacao(): Boolean;
var
ErrorCode,VerComp: Integer;
begin
//MsgBox(''''CodOperacao = '''' + IntToStr(CodOperacao), mbError, MB_OK);
//Result := ((CodOperacao <> 3) or (CodOperacao <> 2));
Result := (CodOperacao = 1);
end;

Function VerificaPermissao(): Boolean;
begin
IF not CreateDir(ExpandConstant('''''''')+''''\Permissao\'''') then BEGIN
Result := False;
End else begin
Result := True;
DelTree(ExpandConstant('''''''')+''''\Permissao'''', true, True, True);
END;
END;


Function NextButtonClick(CurPageID: Integer): Boolean;
var
SQL2Installed: Boolean;
Msg : String;
VerComp : Integer;
begin
//MsgBox(''''CurPageID = '''' + IntToStr(CurPageID) + '''' '''' + ''''wpSelectComponents = '''' + IntToStr(wpSelectComponents)+ '''' '''' + ''''wpReady = '''' + IntToStr(wpReady) , mbError, MB_OK);
if CurPageID = Page.ID then begin

//VERIFICA SE O USUÁRIO TEM PERMISSÃO DE ESCRITA NO DIRETÓRIO SELECIONADO
If Not VerificaPermissao then begin

MsgBox(''''Você não tem permissão no diretório: '''' + ExpandConstant('''''''') , mbError, mb_ok);
Result := False;
//WizardForm.Close;
ExitProcess(0);
//Abort;
//Exit;
End;

ConnectButton.Enabled := false;
Result := True;

End else if CurPageID = 6 then begin

Result := true;

If CodOperacao = 2 then begin
If Not DirExists(ExpandConstant(''''\BackupAtualizador'''')) then begin
//Msg := ''''Para executar o processo de restauração é necessário que o sistema tenha sido atualizado com a versão igual ou superior a 15.29.00 para que seja criado o diretório ''''''''BackupAtualizador'''''''' com os arquivos de backup.''''
Msg := ''''Diretório '''''''''''' + ExpandConstant(''''\BackupAtualizador'''') + '''''''''''' não encontrado.'''' #13#13 ''''''''
msgbox(Msg, mbError, mb_ok);
WizardForm.NextButton.Enabled := False;
Result := False;
Exit;
End
End;

EditData.Text := GetDateTimeString(''''ddddd'''', #0, #0);
EditHora.Text := GetDateTimeString(''''hh:nn'''', #0, #0);

//SQL2Installed := RegKeyExists(HKLM,''''SOFTWARE\Microsoft\Microsoft SQL2 Server'''');
//if not SQL2Installed then begin
// MsgBox(''''A instalação do banco de dados do Group Manager necessita que o Microsoft SQL2 Server esteja instalado. '''' #13#13 '''' Por favor, entre em contato com o suporte da Group para realizar a instalação do Microsoft SQL2 Server através do telefone (31)2103-5700!'''',mbInformation, MB_OK)
// Result:=false;
// Exit;
//end;


//BDVersion = GetVersaoBD

//Result := True;
End else if CurPageID = 100 then begin

//WizardForm.NextButton.Enabled := True;
Result := True;
Case UsagePage.SelectedValueIndex of
0: CodOperacao := 1 //BACKUP (banco + sistema)
1: CodOperacao := 2 //RESTORE BANCO + RESTORE SISTEMA
End;
if CodOperacao = 2 then begin
if trim(AbrirArquivo) = '''''''' then begin
MsgBox(''''Você deve selecionar o backup p/ restaurá-lo.'''',mbError, MB_OK)
Result := false;
//WizardForm.NextButton.Enabled := false;
end
end

//Result := true;

End else if CurPageID = wpSelectComponents then begin

Begin
//#IF VersaoCorp
//if IsComponentSelected(''''bancodados'''') then Begin
SQL2Installed := RegKeyExists(HKLM,''''SOFTWARE\Microsoft\Microsoft SQL2 Server'''');
if SQL2Installed then
begin
Result := true;
end else
begin
MsgBox(''''A instalação do banco de dados do Group Manager necessita que o Microsoft SQL2 Server esteja instalado. '''' #13#13 '''' Por favor, entre em contato com o suporte da Group para realizar a instalação do Microsoft SQL2 Server através do telefone (31)2103-5700!'''',mbInformation, MB_OK)
Result:=false;
end;
//end else begin
// Result := true;
//end;
// #ELSE
// Result := true;
// #ENDIF
end;

End else if CurPageID = wpReady then begin

Begin
if IsComponentSelected(''''manager'''') then
begin
RegWriteStringValue(HKLM, ''''Software\Group Software\manager'''',''''Tipo'''',''''0''''); // servidor
end
else begin
RegWriteStringValue(HKLM, ''''Software\Group Software\manager'''',''''Tipo'''',''''1''''); //estacao
end;
Result := true;
end;

end else begin
Result := true;
end;

// end else begin
// //MsgBox(''''CurPageID = '''' + IntToStr(CurPageID) + #13#13 ''''Page.ID = '''' + IntToStr(Page.ID) , mbError, MB_OK);
// Result := True;
// end;

End;



////////////////////////////////////////////////////////////////////////
// Rotina para realizar backup dos arquivos antes da atualização... //
////////////////////////////////////////////////////////////////////////
procedure CurPageChanged(curPageID:Integer);
Var
ResultCode: integer;
VerComp: integer;
CopiaRpt: string;
cmdExclusivo: string;
SQL2Cmd: string;
Filename: String;
LoginAdm, SenhaAdm: string;
TimeShow: variant;
DataBackup: String;
BEGIN

if CurPageID = wpInstalling then begin

//GRAVA O QND OCORRE UMA ATUALIZAÇÃO.
GravaAgendamento(EditData.Text, EditHora.Text);


//AGUARDA ATÉ A HORA AGENDADA
while (RetornaMinutos(EditHora.Text) > RetornaMinutos('''''''')) do
begin
TimeShow := (RetornaMinutos(EditHora.Text) - RetornaMinutos(''''''''));
AtualizaStatus(TimeShow + '''' min para iniciar o processo.'''', clBlue);
//SendMessage(Wnd, WM_CLOSE, 0, 0);
//sleep(1000);
end;

if GetOperacao then begin

AtualizaStatus (''''Aguarde... Excluindo arquivos.'''', clBlue)

// Deleta o diretório Backup e seus arquivos
DelTree(ExpandConstant('''''''')+''''\BackupAtualizador'''', true, True, True);

AtualizaStatus (''''Aguarde... Criando diretório.'''', clBlue)
//Cria novamente o diretório
If not CreateDir(ExpandConstant('''''''')+''''\BackupAtualizador\'''') then BEGIN
msgbox(''''Nao foi possivel Criar o diretório de backup do atualizador.'''' + + ''''\BackupAtualizador ---> '''' + ''''\BackupAtualizador'''' ,mbError, mb_ok);
Exit;
End

If Not GeraBackupBD('''''''') then begin
Exit;
End;

AtualizaStatus (''''Aguarde... Realizando backup do sistema.'''', clBlue)

If not EXEC(ExpandConstant(''''''''),ExpandConstant(''''/c copy "" "\BackupAtualizador"''''),ExpandConstant(''''''''), 0, ewWaitUntilTerminated,ResultCode) then BEGIN
msgbox(''''Nao foi possivel fazer backup dos arquivos de sistema.'''',mbError, mb_ok);
Exit;
End

ConnectButton.Enabled := false;


//GRAVA VAZIO QND TERMINA A ATUALIZAÇÃO.
//****************************************************************************************
//OBS.: É IMPRENCINDIVEL QUE SEJA GRAVADO VAZIO '''''''' NO BANCO PARA QUE O MANAGER ENTENDA QUE NÃO HOUVE FALHAS NA ATAULIZAÇÃO.
GravaAgendamento('''''''','''''''');
//****************************************************************************************

DataBackup := '''''''''''''''' + GetDateTimeString(''''ddddd'''', #0, #0) + '''''''''''''''';
SetarConfig(''''DataBackup'''', DataBackup);

AtualizaStatus (''''Aguarde... Atualizando o sistema.'''', clBlue)

End Else Begin //RESTORE

//VerComp := ComparaVersao(GetVersaoExe(ExpandConstant(''''\BackupAtualizador''''), ''''15.29.00'''');
VerComp := ComparaVersao(GetVersaoExe(ExpandConstant(''''\BackupAtualizador\GManager.exe'''')), GetVersaoExe(ExpandConstant(''''\GManager.exe'''')));
//MsgBox(''''VerComp ='''' + VerComp,mbInformation, MB_OK);

// return -1 if ver1 < ver2
// return 0 if ver1 = ver2
// return 1 if ver1 > ver2
If VerComp = 0 Then Begin
If MsgBox(''''Versão atual é igual a versão que esta sendo instalada!'''' + #13#13
''''Deseja continuar?'''',mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = IDNo then Begin
Exit;
//Abort;
End;

End Else If VerComp = 1 Then Begin
MsgBox(''''Não é possível realizar a restauração de uma versão maior que a utilizada!'''',mbInformation, MB_OK);
Exit;
//Abort;
End;

//INICIO DO PROCESSO DE RESTORE (RESTAURAÇÃO)
LoginAdm := DesCriptoSimples(RetornaConfig(''''LoginAdm''''),0);
SenhaAdm := DesCriptoSimples(RetornaConfig(''''SenhaAdm''''),0);

If TRIM(lowercase(LoginAdm)) <> ''''sa'''' Then Begin
MsgBox(''''É necessário cadastrar o usuário "sa" do SqlServer no manager para realizar o processo de restore.'''' + #13#13
''''Vá em menu Arquivo / Ferramentas de Administração / aba Usuário, clique no botão "Permissão de Backup" e cadastre o usuário "sa" e senha do SqlServer.'''',mbError, mb_ok);

Abort;
//ExitProcess(0);
End;

If Not ValidaBackup then begin
//Abort;
ExitProcess(0);
End;

//msgbox(''''LoginAdm = '''' + LoginAdm + #13#13 ''''SenhaAdm = '''' + SenhaAdm ,mbInformation, MB_OK);

//LoginAdm := ''''sa'''';
//SenhaAdm := ''''gr0upsac0rp'''';

If Not RestauraBackupBD(Cnn.DefaultDatabase, gCaminho, LoginAdm, SenhaAdm) then begin
//Result := False;
ExitProcess(0);
End;

//RESTAURA OS ARQUIVOS DO SISTEMA MANAGER (.rpt, .doc e etc)
AtualizaStatus (''''Restaurando arquivos do sistema...'''', clBlue)
If not EXEC(ExpandConstant(''''''''),ExpandConstant(''''/c copy "\BackupAtualizador" ""''''),ExpandConstant(''''\BackupAtualizador''''), 0, ewWaitUntilTerminated,ResultCode) then BEGIN
msgbox(''''Nao foi possivel fazer backup dos arquivos de sistema.'''',mbError, mb_ok);
ExitProcess(0);
End


AtualizaStatus (''''Sistema restaurado com sucesso!'''', clGreen)
msgbox(''''Sistema restaurado com sucesso!'''',mbInformation, mb_ok);
//Result := True;

End
End Else If CurPageID = Page.ID Then begin
AtualizaStatus ('''''''', clBlue)
WizardForm.NextButton.Enabled := False;
ConnectButton.Enabled := True;

End Else If CurPageID = wpFinished Then Begin

AtualizaStatus (''''Atualização concluída com suscesso.'''', clGreen)

End;
End;


procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
//Cancel := true;
//Confirm := false;
//GRAVA VAZIO QND TERMINA A ATUALIZAÇÃO.
//****************************************************************************************
//OBS.: É IMPRENCINDIVEL QUE SEJA GRAVADO VAZIO '''''''' NO BANCO PARA QUE O MANAGER ENTENDA QUE NÃO HOUVE FALHAS NA ATAULIZAÇÃO.
//GravaAgendamento('''''''','''''''');
//****************************************************************************************

end;

procedure DeinitializeSetup();
begin
// Hide Window before unloading skin so user does not get
// a glimpse of an unskinned window before it is closed.
ShowWindow(StrToInt(ExpandConstant('''''''')), 0);
UnloadSkin();
end;
Marlon Rodrigues

Marlon Rodrigues

Curtidas 0
POSTAR