Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup (создание инсталяционных пакетов)

Автор: SotM
Дата сообщения: 29.04.2009 13:14
joparoobit

Цитата:
сделать разбивку выводимого текста на две и более строк

Какой именно текст?
Приведи либо пример, либо свой первоначальный код.


Цитата:
По умолчанияю строка содержит значение AppName

Какая-какая строка?
Автор: BondDaniil00
Дата сообщения: 29.04.2009 15:39
HELP
Как сделать Product Key для своего инсталятора так чтобы при скачивании обновлений через инет происходила проверка этого КЛЮЧА
Автор: Qarma
Дата сообщения: 29.04.2009 19:19
Помогите с реестром.
InstallShield создаёт ветку в реестре, куда потом смотрит autorun, если нет ветки в реестре - кнопка играть не активна...но проблема в следующем: инно не понимает ключи типа "{}"

Код: Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9D135884-032F-4BC2-9909-AC899066B16A}"; ValueType: string; ValueName: InstallLocation; ValueData: {app}
Автор: spider91
Дата сообщения: 29.04.2009 19:35
Qarma


добавь еще одну { :


Код: Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{9D135884-032F-4BC2-9909-AC899066B16A}"; ValueType: string; ValueName: InstallLocation; ValueData: {app}
Автор: joparoobit
Дата сообщения: 29.04.2009 20:00

Цитата:
надпись на MainForm скорее всего просто рисунок, поэтому здесь 2 выхода:
1 - перехватить у формы WM_PAINT и рисовать что тебе вздумается (хоть вертикально текст выводи)
2 - сделать свою фоновую форму (см. Corona Skin, там вроде самодельная) и точно так же рисуй что хочешь


Спасибо за ответ

Глянул сырцы Main.pas, рисование происходит в procedure TMainForm.FormPaint(Sender: TObject):

DrawTextFlags := DT_WORDBREAK or DT_NOPREFIX or DT_NOCLIP;
....
Font.Color := clBlack;
DrawText(Handle, PChar(ExpandedAppName), -1, R2, DrawTextFlags);
Font.Color := clWhite;
DrawText(Handle, PChar(ExpandedAppName), -1, R, DrawTextFlags);

Следовательно, надпись можно изменить только через ExpandedAppName и разбиение на строки вряд ли возможно, как это могло проиcходить, например, если бы использовался встроенный TLabel (задать размеры, включить WordWrap или просто вписать Label1.Caption:='aa'#13#10'bb';).

Не уверен удастся ли перехватить WM_PAINT Inno. Ибо даже перечислить компоненты окна не получилось.

Перекомпилировать сырцы не представляется возможным: ругается, что D7 неверно работает с WideString, в D2009 помимо проблем с адаптацией сырцов к юникоду (Char -> AnsiChar), не хватает всех исходных модулей для компиляции.

Закрытая система. На первый взгляд. Сейчас стою перед выбором: Inno или NSIS.



Цитата:
Какой именно текст?
Приведи либо пример, либо свой первоначальный код.


Подскажите как в MainForm, которая видна при WindowVisible=true... - инфо более чем достаточно. Если кто не в курсе структуры Inno, то открываем ISetup.chm и поиском находим страничку:

1) MainForm
mk:@MSITStore:d:\Programs\Inno%20Setup%205\ISetup.chm::/topic_scriptclasses.htm

2) WindowVisible
mk:@MSITStore:d:\Programs\Inno%20Setup%20\ISetup.chm::/topic_setup_windowvisible.htm
Автор: htuos
Дата сообщения: 29.04.2009 21:06
joparoobit

Цитата:
Сейчас стою перед выбором: Inno или NSIS.

здесь не посоветую, т.к. NSIS видел только краем глаза
а по интересующему тебя вопросу рекомендую скачать Коллекция скриптов, и найти там Gradient_final.iss
своя фоновая форма, залитая градиентом + надпись. основа есть, а как вывести текст, в одну или две строки, думаю разберешься

Цитата:
Не уверен удастся ли перехватить WM_PAINT Inno.

это возможно при использовании InnoCallBack.dll
когда-то выкладывал пример самостоятельной отрисовки чекбоксов
http://ifolder.ru/9036233 (918 кб) если интересно
никто не запрещает тебе таким же образом рисовать на канве MainForm

ЗЫ с перекомпиляцией не заморачивался никогда, т.к. там используются сторонние компоненты, которые нужно искать (лень)
Автор: joparoobit
Дата сообщения: 29.04.2009 21:56
htuos

Благодарю за инфо. Действительно, как вы и советовали Corona_kernel.iss содержит background форму - уже выцарапал и принципиально оттестил. Внешне похоже на MainForm. Единственная проблема, что WizardForm не является модальным окном для этой формы. Со всеми вытекающими.

Нарисовать формы, переопределить события и пр. в Delphi не проблема еще и потому, что там можно трассировать выполнение. А в Inno надо по факту пробиться через упаковку.

Ваши примеры посмотрю. Еще раз спасибо

ps. еще бы прибить кастомный пункт в системном меню - тогда вообще бы благодать была, а формы все полностью самому отрисовать можно

pps. кстати, в примере с Corona при крупных шрифтах буквы не помещаются в элементах
Автор: DeKaNszn
Дата сообщения: 29.04.2009 22:45
joparoobit

все, что нужно для компилирования inno есть на оф.сайте
Автор: htuos
Дата сообщения: 30.04.2009 00:15
joparoobit

Цитата:
Благодарю за инфо. Действительно, как вы и советовали Corona_kernel.iss содержит background форму - уже выцарапал и принципиально оттестил. Внешне похоже на MainForm. Единственная проблема, что WizardForm не является модальным окном для этой формы. Со всеми вытекающими.

ну, в короне для этих целей определен метод OnActivate у фоновой формы (точно не помню)
думаю, что и по другому можно решить эту проблему

Цитата:
Нарисовать формы, переопределить события и пр. в Delphi не проблема еще и потому, что там можно трассировать выполнение. А в Inno надо по факту пробиться через упаковку.

отладчик в инно тоже есть, возможностей конечно меньше чем у делфийского, но все же

Цитата:
еще бы прибить кастомный пункт в системном меню - тогда вообще бы благодать была

вот код, который прибьет пункт меню "About Setup ..."
[more][Code_]

function GetSystemMenu(Wnd: HWnd; bRevert: boolean): HWnd;external 'GetSystemMenu@user32.dll stdcall';
function RemoveMenu(hMenu: HWnd; uPosition: Integer; uFlags: Longint): boolean;external 'RemoveMenu@user32.dll stdcall';

Procedure InitializeWizard();
begin
RemoveMenu(GetSystemMenu(WizardForm.Handle, False),8,$400);
RemoveMenu(GetSystemMenu(WizardForm.Handle, False),7,$400);
end;
[/more]
с этим проблем никаких нет

Цитата:
в примере с Corona при крупных шрифтах буквы не помещаются в элементах

крупные шрифты - имеется ввиду шрифты установленные в винде?
вобщем не понял про что ты здесь, поподробнее опиши и автор, думаю, исправит

Автор: Victor_Dobrov
Дата сообщения: 30.04.2009 00:52
joparoobit

Цитата:
кстати, в примере с Corona при крупных шрифтах буквы не помещаются в элементах

Не считаю проблемой, (но исправлю) ведь в скине и так используются довольно крупные шрифты, их можно уменьшить в Example.iss, указав свои в секции [LangOptions]

Но информация в фоновом окне (название, таблица сведений о системе) даже при шрифтах на пол-экрана:
#define InfoText "... Size:= 27; ... iSize:= 18 ..."
отображается правильно.
Автор: Qarma
Дата сообщения: 30.04.2009 05:47
Как сделать неактивной кнопку "Отмена" во время рспаковки FreeArc архивов?
Автор: DeKaNszn
Дата сообщения: 30.04.2009 07:38
Qarma

смотри
http://forum.ru-board.com/topic.cgi?forum=5&topic=29117&start=1700#3
и http://forum.ru-board.com/topic.cgi?forum=5&topic=29117&start=1700#4
Автор: BondDaniil00
Дата сообщения: 30.04.2009 08:47
Подскажите
Как сделать Product Key для своего инсталятора так чтобы при скачивании обновлений через инет происходила проверка этого КЛЮЧА
Автор: Igrikxxx
Дата сообщения: 30.04.2009 09:41
SotM

Цитата:
Я же тебе выкладывал совмещенный код, зачем еще раз тоже самое спрашивать?!


Да я писал тоже об этом в том коде который ты совместил, он выдавал ошибку!
Автор: DuhaLab
Дата сообщения: 30.04.2009 10:08
у меня такая проблема: при парсинге INI файла (он сохранен в UTF-8 - другой вариант не приемлем), если в переменной в пути для установки "{app}\userjs" есть русские символы например, путь будет выбран такой "C:\Users\Администратор\AppData\Roaming\Opera\Opera 10 Preview\profile" то после установки в INI файле появится строка "C:\Users\?????????????\AppData\Roaming\Opera\Opera 10 Preview\profile\userjs", т.е. слово Администратор не пропишется, а пропишутся каракули, как исправить это, чтоб парсилось нормально?

сам код:

Цитата:
Filename: {app}\opera6.ini; Section: User Prefs; Key: User JavaScript File; String: {app}\userjs;


путь может быть не обязательно "C:\Users\Администратор\AppData\Roaming\Opera\Opera 10 Preview\profile", а может быть другой, так что переменная "userappdata" не канает за решение проблемы... ((
Автор: SotM
Дата сообщения: 30.04.2009 11:41
Igrikxxx

Цитата:
Да я писал тоже об этом в том коде который ты совместил, он выдавал ошибку!

Ты же сказал совместить код, а не искать в нем ошибки. А в нём были явные ошибки изначально. Я его не компилировал и не проверял, но лишь сразу заметил "странности" в коде. Откуда мне знать, может ты специально там что-то вырезал/оставил для себя.

DuhaLab
Ответа на твой вопрос не знаю, но могу предложить глянуть на новую версия Inno (ispack-unicodepreview.exe).
Вроде эта новая версия должна лучше поддерживать Unicode.
Автор: DuhaLab
Дата сообщения: 30.04.2009 12:10
SotM
установил, при компиляции пишет ошибка - неизвестный тип в SHFileOperation.iss, в обычном ispack проходит все на ура (((
да и не помогает он, все равно таже беда...
Автор: joparoobit
Дата сообщения: 30.04.2009 14:21
Victor_Dobrov


Цитата:
Не считаю проблемой, (но исправлю) ведь в скине и так используются довольно крупные шрифты, их можно уменьшить в Example.iss, указав свои в секции [LangOptions]


Речь идет о крупных шрифтах в Windows (для ХР - правый клик на Desktop, в popup выбрать пункт "Свойства", появится окно "Свойства: Экран", закладка "Параметры", кпонка "Дополнительно", закладка "Общие") 120 dpi против стандартных 96 dpi.

Привык работать в крупных шрифтах и классической теме. Так что приходится просматривать варианты отображения прог в других темах, шрифтах и даже на двух мониторах

Delphi на автомате меняет размеры элементов при изменении шрифтов.

htuos


Цитата:
ну, в короне для этих целей определен метод OnActivate у фоновой формы (точно не помню)
думаю, что и по другому можно решить эту проблему


Проблема в том, что если окно не модальное, то возможно активировать то окно что под ним, а это в свою очередь означает перерисовки(мерцание), возможность свернуть и пр.

Изначально несколько лет кряду пользовался Wise InstallMaster седьмой версии и был доволен. Но вот захотелось принарядить прогу И хотелось бы создать полную копию по функционалу, но более нарядную по сравнению с тем, что имею.

Наверное, без MainForm (background window) можно обойтись. Даже создатели Inno указывают, что сие окно есть атавизм.

Кстати, по поводу checkboxes, рекомендую глянуть unit Themes; - там показано как прорисовывать элементы согласно теме. Я, например, переопредилил метод Paint у TSpeedButton так, что в качестве рисунка выводится крестик как у окон (для закрытия локальных панелек). Что-то типа этого:

// twCloseButtonNormal, twCloseButtonHot, twCloseButtonPushed, twCloseButtonDisabled,
if ThemeServices.ThemesEnabled then
begin
if MouseInControl then
ButtonState:=twSmallCloseButtonHot
else
if FFocused then
ButtonState:=twSmallCloseButtonNormal
else
ButtonState:=twSmallCloseButtonDisabled;

if not Enabled then
begin
FState:=bsDisabled;
ButtonState:=twSmallCloseButtonDisabled;
end
else
if FState=bsDisabled then
if Down and (GroupIndex <> 0) then
FState:=bsExclusive
else
FState:=bsUp;

if FState in [bsDown, bsExclusive] then
ButtonState:=twSmallCloseButtonPushed;

PaintRect:=ClientRect;
ThemeServices.DrawElement(Canvas.Handle,
ThemeServices.GetElementDetails(ButtonState),
PaintRect,PaintRect);
end
Автор: Qarma
Дата сообщения: 30.04.2009 16:20
Поможет кто реализовать такое: в начале установки выводится видео файл (.avi), а потом уже начинается установка. Что-то наверно взять из скрипта "Splash".
Поможет кто реализовать?

Добавлено:
И ещё вопрос, как вставить в скрипте Splash вместо bmp картинки - png

Код: [Setup]
AppName=Splash
AppVerName=Splash
CreateAppDir=false
DisableDirPage=true
DisableProgramGroupPage=true
UninstallDisplayName=Splash

[Files]
Source: compiler:WizModernImage.bmp; DestDir: {tmp}; DestName: Splash.bmp; Flags: dontcopy


Код:
procedure InitializeWizard();
var
SplashImage: TBitmapImage;
SplashForm: TForm;
SplashFileName: String;
I: Integer;

begin

SplashFileName := ExpandConstant('{tmp}\splash.bmp');
ExtractTemporaryFile(ExtractFileName(SplashFileName));
SplashForm := TForm.create(nil);
with SplashForm do
begin
BorderStyle := bsNone;
Position := poScreenCenter;//poDesigned poDefault poDefaultPosOnly poDefaultSizeOnly
ClientWidth := 405;    // Минимальный размер 320х200 !
ClientHeight := 310;
end;
SplashImage := TBitmapImage.Create(SplashForm);
with SplashImage do
begin
Bitmap.LoadFromFile(SplashFileName);
Stretch := false;
Align := alClient;
Parent := SplashForm;
end;

with SplashForm do
begin
Show;
for I := 1 to 1 do
begin
Repaint;
Sleep(1000); // показ изображения в милисекундах
end;
// Close;
// Free;
end;
end;
Автор: aabliaa
Дата сообщения: 30.04.2009 18:57
Сразу несколько вопросов. Наверняка ни я первый, но всетаки.
Существует спец литература по этой проге, по типу "Inno Setup для чайников"? Где все как для дураков, от легкого к сложному.
Как посмотреть скрипт, с помощю которого был собран инсталятор (exe-фаил)?
Просто интересный инстолятор. Он, по мимо мелких фишек, и драйвер антистарфорса поставил и DT, да еще ярлык создал, который запускает этот DT (с нужными параметрами), а тот в свою очередь эмулирует миниобраз и запускает игруху. И все это полностью автоматически.
Попробовал, сходу, создать инсталятор. Он мне все файлы, в одну паку поставил, тоесть подкаталогов нет, соответственно ничего не работает.
Вообще реально, вот так у компа, освоить эту прогу и писать простые скрипты? Или нужен помошник, который в этом шарит.
Спасибо.
Автор: Seup
Дата сообщения: 30.04.2009 19:45
Знающие люди, подскажите пожалуйста, как сделать так, чтобы после распаковки звуковых файлов в формате mp3, автоматически запустилась программа по перекодировке из mp3 в wav. Я такое видел при установке игры, там сначала все распаковалось, а потом какая-то программа начала перекодировать звуковые файлы mp3 в wav.
Автор: Qarma
Дата сообщения: 30.04.2009 20:17

Цитата:
Я такое видел при установке игры

Игра какая?
Автор: spider91
Дата сообщения: 30.04.2009 21:49
Seup


засунь файлы в инсталлятор, допиши там AfterInstall: kodirovanie; и в процедуре запусти свою прогу.

щас пример дать немогу, нет времени.
Автор: SotM
Дата сообщения: 30.04.2009 22:55
aabliaa
Спец. литература?! А инфы в шапке и на форуме не достаточно?!
Скачиваешь всё из шапки, сидишь за компом и изучаешь. И читаешь временами хелп.

Seup
Ну и я такое видел в играх, и таки шо?
Я так понимаю, что ты мало понимаешь в Inno, и после этого последует еще минимум 10 вопросов. Может сначала сам чуток поизучаешь?

Qarma

Цитата:
И ещё вопрос, как вставить в скрипте Splash вместо bmp картинки - png

Можешь глянуть в "BitmapToPicture.iss" и "Image Stream.iss" там вроде как организована загрузка картинок других форматов.

Автор: spider91
Дата сообщения: 30.04.2009 23:19

Цитата:
Скачиваешь всё из шапки, сидишь за компом и изучаешь. И читаешь временами хелп.



поддерживаю. там можно найти много интересного и самому подучится.


но и в форуме многое могут сказать. я думаю можно коечто добавить в Коллекцию скриптов и Сборник вопросов т.к. в фруме есть много нового.



P.S.
мой вопрос про то как сделать инсталлятор подвижным во время распаковки внешних архивов ве еще в силе.
Автор: perf92
Дата сообщения: 30.04.2009 23:35
Люди помогите пожалуйста, как в конце установки рядом с "запустить приложение" сделать например "обновить directx" или "установить OpenAL" , чтото типо этого?

------------------------------------------
Все разобрался!
Автор: htuos
Дата сообщения: 30.04.2009 23:51
joparoobit

Цитата:
Проблема в том, что если окно не модальное, то возможно активировать то окно что под ним, а это в свою очередь означает перерисовки(мерцание), возможность свернуть и пр.

вот после этого

Цитата:
а по интересующему тебя вопросу рекомендую скачать Коллекция скриптов, и найти там Gradient_final.iss

на детский сад похоже
этот скрипт при знании delphi переписать 10 мин.
[more][Setup]
AppName=Gradient
AppVerName=Gradient
CreateAppDir=false
OutputDir=.

[Code]
type    
hDC=Longint;
TSize=record
cx:UINT;
cy:UINT;
end;

const
BeginColor=$0000FF;
FinishColor=$FF0000;

function MulDiv(Number,Numerator,Denominator:integer):integer;external 'MulDiv@kernel32.dll stdcall';    
function SetBkMode(DC:hDC;BkMode:integer):integer;external 'SetBkMode@gdi32.dll stdcall';
function GetSystemMetrics(nIndex:integer):integer;external 'GetSystemMetrics@user32.dll stdcall';

function RGB(r,g,b:Longint):Longint;
begin
Result:=(r or (g shl 8) or (b shl 16))
end;

function GetBValue(rgb:DWORD):Byte;
begin
Result:=Byte(rgb shr 16)
end;

function GetGValue(rgb:DWORD):Byte;
begin
Result:=Byte(rgb shr 8)
end;

function GetRValue(rgb:DWORD):Byte;
begin
Result:=Byte(rgb)
end;

procedure GradientFill(WorkBmp:TBitmapImage;BeginColor,FinishColor:TColor);    
var
ColorBand:TRect;
i,n:integer;
begin
    WorkBmp.Bitmap.Width:=WorkBmp.Width;
WorkBmp.Bitmap.Height:=WorkBmp.Height;
n:=255;
for i:=0 to n do begin
    ColorBand.Right:=WorkBmp.Width;
     ColorBand.Top:=MulDiv(i,WorkBmp.Height,n);
     ColorBand.Bottom:=MulDiv(i+1,WorkBmp.Height,n);
    WorkBmp.Bitmap.Canvas.Brush.Color:=RGB(GetRValue(BeginColor)+MulDiv(i,GetRValue(FinishColor)-GetRValue(BeginColor),n-1),
GetGValue(BeginColor)+MulDiv(i,GetGValue(FinishColor)-GetGValue(BeginColor),n-1),
GetBValue(BeginColor)+MulDiv(i,GetBValue(FinishColor)-GetBValue(BeginColor),n-1));
    WorkBmp.Bitmap.Canvas.FillRect(ColorBand);
end;
end;

procedure BitmapTextOut(Bmp:TBitmapImage;Text,FontName:string;Style,Left,Top,Size:Byte;Color:TColor);
// позицию текста указывать в процентах
begin    
with Bmp.Bitmap.Canvas do begin
     case Style of
1: Font.Style:=[fsBold];
2: Font.Style:=[fsItalic];
3: Font.Style:=[fsBold, fsItalic];
end;
    Font.Height:=(Bmp.Width+Bmp.Height)/200*Size    // попытка подстроить шрифт под размер окна
SetBkMode(Handle,1);
Font.Name:=FontName;
    Font.Color:=clBlack;
     TextOut(Bmp.Width/100*Left,Bmp.Height/100*Top,Text);
     Font.Color:=Color;
     TextOut(Bmp.Width/100*Left-2,Bmp.Height/100*Top-2,Text);
end;
end;

procedure InitializeWizard;
var
BackgroundImage:TBitmapImage;
begin
with MainForm do begin
BorderStyle:=bsNone;
Width:=GetSystemMetrics(0);
Height:=GetSystemMetrics(1);
Top:=0;
Left:=0;
end;
BackgroundImage:=TBitmapImage.Create(MainForm);
with BackgroundImage do begin
    Parent:=MainForm;
Width:=MainForm.Width;
Height:=MainForm.Height;
Top:=0;
Left:=0;
end;
    GradientFill(BackgroundImage,BeginColor,FinishColor);
    BitmapTextOut(BackgroundImage,MainForm.Caption,'Times',3,10,8,4,clWhite);
    BitmapTextOut(BackgroundImage,'2-я строка','Times',3,10,13,4,clWhite);
    MainForm.Show;
WizardForm.Caption:=MainForm.Caption
end;[/more]
в этом примере фоновая форма не активируется (т.к. это MainForm) и ни каких наворотв в написании нет

Цитата:
Кстати, по поводу checkboxes, рекомендую глянуть unit Themes;

я тебе пример с чекбоксами дал, чтобы показать как можно переопределить оконную процедуру у контрола, а не как заскинить приложение
в инно нет модуля Themes, если тебе нужно скинирование, то качай isskin.dll с примерами использования (все ссылки в шапке есть)
Автор: Victor_Dobrov
Дата сообщения: 01.05.2009 02:19
joparoobit

Цитата:
Corona Skin: Речь идет о крупных шрифтах в Windows (для ХР - правый клик на Desktop, в popup выбрать пункт "Свойства", появится окно "Свойства: Экран", закладка "Параметры", кпонка "Дополнительно", закладка "Общие") 120 dpi против стандартных 96 dpi.

Переделывать скин под 120 dpi сложно, проще сделать другой с нуля, поскольку Corona Skin всё же рассчитана на стандартные настройки оформления. Но, так как я ещё не видел, чтобы кто-то работал с такими установками, то не считаю это недостатком скина.

P.S. Поставил 120 dpi, на 19-м мониторе при разрешении 1280х1024 всё выглядит очень крупно. Не знаю, как в Delphi, но винда явно заточена под 800х600 и 8-й шрифт и в этом режиме большие проблемы, например меньше размер графики в диалогах.

Цитата:
Самостоятельная отрисовка чекбоксов...

Рекомендую глянуть версию Inno Setup 5.2.3.е7 от ResTools, где уже сделана загрузка своих чекбоксов из bmp-файла:

[Setup]
ComponentsListBtnImageFile=btnimage.bmp
Автор: joparoobit
Дата сообщения: 01.05.2009 07:09
htuos


Цитата:
на детский сад похоже
этот скрипт при знании delphi переписать 10 мин.
Подробнее... [?]
в этом примере фоновая форма не активируется (т.к. это MainForm) и ни каких наворотв в написании нет


За код спасибо. Но прошу не обижайтесь Достаточно вставить

MainForm.BorderStyle:=bsSizeable;

перед

MainForm.Show;

И сами всё увидите: background окно можно потаскать, поменять размеры.
Автор: Qarma
Дата сообщения: 01.05.2009 08:47
Мне кто нить ответьте
http://forum.ru-board.com/topic.cgi?forum=5&topic=29117&start=1720#15

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071

Предыдущая тема: в очередной раз босудим антивиры?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.