PDA

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 7]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 [109] 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

diman_21Ru
12-12-2014, 15:03
Как в установщике убрать Noscroll нету прокрутки мышкай.

saurn
12-12-2014, 16:39
Как в установщике убрать Noscroll нету прокрутки мышкай. »
Писал же уже: за это отвечает свойство контрола ScrollBars

ScrollBars := ssVertical;


Если же речь идет о отсутствии скрола при использовании скина, то решение уже давалось:
http://forum.oszone.net/post-2308009-2259.html

diman_21Ru
12-12-2014, 17:32
saurn, а куда это вставить

nikolaha86med
12-12-2014, 18:34
Народ подскажите как сделать прозрачными такие формы как TEdit например?

Dodakaedr
12-12-2014, 18:55
а куда это вставить »
Можно сюда...
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"

[Code]
var
NewMemo1: TNewMemo;

procedure RedesignWizardForm;
begin
NewMemo1 := TNewMemo.Create(WizardForm);
with NewMemo1 do
begin
Parent := WizardForm.WelcomePage;
Left := ScaleX(176);
Top := ScaleY(184);
Width := ScaleX(301);
Height := ScaleY(113);
Lines.Text := 'Описание программы:' + #13#10 +
'My Autoplay Professional - программа для создания ' + #13#10 +
'меню ' + #13#10 +
'автозапуска, презентаций и прочих проектов. Вам ' + #13#10 +
'не ' + #13#10 +
'нужен опыт работы с такими программами, все ' + #13#10 +
'предельно ясно и удобно, плюс есть Русская ' + #13#10 +
'поддержка, много готовых шаблонов. Стоит ' + #13#10 +
'выделить ' + #13#10 +
'удобный редактор, который позволит в короткие ' + #13#10 +
'сроки сделать профессиональное меню ' + #13#10 +
'автозапуска.';
ScrollBars := ssVertical; //возможны значения ssBoth, ssHorizontal, ssNone, ssVertical
end;
end;

procedure InitializeWizard();
begin
RedesignWizardForm;
end;

Народ подскажите как сделать прозрачными такие формы как TEdit например? »
Пример (http://rghost.ru/private/59612544/923cf2576d6881ae37163a65b3faf3ac). На страницах 31 (http://forum.oszone.net/showthread.php?t=278998&page=31&highlight=%FD%F2%EE+%EB%E8%F8%FC+%EF%F0%E8%EC%E5%F0+%EA%E0%EA+%E1%FB+%EF%F0%EE%E7%F0+%FD%E4%E8%F2%E0 ), 32 (http://forum.oszone.net/showthread.php?t=278998&page=32&highlight=%FD%F2%EE+%EB%E8%F8%FC+%EF%F0%E8%EC%E5%F0+%EA%E0%EA+%E1%FB+%EF%F0%EE%E7%F0+%FD%E4%E8%F2%E0 ) это уже обсуждалось

nikolaha86med
12-12-2014, 23:01
Dodakaedr, Не поможешь вставить нужное из этого примера в мой скрипт,а то у меня чет не получается!

saurn
13-12-2014, 16:43
а куда это вставить »
http://forum.oszone.net/post-2433239-1969.html

petrmissial@fb
14-12-2014, 02:10
Подскажите пожалуйста. Есть пример
// Ask the user a Yes/No question, defaulting to No
if MsgBox('Are you sure?', mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = IDYES then
begin
// user clicked Yes
end;

Как мне в этом примере подсветить кнопку YES? Просто хочу сделать обводку вокруг...

saurn
14-12-2014, 04:07
petrmissial@fb,
MB_DEFBUTTON2, где цифра указывает на номер кнопки. Кнопка номер 1 - YES, кнопка номер 2 - NO. Следовательно, чтобы сделать кнопку YES дефолтной, надо указать ее номер, тоесть 1. Или вобще убрать MB_DEFBUTTON, по умолчанию будет активна первая кнопка.
MsgBox( 'Are you sure?', mbConfirmation, MB_YESNO + MB_DEFBUTTON1 )
// MsgBox( 'Are you sure?', mbConfirmation, MB_YESNO )

icetanker
15-12-2014, 09:27
#define A = (Defined UNICODE) ? "W" : "A"
const
INTERNET_OPEN_TYPE_PRECONFIG = 0;
INTERNET_FLAG_NO_CACHE_WRITE = $4000000;
INTERNET_FLAG_PRAGMA_NOCACHE = $100;
INTERNET_FLAG_RELOAD = $80000000;
INTERNET_FLAG_NEED_FILE = $10;
INTERNET_FLAG_NO_AUTO_REDIRECT = $200000;
HTTP_QUERY_FLAG_NUMBER = $20000000;
HTTP_QUERY_LOCATION = 33;
HTTP_QUERY_CONTENT_LENGTH = 5;
HTTP_QUERY_STATUS_CODE = 19;
ERROR_INSUFFICIENT_BUFFER = 122;
HTTP_STATUS_OK = 200;
HTTP_STATUS_REDIRECT = 302;
GENERIC_READ = $80000000;
GENERIC_WRITE = $40000000;
CREATE_ALWAYS = 2;
HEAP_ZERO_MEMORY = $8;
IRF_SYNC = $4;

type
INTERNET_BUFFERS = record
dwStructSize: DWORD;
Next: Longint;
lpcszHeader: String;
dwHeadersLength: DWORD;
dwHeadersTotal: DWORD;
lpvBuffer: Longint;
dwBufferLength: DWORD;
dwBufferTotal: DWORD;
dwOffsetLow: DWORD;
dwOffsetHigh: DWORD;
end;

var
g_DownloadPage: TOutputProgressWizardPage;

function InternetOpen(lpszAgent: String; dwAccessType: DWORD; lpszProxyName, lpszProxyBypass: String; dwFlags: DWORD): Integer; external 'InternetOpen{#A}@wininet.dll stdcall';
function InternetOpenUrl(hInternet: Longint; lpszUrl, lpszHeaders: String; dwHeadersLength, dwFlags: DWORD; dwContext: DWORD_PTR): Integer; external 'InternetOpenUrl{#A}@wininet.dll stdcall';
function InternetReadFileEx(hFile: Longint; var lpBuffersOut: INTERNET_BUFFERS; dwFlags: DWORD; dwContext: DWORD_PTR): BOOL; external 'InternetReadFileEx{#A}@wininet.dll stdcall';
function InternetCloseHandle(hInternet: Longint): BOOL; external 'InternetCloseHandle@wininet.dll stdcall';
function HttpQueryInfo(hRequest: Longint; dwInfoLevel: DWORD; var lpvBuffer: Longint; var lpdwBufferLength, lpdwIndex: DWORD): BOOL; external 'HttpQueryInfo{#A}@wininet.dll stdcall';
function _HttpQueryInfo(hRequest: Longint; dwInfoLevel: DWORD; lpvBuffer: String; var lpdwBufferLength, lpdwIndex: DWORD): BOOL; external 'HttpQueryInfo{#A}@wininet.dll stdcall';
function StrFormatByteSize64(qdw: Currency; pszBuf: AnsiString; cchBuf: UINT): Longint; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function StrFromTimeInterval(pszOut: String; cchMax: UINT; dwTimeMS: DWORD; digits: Byte): Integer; external 'StrFromTimeInterval{#A}@shlwapi.dll stdcall';
function CreateFile(lpFileName: String; dwDesiredAccess, dwShareMode: DWORD; lpSecurityAttributes: Longint; dwCreationDisposition, dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle; external 'CreateFile{#A}@kernel32.dll stdcall';
function WriteFile(hFile: THandle; lpBuffer: Longint; nNumberOfBytesToWrite: DWORD; var lpNumberOfBytesWritten: DWORD; lpOverlapped: Longint): BOOL; external 'WriteFile@kernel32.dll stdcall';
function GetProcessHeap(): THandle; external 'GetProcessHeap@kernel32.dll stdcall';
function HeapAlloc(hHeap: THandle; dwFlags, dwBytes: DWORD): Longint; external 'HeapAlloc@kernel32.dll stdcall';
function HeapFree(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): BOOL; external 'HeapFree@kernel32.dll stdcall';
function HeapSize(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): DWORD; external 'HeapSize@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer; external 'MulDiv@kernel32.dll stdcall';

///////////////////////////////////////////////////
function TicksToTime(const dwTicks: DWORD): String;
begin
Result := StringOfChar(#0, StrFromTimeInterval(Result, 0, dwTicks, 8));
StrFromTimeInterval(Result, Length(Result)+1, dwTicks, 8);
end;

////////////////////////////////////////////////////////
function BytesToSize(const exBytes: Double): AnsiString;
begin
Result := StringOfChar(#0, 15);
if Abs(exBytes) > 9.223372036854775807E18 then exBytes := 0;
#ifdef UNICODE
Result := CastIntegerToAnsiString(StrFormatByteSize64(Abs(exBytes div 1E4), Result, Length(Result)));
#else
Result := CastIntegerToString(StrFormatByteSize64(Abs(exBytes div 1E4), Result, Length(Result)));
#endif
end;

////////////////////////////////////////////////////
function DownloadFile(const szURL: String): Boolean;
var
hConnect, hSession, hFile, hHeap: THandle;
szHeader, szFileName: String;
dwBufferLength, dwIndex, dwStartDownload, dwStart, dwElapsed, dwWritten: DWORD;
lpBuffer, lpStatus, lpSize: Longint;
ib: INTERNET_BUFFERS;
begin
try
hSession := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, '', '', 0);
if hSession = 0 then Exit;

// additional header
szHeader := 'Referer: http://example.org/'#13#10;

// try direct link
repeat
hConnect := InternetOpenUrl(hSession, szURL, szHeader, Length(szHeader), INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD or INTERNET_FLAG_NO_AUTO_REDIRECT, 0);
if hConnect = 0 then Exit;
dwBufferLength := SizeOf(lpBuffer);
dwIndex := 0;
lpStatus := 0;
if not HttpQueryInfo(hConnect, HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER, lpStatus, dwBufferLength, dwIndex) then Exit;
lpBuffer := 0;
HttpQueryInfo(hConnect, HTTP_QUERY_LOCATION, lpBuffer, dwBufferLength, dwIndex);
if DLLGetLastError = ERROR_INSUFFICIENT_BUFFER then
begin
szURL := StringOfChar(#0, dwBufferLength-1);
if not _HttpQueryInfo(hConnect, HTTP_QUERY_LOCATION, szURL, dwBufferLength, dwIndex) then Exit;
if lpStatus = HTTP_STATUS_REDIRECT then InternetCloseHandle(hConnect);
end;
until lpStatus = HTTP_STATUS_OK;

// get file size
dwBufferLength := 4;
dwIndex := 0;
if not HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER, lpSize, dwBufferLength, dwIndex) then Exit;

// save dialog
procedure DownloadFile(urlFilename, szDestDir: String);
if DirExists(szDestDir) then
try
fName := Format('%s\%s', [szDestDir, fName]);
hFile := CreateFile(szFileName, GENERIC_READ or GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); //create file
if hFile = 0 then Exit;
hHeap := GetProcessHeap();
lpBuffer := HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 4*1024); // buffer size must be >= 512Kb
ib.dwStructSize := SizeOf(ib);
ib.lpvBuffer := lpBuffer;
ib.dwBufferLength := HeapSize(hHeap, 0, lpBuffer);
0); //create file
if hFile = 0 then Exit;
hHeap := GetProcessHeap();
lpBuffer := HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 4*1024); // buffer size must be >= 512Kb
ib.dwStructSize := SizeOf(ib);
ib.lpvBuffer := lpBuffer;
ib.dwBufferLength := HeapSize(hHeap, 0, lpBuffer);
szFileName := ExtractFileName(szURL);
if GetSaveFileName('Сохранить как...', szFileName, '', Format('*%s', [ExtractFileExt(szFileName)]), ExtractFileExt(szFileName)) then
try
hFile := CreateFile(szFileName, GENERIC_READ or GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); //create file
if hFile = 0 then Exit;
hHeap := GetProcessHeap();
lpBuffer := HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 4*1024); // buffer size must be >= 512Kb
ib.dwStructSize := SizeOf(ib);
ib.lpvBuffer := lpBuffer;
ib.dwBufferLength := HeapSize(hHeap, 0, lpBuffer);

// show page
g_DownloadPage.Show;
g_DownloadPage.ProgressBar.Show;
g_DownloadPage.SetProgress(0, lpSize);

// try download
try
// initial labels
g_DownloadPage.Msg1Label.Caption := Format(
'Файл:'#9#9'%s'#13#10 +
'Загружено:'#9'%s из %s', [ExtractFileName(szFileName), BytesToSize(0), BytesToSize(lpSize)]
);
g_DownloadPage.Msg2Label.Caption := Format(
'Прогресс:'#9'%s'#13#10 +
'Скорость:'#9'%s/сек'#13#10 +
'Прошло:'#9'0 сек'#13#10 +
'Осталось:'#9'%d сек', [FormatFloat('0.#0 %', MulDiv(g_DownloadPage.ProgressBar.Position, 100, lpSize)), BytesToSize(0), MaxInt]
);

// download
dwStartDownload := GetTickCount;
while ib.dwBufferLength > 0 do
begin
dwStart := GetTickCount;
dwElapsed := 0;
while dwElapsed < 1000 do
begin
// read file
InternetReadFileEx(hConnect, ib, IRF_SYNC, 0);

// write file
WriteFile(hFile, ib.lpvBuffer, ib.dwBufferLength, dwWritten, 0);
ib.dwBufferTotal := ib.dwBufferTotal + dwWritten;

// update progressbar
g_DownloadPage.ProgressBar.Position := ib.dwBufferTotal;

// process messages
Application.ProcessMessages;
dwElapsed := GetTickCount - dwStart;
end;

// update labels
dwElapsed := GetTickCount-dwStartDownload;
g_DownloadPage.Msg1Label.Caption := Format(
'Файл:'#9#9'%s'#13#10 +
'Загружено:'#9'%s из %s', [ExtractFileName(szFileName), BytesToSize(ib.dwBufferTotal), BytesToSize(lpSize)]
);
g_DownloadPage.Msg2Label.Caption := Format(
'Прогресс:'#9'%d %%'#13#10 +
'Скорость:'#9'%s/сек'#13#10 +
'Прошло:'#9'%s'#13#10 +
'Осталось:'#9'%d сек', [MulDiv(ib.dwBufferTotal, 100, lpSize), BytesToSize(MulDiv(ib.dwBufferTotal, 1000, dwElapsed)), TicksToTime(dwElapsed), MulDiv(lpSize-ib.dwBufferTotal, dwElapsed, 1000)/(ib.dwBufferTotal + 1)]
);
end;
except
Result := False; // error
finally
end;
finally
CloseHandle(hFile);
HeapFree(hHeap, 0, lpBuffer);
Result := ib.dwBufferTotal = lpSize; // success
end;
except
Result := False; // error
finally
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
g_DownloadPage.Hide;
end;
end;

/////////////////////////////////////
procedure CreateDownloadProgressPage;
begin
g_DownloadPage := CreateOutputProgressPage('Загрузка файла', '');
with g_DownloadPage do
begin
Msg1Label.Height := Msg1Label.Height shl 1;
Msg2Label.Height := Msg2Label.Height shl 2;
Msg2Label.Top := ProgressBar.Top + ProgressBar.Height + ScaleY(5);
end;
end;

/////////////////////////////
procedure InitializeWizard();
begin
CreateDownloadProgressPage();
end;

//////////////////////////////////////////////////////
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
case CurPageID of
wpWelcome: DownloadFile('http://yandex.ru/1.gif');

end;
end;
подскажите,пытался сделать загрузку файла без сохранить как,сделать все как указано #442,но почему то не работает?что не так?где нужно указать саму директорию сохранения тоже не совсем понятно???

kotyarko@fb
15-12-2014, 11:23
где нужно указать саму директорию сохранения тоже не совсем понятно? »
Можно так.. (по этому примеру (http://forum.oszone.net/post-2267694-1626.html)):
[*Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
INTERNET_OPEN_TYPE_PRECONFIG = 0;
INTERNET_FLAG_NO_CACHE_WRITE = $4000000;
INTERNET_FLAG_PRAGMA_NOCACHE = $100;
INTERNET_FLAG_RELOAD = $80000000;
INTERNET_FLAG_NEED_FILE = $10;
INTERNET_FLAG_NO_AUTO_REDIRECT = $200000;
HTTP_QUERY_FLAG_NUMBER = $20000000;
HTTP_QUERY_LOCATION = 33;
HTTP_QUERY_CONTENT_LENGTH = 5;
HTTP_QUERY_STATUS_CODE = 19;
ERROR_INSUFFICIENT_BUFFER = 122;
HTTP_STATUS_OK = 200;
HTTP_STATUS_REDIRECT = 302;
GENERIC_READ = $80000000;
GENERIC_WRITE = $40000000;
CREATE_ALWAYS = 2;
HEAP_ZERO_MEMORY = $8;
IRF_SYNC = $4;

type
INTERNET_BUFFERS = record
dwStructSize: DWORD;
Next: Longint;
lpcszHeader: String;
dwHeadersLength: DWORD;
dwHeadersTotal: DWORD;
lpvBuffer: Longint;
dwBufferLength: DWORD;
dwBufferTotal: DWORD;
dwOffsetLow: DWORD;
dwOffsetHigh: DWORD;
end;

var
g_DownloadPage: TOutputProgressWizardPage;

function InternetOpen(lpszAgent: String; dwAccessType: DWORD; lpszProxyName, lpszProxyBypass: String; dwFlags: DWORD): Integer; external 'InternetOpen{#A}@wininet.dll stdcall';
function InternetOpenUrl(hInternet: Longint; lpszUrl, lpszHeaders: String; dwHeadersLength, dwFlags: DWORD; dwContext: DWORD_PTR): Integer; external 'InternetOpenUrl{#A}@wininet.dll stdcall';
function InternetReadFileEx(hFile: Longint; var lpBuffersOut: INTERNET_BUFFERS; dwFlags: DWORD; dwContext: DWORD_PTR): BOOL; external 'InternetReadFileEx{#A}@wininet.dll stdcall';
function InternetCloseHandle(hInternet: Longint): BOOL; external 'InternetCloseHandle@wininet.dll stdcall';
function HttpQueryInfo(hRequest: Longint; dwInfoLevel: DWORD; var lpvBuffer: Longint; var lpdwBufferLength, lpdwIndex: DWORD): BOOL; external 'HttpQueryInfo{#A}@wininet.dll stdcall';
function _HttpQueryInfo(hRequest: Longint; dwInfoLevel: DWORD; lpvBuffer: String; var lpdwBufferLength, lpdwIndex: DWORD): BOOL; external 'HttpQueryInfo{#A}@wininet.dll stdcall';
function StrFormatByteSize64(qdw: Currency; pszBuf: AnsiString; cchBuf: UINT): Longint; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function StrFromTimeInterval(pszOut: String; cchMax: UINT; dwTimeMS: DWORD; digits: Byte): Integer; external 'StrFromTimeInterval{#A}@shlwapi.dll stdcall';
function CreateFile(lpFileName: String; dwDesiredAccess, dwShareMode: DWORD; lpSecurityAttributes: Longint; dwCreationDisposition, dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle; external 'CreateFile{#A}@kernel32.dll stdcall';
function WriteFile(hFile: THandle; lpBuffer: Longint; nNumberOfBytesToWrite: DWORD; var lpNumberOfBytesWritten: DWORD; lpOverlapped: Longint): BOOL; external 'WriteFile@kernel32.dll stdcall';
function GetProcessHeap(): THandle; external 'GetProcessHeap@kernel32.dll stdcall';
function HeapAlloc(hHeap: THandle; dwFlags, dwBytes: DWORD): Longint; external 'HeapAlloc@kernel32.dll stdcall';
function HeapFree(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): BOOL; external 'HeapFree@kernel32.dll stdcall';
function HeapSize(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): DWORD; external 'HeapSize@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer; external 'MulDiv@kernel32.dll stdcall';

///////////////////////////////////////////////////
function TicksToTime(const dwTicks: DWORD): String;
begin
Result := StringOfChar(#0, StrFromTimeInterval(Result, 0, dwTicks, 8));
StrFromTimeInterval(Result, Length(Result)+1, dwTicks, 8);
end;

////////////////////////////////////////////////////////
function BytesToSize(const exBytes: Double): AnsiString;
begin
Result := StringOfChar(#0, 15);
if Abs(exBytes) > 9.223372036854775807E18 then exBytes := 0;
#ifdef UNICODE
Result := CastIntegerToAnsiString(StrFormatByteSize64(Abs(exBytes div 1E4), Result, Length(Result)));
#else
Result := CastIntegerToString(StrFormatByteSize64(Abs(exBytes div 1E4), Result, Length(Result)));
#endif
end;

////////////////////////////////////////////////////
function DownloadFile(const szURL: String): Boolean;
var
hConnect, hSession, hFile, hHeap: THandle;
szHeader, szFileName: String;
dwBufferLength, dwIndex, dwStartDownload, dwStart, dwElapsed, dwWritten: DWORD;
lpBuffer, lpStatus, lpSize: Longint;
ib: INTERNET_BUFFERS;
begin
try
hSession := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, '', '', 0);
if hSession = 0 then Exit;

// additional header
szHeader := 'Referer: http://example.org/'#13#10;

// try direct link
repeat
hConnect := InternetOpenUrl(hSession, szURL, szHeader, Length(szHeader), INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD or INTERNET_FLAG_NO_AUTO_REDIRECT, 0);
if hConnect = 0 then Exit;
dwBufferLength := SizeOf(lpBuffer);
dwIndex := 0;
lpStatus := 0;
if not HttpQueryInfo(hConnect, HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER, lpStatus, dwBufferLength, dwIndex) then Exit;
lpBuffer := 0;
HttpQueryInfo(hConnect, HTTP_QUERY_LOCATION, lpBuffer, dwBufferLength, dwIndex);
if DLLGetLastError = ERROR_INSUFFICIENT_BUFFER then
begin
szURL := StringOfChar(#0, dwBufferLength-1);
if not _HttpQueryInfo(hConnect, HTTP_QUERY_LOCATION, szURL, dwBufferLength, dwIndex) then Exit;
if lpStatus = HTTP_STATUS_REDIRECT then InternetCloseHandle(hConnect);
end;
until lpStatus = HTTP_STATUS_OK;

// get file size
dwBufferLength := 4;
dwIndex := 0;
if not HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER, lpSize, dwBufferLength, dwIndex) then Exit;

// save dialog
szFileName := ExpandConstant('{userdesktop}\' + ExtractFileName(szURL));
if szFileName <> '' then
try
hFile := CreateFile(szFileName, GENERIC_READ or GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); //create file
if hFile = 0 then Exit;
hHeap := GetProcessHeap();
lpBuffer := HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 4*1024); // buffer size must be >= 512Kb
ib.dwStructSize := SizeOf(ib);
ib.lpvBuffer := lpBuffer;
ib.dwBufferLength := HeapSize(hHeap, 0, lpBuffer);

// show page
g_DownloadPage.Show;
g_DownloadPage.ProgressBar.Show;
g_DownloadPage.SetProgress(0, lpSize);

// try download
try
// initial labels
g_DownloadPage.Msg1Label.Caption := Format(
'Файл:'#9#9'%s'#13#10 +
'Загружено:'#9'%s из %s', [ExtractFileName(szFileName), BytesToSize(0), BytesToSize(lpSize)]
);
g_DownloadPage.Msg2Label.Caption := Format(
'Прогресс:'#9'%s'#13#10 +
'Скорость:'#9'%s/сек'#13#10 +
'Прошло:'#9'0 сек'#13#10 +
'Осталось:'#9'%d сек', [FormatFloat('0.#0 %', MulDiv(g_DownloadPage.ProgressBar.Position, 100, lpSize)), BytesToSize(0), MaxInt]
);

// download
dwStartDownload := GetTickCount;
while ib.dwBufferLength > 0 do
begin
dwStart := GetTickCount;
dwElapsed := 0;
while dwElapsed < 1000 do
begin
// read file
InternetReadFileEx(hConnect, ib, IRF_SYNC, 0);

// write file
WriteFile(hFile, ib.lpvBuffer, ib.dwBufferLength, dwWritten, 0);
ib.dwBufferTotal := ib.dwBufferTotal + dwWritten;

// update progressbar
g_DownloadPage.ProgressBar.Position := ib.dwBufferTotal;

// process messages
Application.ProcessMessages;
dwElapsed := GetTickCount - dwStart;
end;

// update labels
dwElapsed := GetTickCount-dwStartDownload;
g_DownloadPage.Msg1Label.Caption := Format(
'Файл:'#9#9'%s'#13#10 +
'Загружено:'#9'%s из %s', [ExtractFileName(szFileName), BytesToSize(ib.dwBufferTotal), BytesToSize(lpSize)]
);
g_DownloadPage.Msg2Label.Caption := Format(
'Прогресс:'#9'%d %%'#13#10 +
'Скорость:'#9'%s/сек'#13#10 +
'Прошло:'#9'%s'#13#10 +
'Осталось:'#9'%d сек', [MulDiv(ib.dwBufferTotal, 100, lpSize), BytesToSize(MulDiv(ib.dwBufferTotal, 1000, dwElapsed)), TicksToTime(dwElapsed), MulDiv(lpSize-ib.dwBufferTotal, dwElapsed, 1000)/(ib.dwBufferTotal + 1)]
);
end;
except
Result := False; // error
finally
end;
finally
CloseHandle(hFile);
HeapFree(hHeap, 0, lpBuffer);
Result := ib.dwBufferTotal = lpSize; // success
end;
except
Result := False; // error
finally
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
g_DownloadPage.Hide;
end;
end;

/////////////////////////////////////
procedure CreateDownloadProgressPage;
begin
g_DownloadPage := CreateOutputProgressPage('Загрузка файла', '');
with g_DownloadPage do
begin
Msg1Label.Height := Msg1Label.Height shl 1;
Msg2Label.Height := Msg2Label.Height shl 2;
Msg2Label.Top := ProgressBar.Top + ProgressBar.Height + ScaleY(5);
end;
end;

/////////////////////////////
procedure InitializeWizard();
begin
CreateDownloadProgressPage();
end;

//////////////////////////////////////////////////////
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
case CurPageID of
wpWelcome: DownloadFile('http://mse.dlservice.microsoft.com/download/7/6/0/760B9188-4468-4FAD-909E-4D16FE49AF47/ruRU/x86/mseinstall.exe');
end;
end;

Директория теперь будет указываться здесь, без участия окна "Сохранить как...":
// save dialog
szFileName := ExpandConstant('{userdesktop}\' + ExtractFileName(szURL));
if szFileName <> '' then

icetanker
15-12-2014, 12:21
а как сделать,чтобы сначала выполнялся блок CODE,когда скачивается файл,а потом Source: "1.ocx"; DestDir:"{sys}"; Flags:ignoreversion regserver

kotyarko@fb
15-12-2014, 13:17
а как сделать,чтобы сначала выполнялся блок CODE,когда скачивается файл,а потом Source: "1.ocx"; DestDir:"{sys}"; Flags:ignoreversion regserver »
А потом блок [Files]*.

Можно сделать функцию, которая будет возвращать определённый результат, в зависимости от чего-то:
[Files]
Source: "1.ocx"; DestDir: "{sys}"; Flags: ignoreversion regserver; Check: Checker

[*Code]
Function Checker(): Boolean;
begin
Result := IsComponentSelected('aa');
end;

icetanker
15-12-2014, 13:23
я правильно понял,у нас идет выполнение блоков,как они идут по коду общему?если я меняю блоки местами у меня этот блок так и пойдет?

kotyarko@fb
15-12-2014, 13:27
я правильно понял,у нас идет выполнение блоков,как они идут по коду общему? »
Нет, у них определённый порядок выполнения. В справке можно посмотреть (как они там перечислены, такой у них и порядок).
Всё приведено на прикреплённом скрине. Секция кода всегда последняя, а сетапа - первая.

icetanker
16-12-2014, 08:57
а есть ли возможность вывести статус с регистрации ActiveX?
в Source в мануале про это не пишется,а хотелось бы понять регистрирует или нет?

Юрій_Окропірідзе@vk
16-12-2014, 23:10
Здравствуйте. Подскажите пожалуйста как изменить размер окна инсталлятора и как подогнать кнопки

kotyarko@fb
16-12-2014, 23:16
Подскажите пожалуйста как изменить размер окна инсталлятора и как подогнать кнопки »
[*Code]
Procedure InitializeWizard();
var
HeigthAdv, WidthAdv: Integer;
begin
HeightAdv := 200;
WidthAdv := 200;
with WizardForm do
begin
Width := WizardForm.Width + WidthAdv;
Height := WizardForm.Height + HeightAdv;
NextButton.Top := .... + HeightAdv;
NextButton.Left := .... + WidthAdv;
CancelButton......
.....
end;
end;
И дальше по компонентам, нуждающимся в перемещении, после увеличения размера визарда.

saurn
16-12-2014, 23:32
Юрій_Окропірідзе@vk, kotyarko@fb, добавлю, координаты правильней указывать так:
Left := ScaleX( ... );
Top := ScaleY( ... );
Width := ScaleX( ... );
Height := ScaleX( ... );
//SetBounds( ScaleX( Left ), ScaleY( Top ), ScaleX( Width ), ScaleY( Height ) )
Чтобы потом невозникало проблем, типа: кнопка съехала, текст оказался не там, где должен быть и т.д.

kotyarko@fb
17-12-2014, 00:19
координаты правильней указывать так »
Не сказал бы.

Чтобы потом невозникало проблем, типа: кнопка съехала, текст оказался не там, где должен быть и т.д. »
Имеется ввиду масштабирование? - Тут есть два варианта: либо указывать всё по-простому, как в моём примере, либо указывать всё через шкалы. Но и это не решит полностью проблему.




© OSzone.net 2001-2012