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

Nordek
12-07-2014, 19:55
Как в юникоде сделать кликабельные иконки? »Не буду я возиться с вашим обрубком.


#define Bitmap "Logo.bmp"

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Files]
Source: {#Bitmap}; Flags: dontcopy solidbreak

[Code]
var
BitmapImage1: TBitmapImage;
EC: Integer;

procedure Bitmap1Click(Sender: TObject); forward;

procedure InitializeWizard();
begin
BitmapImage1 := TBitmapImage.Create(WizardForm);
with BitmapImage1 do
begin
Parent := WizardForm;
Left := ScaleX(24);
Top := ScaleY(320);
Width := ScaleX(105);
Height := ScaleY(33);
Cursor := crHand;
OnClick := @Bitmap1Click;
ExtractTemporaryFile('{#Bitmap}');
Bitmap.LoadFromFile(ExpandConstant('{tmp}\{#Bitmap}'));
end;
end;

procedure Bitmap1Click(Sender: TObject);
begin
ShellExec('open', 'http://forum.oszone.net/', '', '', SW_SHOWNORMAL, ewNoWait, EC);
end;



#define Bitmap "Logo.bmp"

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Files]
Source: {#Bitmap}; Flags: dontcopy solidbreak

[Code]
var
Panel1: TPanel;
BitmapImage1: TBitmapImage;
EC: Integer;

procedure Panel1Click(Sender: TObject); forward;

procedure InitializeWizard();
begin
Panel1 := TPanel.Create(WizardForm);
with Panel1 do
begin
Parent := WizardForm;
Left := ScaleX(16);
Top := ScaleY(318);
Width := ScaleX(185);
Height := ScaleY(41);
end;

BitmapImage1 := TBitmapImage.Create(WizardForm);
with BitmapImage1 do
begin
Parent := Panel1;
Left := ScaleX(4);
Top := ScaleY(4);
Width := ScaleX(178);
Height := ScaleY(34);
Cursor := crHand;
OnClick := @Panel1Click;
ExtractTemporaryFile('{#Bitmap}');
Bitmap.LoadFromFile(ExpandConstant('{tmp}\{#Bitmap}'));
end;
end;

procedure Panel1Click(Sender: TObject);
begin
ShellExec('open', 'http://forum.oszone.net/', '', '', SW_SHOWNORMAL, ewNoWait, EC);
end;

Код работает на обеих версиях.

Kashtan007
13-07-2014, 17:53
Доброго времени суток, наткнулся на такую проблему.
Как сделать эти 2 строки прозрачные?
http://rghost.ru/56872571/image.png
В редакторе форм они не отображаются... Пытался через код: ModCheck.Transparent := True;, выдает ошибку (Версия Unicode). Как можно по другому сделать эти 2 строки прозрачные? Заранее спасибо за ответ!

P.S. Dodakaedr, Nordek, Shift85, habib2302. Большое спасибо за помощь! Благодаря вам я наконец-то сделал практически все, что хотел в своем установщике)

Shift85
13-07-2014, 18:10
Как сделать эти 2 строки прозрачные? »

Пример.

SoftLabel:= TLabel.Create(WizardForm);
with SoftLabel do begin
Parent:=WizardForm;
SetBounds(ScaleX(280), ScaleY(316), ScaleX(450), ScaleY(17));
AutoSize:=False
WordWrap:=True
Transparent:=True
Font.Name:= 'Tahoma';
Font.Size:= 7;
Font.Color:= clGray;
Font.Style := [fsBold];
OnClick:= @SoftLabelClick;
Caption:= ExpandConstant('{cm:SoftTask}');
end;

Результат.

Kashtan007
13-07-2014, 18:15
Shift85, спасибо, но так и не получилось применить. Выдает ошибку.
Вот эти 2 строки, которые я хочу сделать прозрачными:
begin
ModCheck:= TNewCheckBox.Create(PageFromID(wpSelectDir));
ModCheck.Width := PageFromID(wpSelectDir).SurfaceWidth;
ModCheck.Parent := PageFromID(wpSelectDir).Surface;
ModCheck.Caption:='Удалить все старые моды';
ModCheck.left:=wizardForm.DirEdit.left;
ModCheck.Top:=wizardForm.DirEdit.top + ScaleY(30);

BackupCheck:= TNewCheckBox.Create(PageFromID(wpSelectDir));
BackupCheck.Width := PageFromID(wpSelectDir).SurfaceWidth;
BackupCheck.Parent := PageFromID(wpSelectDir).Surface;
BackupCheck.Caption:='Сохранить резервную копию старых модов';
BackupCheck.left:=wizardForm.DirEdit.left;
BackupCheck.Top:=ModCheck.top + ScaleY(30);
end;

habib2302
13-07-2014, 22:04
Kashtan007, а если так
begin
ModCheck:= TNewCheckBox.Create(PageFromID(wpSelectDir));
ModCheck.Width := PageFromID(wpSelectDir).SurfaceWidth;
ModCheck.Parent := PageFromID(wpSelectDir).Surface;
ModCheck.Caption:='Удалить все старые моды';
ModCheck.left:=wizardForm.DirEdit.left;
ModCheck.Top:=wizardForm.DirEdit.top + ScaleY(30);
ModCheck.Transparent:=True

BackupCheck:= TNewCheckBox.Create(PageFromID(wpSelectDir));
BackupCheck.Width := PageFromID(wpSelectDir).SurfaceWidth;
BackupCheck.Parent := PageFromID(wpSelectDir).Surface;
BackupCheck.Caption:='Сохранить резервную копию старых модов';
BackupCheck.left:=wizardForm.DirEdit.left;
BackupCheck.Top:=ModCheck.top + ScaleY(30);
BackupCheck.Transparent:=True
end;

Kashtan007
13-07-2014, 22:14
habib2302, пробовал уже так(
Ошибку выдает, хотя компилирую на юникоде
http://rghost.ru/56877006/image.png

Shift85
13-07-2014, 22:18
Ошибку выдает, хотя компилирую на юникоде »
Kashtan007, Попробуй на анси.

habib2302
13-07-2014, 22:18
Kashtan007, а если просто так
Transparent:=True
ну или юзать TransparentStatic
http://forum.oszone.net/post-2374802-1103.html

Kashtan007
13-07-2014, 22:34
Shift85, на анси та же ошибка.

Shift85
13-07-2014, 22:39
Kashtan007, Тогда попробуй переделать. Заменить чекбоксы на лейблы. Как у меня в примере выше.

Nordek
14-07-2014, 01:24
но теперь я не могу изменить цвет шрифта и размер. »
Как вариант:
#define Bitmap2 "SmallImage.bmp"

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Files]
Source: {#Bitmap2}; Flags: dontcopy solidbreak

[Code]
var
Panel1: TPanel;
BitmapImage1: TBitmapImage;
Label1: TLabel;
Label2: TLabel;

procedure InitializeWizard();
begin
WizardForm.MainPanel.Hide;

Panel1 := TPanel.Create(WizardForm);
with Panel1 do
begin
Parent := WizardForm.InnerPage;
Left := ScaleX(0);
Top := ScaleY(0);
Width := ScaleX(497);
Height := ScaleY(59);
end;

BitmapImage1 := TBitmapImage.Create(WizardForm);
with BitmapImage1 do
begin
Parent := Panel1;
Left := ScaleX(0);
Top := ScaleY(0);
Width := ScaleX(497);
Height := ScaleY(57);
ExtractTemporaryFile('{#Bitmap2}');
Bitmap.LoadFromFile(ExpandConstant('{tmp}\{#Bitmap2}'));
end;

Label1 := TLabel.Create(WizardForm);
with Label1 do
begin
Font.Color := clRed;
Font.Size := 12;
Font.Style := [fsBold];
Parent := Panel1;
Transparent := True;
Left := ScaleX(24);
Top := ScaleY(10);
Width := ScaleX(405);
Height := ScaleY(14);
end;

Label2 := TLabel.Create(WizardForm);
with Label2 do
begin
Font.Color := clBlue;
Font.Size := 12;
Parent := Panel1;
Transparent := True;
Left := ScaleX(40);
Top := ScaleY(26);
Width := ScaleX(389);
Height := ScaleY(29);
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
Label1.Caption:=WizardForm.PageNameLabel.Caption
Label2.Caption:=WizardForm.PageDescriptionLabel.Caption
end;

El Sanchez
14-07-2014, 12:33
похоже на то, что нужно »
Shkutu, шлак это, а не функция, как оказалось.
Для того, чтобы узнать, что вводимый путь был корректным, его можно сравнить с тем, что получается в результате функции и кладется во 2й параметр.»
Shkutu, сравнивать бестолку, например, допустимый путь С:\\\\\\test функция возвратит как C:\test.
для корректной работы функции, надо чтобы размер второй строки был больше длины изначальной. »
Shkutu, размер буфера в 260 для ANSI, 32767 для Unicode, лишнее потом отрезать.
Но, как я уже сказал, функция не годится, слишком корявый у нее принцип работы, тут нужно парсить путь с помощью регулярных выражений. У меня пока не получилось написать регулярку, учитывающую все варианты, а существующие решения далеки от идеала.

Shkutu
14-07-2014, 17:28
El Sanchez, видимо недостаток образования, но не знала, что С:\\\\\\test - это корректный путь. Думала, функция как раз убирает лишние слеши и точки/запятые. На недопустимые символы, типа *,<,> и т д там проверки нет. Впрочем в комментариях сказано, что среди Вин Апи функций вообще нет ни одной для валидации пути, вводимого пользователем. Так что видимо и правда из вариантов только свою делать.
написать регулярку, учитывающую все варианты »
Не уверена, что такое в принципе бывает. :) Там же многое зависит от системы и фиг знает чего еще.
лишнее потом отрезать »
А вот про это можно подробнее? Или банальный copy должен прокатить?

El Sanchez
14-07-2014, 19:55
А вот про это можно подробнее? Или банальный copy должен прокатить? »
Shkutu, имеется в виду, что буфер по максимуму в 260 символов, а PathSearchAndQualify заполнит его не весь (не все ж пути такие длинные), хвост нужно будет убирать. Буфер лучше всего создавать с помощью StringOfChar, хвост из нулевых символов убрать Trim-ом. Если бы PathSearchAndQualify работала по-человечески, то задачу можно было бы решить вот так:
#define A = (Defined UNICODE) ? "W" : "A"

function PathSearchAndQualify(pcszPath: String; pszFullyQualifiedPath: String; cchFullyQualifiedPath: UINT): BOOL; external 'PathSearchAndQualify{#A}@shlwapi.dll stdcall';

////////////////////////////////////////////////////////////////////////////////////////
function IsValidFileName(const FileName: String; var CorrectFileName: String): Boolean;
begin
CorrectFileName := StringOfChar(#0, 260);
Result := PathSearchAndQualify(FileName, CorrectFileName, Length(CorrectFileName));
CorrectFileName := Trim(CorrectFileName);
end;

/////////////////////////////
procedure InitializeWizard();
var
s: String;
begin
if IsValidFileName('C:\\\\\test', s) then
MsgBox(s, mbInformation, MB_OK);
end;

liked
15-07-2014, 00:24
Народ спасайте помогите прикрутить страницу компонентов к этому скрипту с выбором компонентов и отображение картинки и описание компонента

Скрипт - Ссылка (https://yadi.sk/d/IcZHXrQUWUaf9)

Скрипт (примера компонентов) - Ссылка (https://yadi.sk/d/LG2kIDa4WUaiz)

Скриншот примерно как должна выглядит страницы https://yadi.sk/i/l8EtFfw3WcADH


Заранее большое спасибо, мучаюсь очень долго не могу понять как правильно прописать вывод компонентов страницы

Shkutu
15-07-2014, 12:54
El Sanchez, пробовала тримить, хвост не убирается, ни если длину строки setlength'ом задавать, ни с помощью StringOfChar.
А вот еще вопрос. Можно как-то на страницу компонентов к этим самым компонентам хинты прикрутить?

El Sanchez
15-07-2014, 17:10
пробовала тримить, хвост не убирается »
Shkutu, все там убирается, не так что-то проверяете.
ни если длину строки setlength'ом задавать »
Shkutu, SetLength вообще не рекомендую для выделения буфера, ибо строка будет инициализирована в свободном участке памяти, полном всякого мусора.
Можно как-то на страницу компонентов к этим самым компонентам хинты прикрутить? »
Shkutu, для ComponentsList установить свойство ShowHint в True, в обработчике OnItemMouseMove свойству Hint уже задавать значения в зависимости от параметра Index обработчика.

Shkutu
15-07-2014, 17:57
все там убирается, не так что-то проверяете »
Ну например вот так:
function PathSearchAndQualify(pszPath, qPath: String; qPbuf:integer): BOOL;
external 'PathSearchAndQualifyA@Shlwapi.dll stdcall delayload';

procedure InitializeWizard;
var s:string;
i:integer;
begin
s:=StringOfChar(#0,256);
PathSearchAndQualify('d:\\sss', s, length(s));
MsgBox(inttostr(length(s)), mbInformation, MB_OK);
Trim(s);
MsgBox(inttostr(length(s)), mbInformation, MB_OK);
end;
Оба раза выдаст 260, можете проверить.
обработчике OnItemMouseMove »
Вот вообще не нашла такого обработчика :( Может, это в какой-то расширенной версии только есть? Или он есть и его просто в описании нет?

El Sanchez
15-07-2014, 19:53
Оба раза выдаст 260, можете проверить. »
Shkutu, вы же результат от Trim ничему не присваиваете. Должно быть s := Trim(s)
Вот вообще не нашла такого обработчика Может, это в какой-то расширенной версии только есть? »
Shkutu, да, в расширенной есть.

Nordek
16-07-2014, 22:10
habib2302,
[Registry]
Root: HKLM; SubKey: SOFTWARE\Classes\SystemFileAssociations\image; ValueType: string; ValueName: TitleInfo; ValueData: prop:Dimensions; Flags: uninsdeletevalue




© OSzone.net 2001-2012