Войти

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


Страниц : 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

Johny777
05-12-2013, 20:55
Nordek,
У тебя InitializeWizard не один? »
Должен быть один) »
//Пример событий имеющие дубликацию »
Shkutu права. Например та же процедура procedure InitializeWizard(); может быть только одна с таким названием
тк инно не поддерживает перегрузку (http://www.delphibasics.ru/Overload.php), и даже не в этом дело. Если б компилятор допускал одинаковые названия глобальных переменных, констант, функций/процедур не отличающихся друг от друга по вызову, такой код если б работал бы, то в режиме хаоса и анархии.
то что у тебя в коде это вызов одних процедур из других
например это
procedure CurPageChanged(CurPageID: Integer);
begin
CurPageChanged1(CurPageID);
// CurPageChanged2(CurPageID);
// CurPageChanged3(CurPageID);
// CurPageChanged4(CurPageID);
// CurPageChanged5(CurPageID);
end;

////////////////////////////////////////////////////////////

function InitializeSetup(): Boolean;
begin
Result := InitializeSetup1(); if not Result then exit;
// Result := InitializeSetup2(); if not Result then exit;
// Result := InitializeSetup3(); if not Result then exit;
// Result := InitializeSetup4(); if not Result then exit;
// Result := InitializeSetup5(); if not Result then exit;
end;

тоже самое, что и это:
procedure Johny(CurPageID: Integer);
begin
//...
end;
procedure Nordek(CurPageID: Integer);
begin
//...
end;
procedure SomeProc(CurPageID: Integer);
begin
//...
end;
procedure BadProc(CurPageID: Integer);
begin
//...
end;

procedure CurPageChanged(CurPageID: Integer);
begin
Johny(CurPageID);
Nordek(CurPageID);
SomeProc(CurPageID);
BadProc(CurPageID);
//..
end;

/////////////////////////////////////////////////////////////////////////////

function A(): Boolean;
begin

end;
function B(): Boolean;
begin

end;
function C(): Boolean;
begin

end;
function InitializeSetup(): Boolean;
begin
Result := InitializeSetup1(); if not Result then exit;
// Result := A(); if not Result then exit;
// Result := B(); if not Result then exit;
// Result := C(); if not Result then exit;

end;

Дубликация в моём понимании - это например копирование одного участка памяти по адресу в другой такого-же размера. Вот только в том и дело - это копирование (называем действия своими именами), а не дубликация
в Си-шке есть strdup например...
и на будущее будь внимательнее, чтоб тебе по ушам не ездили с мифическими терминами типа "дубликации событий", тк это может сказаться на твоём восприятии кода, который по сути без подобных терминов всегда очень логичен! :)

Nordek
05-12-2013, 21:03
procedure InitializeWizard(); может быть только одна с таким названием »
Johny777, Это родитель будет только один
procedure InitializeWizard();
а потомков от него сколько угодно
begin
InitializeWizard1();
InitializeWizard2();
InitializeWizard3();
InitializeWizard4();
InitializeWizard5();
end;


да и не мне тебе рассказывать.

Восприятие каждого относительно. Нужно учитывать всё, и обязательно уточнить чтоб в дальнейшем при помощи постоянно не исправлять одну ошибку за другой.



На скрине сразу виден был весь скрипт?
На скриншоте указан был только кусок кода:
//прячем имена файлов
WizardForm.FileNameLabel.Visible:= False;
//голубой цвет текста вместо блеклого
with WizardForm do begin
with BeveledLabel do begin
Font.Color:=clBlue;
Enabled:=True;
end;
end;
end;
var
Page: TOutputMsgMemoWizardPage;
//procedure InitializeWizard();
begin
Page := CreateOutputMsgMemoPage(wpSelectComponents,
'Предупреждение!', '',
'', 'Внимание! Прежде чем инсталировать Microsoft .NET Framework только 4.0 для Windows 7, установите версию 3.5.1 из Панель управления-Программы и компоненты-Включение и отключение компонентов Windows-Microsoft .NET Framework 3.5.1');
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
case PageFromID(PageID) of
Page: Result := not IsComponentSelected('Framework\4');
end;
end;

так ещё процедура procedure InitializeWizard(); была закомментирована //procedure InitializeWizard();, что там выше и ниже было, оставалось только догадываться.

Не всегда код может быть таким
procedure InitializeWizard();
begin
with WizardForm.DirEdit do
begin
Top := ScaleY(92);
end;
end;


может быть и таким
procedure RedesignWizardForm;
begin
with WizardForm.DirEdit do
begin
Top := ScaleY(92);
end;
end;















procedure InitializeWizard();
begin
RedesignWizardForm;
end;

и от куда что вываливается не понятно.
Чтоб не гадать, лучше показывать не скриншот, а весь скрипт.
Я тоже могу наделать скриншотов, вечности не хватит чтоб угадать весь скрипт.

habib2302
05-12-2013, 21:26
Dimas2011,

Nordek
05-12-2013, 21:52
Как сделать так чтобы когда наводишь на название какого-то файла выскакивала картинка? » Dimas2011, какая-то странная мода пошла. Вас там ещё много?
Сообщения #662 (http://forum.oszone.net/post-2169372-662.html) в шапке явно не хватает.

сделайте хотябы для одного элемента плыз » #1560 (http://forum.oszone.net/post-2263894-1560.html).

Johny777
05-12-2013, 22:00
Nordek,
Это родитель будет только один, а потомков от него сколько угодно»
извращение понятий.
давай поговорим об абстрактном
термин родитель/предок --> наследник/потомок применим к классам в ООП
Например ты написал визуальный класс - "Кнопка" (у которой например нет возможность менять цвет),
type
TButton = class(TWinControl)
private
// методы и свойства
public
// методы и свойства
end;
но потом понял, что помимо неё ещё нужна более продвинутая
со свойством "цвет", "прозрачность" + всё то, что есть у TButton (текст, хинт,...)
чтоб не писать заново класс ты пишешь наследника TColorButton = class(TButton)
TColorButton наследует все методы и свойства TButton + теперь уже в классе TColorButton ты описываешь те дополнительные свойства, ради чего ты её сабклассил
понимаешь теперь,
не подумай, что я придираюсь к словам. От души тебе желаю, чтоб ты в будущем создавал свои классы, но чтоб при этом у тебя не было путаницы в голове, чтоб
вызов одной процедуры/функции из другой для тебя был бы вызов одной процедуры/функции из другой, а не дубликация
и понятия родитель - потомок ассоциировались с тем самым (о чём я только что говорил)
Восприятие каждого относительно. »
согласен. На тему восприятия другой пример:
код пишется как правило для себя, но не всегда (иногда выложишь в свободный доступ, захочешь когда-нибудь переписать, или будут проблемы - спросишь например на форуме)
к примеру у тебя вызов
begin
InitializeWizard1(); // извлечение картинок
InitializeWizard2(); // создание страницы
end;
это "быдлокод" http://otvet.mail.ru/question/62758337 (во втором сообщении одна из особенностей)
(я не раз при чтении чужого скрипта для его исправления, запутывался во всех этих невнятных названиях. Само по себе чтение чужого кода - штука невесёлая, даже если он нормально написан )
не будет ли более ясным такой вызов?
begin
ExtractPictures(); // извлечение картинок
CreatePage(); // создание страницы
end;
еще как будет!

какая-то странная мода пошла. Вас там ещё много?
Сообщения #662 в шапке явно не хватает. »
поддерживаю! :laugh:

El Sanchez
05-12-2013, 22:39
Предлагаю добавить код в шапку (с заменой, если сочтёшь нужным), тк он может многим пригодиться »
Johny777, на втором пустом элементе массива прямых ссылок будет выход и до свиданья закачки, не учитываешь, что у людей может интернет через прокси быть, про редирект ты тоже не знаешь.
только я так и не понял зачем нужен флаг в твоём коде InternetOpenUrl(... INTERNET_FLAG_NEED_FILE )»
Johny777, ну, игрался с флагами, с этим флагом файл кешируется на прокси (при наличии прокси) или создается временный файл (при отсутствии прокси), сейчас этот флаг не использую.
когда уже непосредственно получаешь указатель на файл для скачивания? »
Johny777, флаги влияют на свойства получаемого дескриптора файла.
El Sanchez, ты тогда говорил:
Цитата El Sanchez:
P.S. Вообще-то пример в шапке устарел, заменю его как-нибудь. » »
Ну раз обещал, последняя моя версия:


[Setup]
AppName=test
AppVerName=test
CreateAppDir=false
DefaultDirName={tmp}
Uninstallable=false

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl

[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 := 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://mse.dlservice.microsoft.com/download/7/6/0/760B9188-4468-4FAD-909E-4D16FE49AF47/ruRU/x86/mseinstall.exe');
end;
end;

Dinvin4ester
05-12-2013, 22:40
Ребята , как прописать , чтобы после установки выходило два ехе файла на рабочий стол ?
Вот скрипт http://sendfile.su/905823

Nordek
05-12-2013, 22:47
Johny777, Кстати, мне показалось или код (http://forum.oszone.net/post-2169372-662.html) немного не корректно отрабатывает? Имею ввиду относительно только одного компонента.

редирект »плохая штука этот редирект. Когда обнаруживаешь вместо закаченного файла, закаченную страницу.

Johny777
05-12-2013, 22:55
на втором пустом элементе массива прямых ссылок будет выход и до свиданья закачки »
так и задумывалось. Те предполагается что если нужно скачать несколько файлов, то функция завершится успешно, если они скачались все!
тк что толку например с 1 файла из 3 если они все втроём составляют одно целое, но это исправить не долго,
я ж не знаю, тонкостей запроса Tco 03
что у людей может интернет через прокси быть »
про редирект ты тоже не знаешь »
как конкретно это учитывается?
Коду работы с интернетом я уделял только 2 раза внимание.
Потому пока ещё не знаю всех тонкостей

Nordek, Кстати, мне показалось или код немного не корректно отрабатывает? Имею ввиду относительно только одного компонента. »
вызов ShowPicHint() для всех компонентов одинаковый, картинка отображается в точке расположения курсора.
только-что проверил. Кажись всё в порядке.

улучшил код. Должен теперь быстрее работать, тк установка стиля и прозрачности теперь 1 раз при создании формы, а не каждый раз при показе
+ перезалил "наглядный пример"

Nordek
05-12-2013, 23:16
только-что проверил. Кажись всё в порядке. »
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
Compression=none
AppId=TheBestAppId
DisableWelcomePage=yes
DisableFinishedPage=yes
DisableDirPage=yes
DisableReadyPage=yes


[Components]
Name: a; Description: A


[Files]
Source: A.bmp; Flags: dontcopy nocompression


[Code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

const
UNDEF_INDEX = -777;
ALPHA_BLEND_LEVEL = 128; // max=Byte=255

WS_EX_LAYERED = $80000;
WS_EX_TRANSPARENT = $20;
LWA_COLORKEY = 1;
LWA_ALPHA = 2;
GWL_EXSTYLE = (-20);


var
InfoPic: TBitmapImage;
LastIndex: Integer;
TempPath: String;
PicForm: TForm;


type
COLORREF = DWORD;


function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function SetLayeredWindowAttributes(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function SetFocus(hWnd: HWND): HWND; external 'SetFocus@user32.dll stdcall';


procedure ShowPicHint(const PicFilePath: String);
var
pt: TPoint;
begin
if not GetCursorPos(pt) then Exit;
InfoPic.Bitmap.LoadFromFile(PicFilePath);
try
with PicForm do
begin
SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);
Show;
end;
finally
SetFocus(WizardForm.Handle);
end;
end;


procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
UndefPic: String;
begin
if Index = -1 then Exit;
if Index = LastIndex then Exit;
try
case TNewCheckListBox(Sender).ItemCaption[Index] of
'A': UndefPic := 'A.bmp';
else
begin
LastIndex := UNDEF_INDEX;
PicForm.Hide;
Exit;
end;
end;
if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
ShowPicHint(TempPath + UndefPic);
finally
LastIndex := Index;
end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
PicForm.Hide;
end;


procedure InitInfo();
begin
WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
TempPath := AddBackslash(ExpandConstant('{tmp}'));
LastIndex := UNDEF_INDEX;
PicForm := TForm.Create(WizardForm)
with PicForm do
begin
BorderStyle := bsNone;
FormStyle := fsStayOnTop;
InfoPic := TBitmapImage.Create(PicForm)
with InfoPic do
begin
Parent := PicForm;
AutoSize := True;
end;
end;
end;


procedure InitializeWizard();
begin
InitInfo();
end;

Да вот смотрю, в первый раз картинка появляется. Потом отвожу курсор, ещё раз навожу и уже не появляется.
При трёх компонентах нормально.

Dinvin4ester,
Если файлы разные
[Files]
Source: Твой_файл1.exe; DestDir: {commondesktop}
Source: Твой_файл2.exe; DestDir: {commondesktop}


Если файл один и тот же
[Files]
Source: Твой_файл.exe; DestDir: {commondesktop}; DestName: Твой_файл1.exe
Source: Твой_файл.exe; DestDir: {commondesktop}; DestName: Твой_файл2.exe

Johny777
05-12-2013, 23:24
Да вот смотрю, в первый раз картинка появляется. Потом отвожу курсор, ещё раз навожу и уже не появляется. »
так сразу и сказал бы :)
благодарю за найденную ошибку!
в procedure CompOnMouseLeave(Sender: TObject); не хватало LastIndex := -1;
исправил, перезалил демо

http://forum.oszone.net/post-2169372-662.html

Dinvin4ester
05-12-2013, 23:29
Nordek,
Спасибо , но что-то выдает ошибку .

Nordek
05-12-2013, 23:40
но что-то выдает ошибку . »Я не могу угадать путь к твоему файлу exe.

А так?
Source: E:\Games 2\Четыре поросенка и коробка\Твой_файл1.exe; DestDir: {commondesktop}
Source: E:\Games 2\Четыре поросенка и коробка\Твой_файл2.exe; DestDir: {commondesktop}

эти строчки, добавляешь в секцию [Files].

Dinvin4ester
05-12-2013, 23:46
Nordek,
Вот сейчас все подошло. Огромное спасибо вам .

tuz-veta
06-12-2013, 00:14
Привет всем!
Нужна ваша помощь, например запускаю инсталлятор и устанавливаю компоненты которые мне надо.
Потом запускаю еще раз инсталлятор и снимаю галочки с тех компонентов которые я установил,
как сделать если я снимаю галочки с компонентов которые были установленные
то чтоб эти компоненты удалялись?
ЗАРАНЕЕ БОЛЬШОЕ СПАСИБО!

habib2302
06-12-2013, 00:27
tuz-veta,
[Setup]
AppId=by Xabib

[code ]

function UninstallMyApp(): Boolean;
var
Buff: String;
i: Integer;
begin
Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
if not Result then Result := not FileExists(RemoveQuotes(Buff));
if not Result then if MsgBox('Перед установкой необходимо удалить предыдущую версию приложения. Продолжить?', mbError, MB_YESNO) = IDYES then
try
Exec(RemoveQuotes(Buff), '', ExtractFilePath(RemoveQuotes(Buff)), SW_SHOW, ewWaitUntilTerminated, i);
finally
Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
if not Result then MsgBox('Удаление завершилось неудачей!', mbError, MB_OK);
end;
end;

function InitializeSetup(): Boolean;
begin
Result := UninstallMyApp();
end;

tuz-veta
06-12-2013, 00:57
habib2302,
Вы наверное не так меня поняли.
Мне надо удалять компоненты снятием галочки с компонента а не через unins000.exe

Tco 03
06-12-2013, 03:15
написал полностью код закачки с нуля на основе тех же функций из Wininet.h/Wininet.pas
двойной прогресс как ты и хотел, ...
сам код загрузки + демо»
Что-то у меня не работает... Висит надпись "Preparing download..." и всё, больше никаких действий! :meeting:
я ж не знаю, тонкостей запроса Tco 03 »
:clever-ma Нужно, если пользователь выберет один компонент, то скачать нужно один файл - если выберет другой компонент, то скачать нужно два файла.

Optitron
06-12-2013, 05:27
Здравствуйте. Как сделать так, что кнопка "Далее" переименовывалась в "Установить" на посл. странице мастера перед установкой (при условии, что DisableReadyPage=yes).

Mat_y
06-12-2013, 08:55
Добрый день.
Такой вопрос... реально ли в этом шаблоне (http://repacks.org.ua/engine/download.php?id=253) установщика сделать прокрутку списка компонентов кнопками вверх/вниз (которые на форме нарисованы) и (или) колесиком мышки? Т.к. в данный момент реализован только ползунок.
Буду благодарен за помощь.

Здравствуйте. Как сделать так, что кнопка "Далее" переименовывалась в "Установить" на посл. странице мастера перед установкой (при условии, что DisableReadyPage=yes). »

Procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectTasks then
begin
WizardForm.NextButton.Caption:='Установить';
end;
end;




© OSzone.net 2001-2012