Вопрос Описание компонентов

Ekspoint

Новичок
А можно вместо номера компонента в AddDescription сделать его название?
Код:
type
  TComponentDesc= record Description:String;Index:Integer;end;var
  Descs: array of TComponentDesc;
  Info:TNewStaticText;
  InfoCaption:TNewStaticText;
  InfoPanel:TPanel;
  Indx:Integer;
procedure ShowDescription(Sender:TObject; X, Y,Index:Integer;Area:TItemArea);var i:Integer;begin
  Indx:=-1;
  for i:=0 to GetArrayLength(Descs)-1dobegin
  if(Descs[i].Index=Index)thenbeginIndx:=i;Breakend;end;
  if(Indx>=0)and(Area=iaItem)thenInfo.Caption:=Descs[Indx].DescriptionelseInfo.Caption:=ExpandConstant('{cm:ComponentsInfoPanel2}');end;
procedure AddDescription(AIndex:Integer;ADescription:String);var i, k:Integer;begin
i:=GetArrayLength(Descs);SetArrayLength(Descs, i+1);Descs[i].Description:=ADescription;Descs[i].Index:=AIndex-1end;
procedure InitializeWizard();begin
  WizardForm.TypesCombo.Visible:=False;
  WizardForm.ComponentsList.Height:=ScaleY(181)-WizardForm.TypesCombo.Top;
  WizardForm.ComponentsList.Top:=WizardForm.TypesCombo.Top;
  WizardForm.ComponentsList.Width:=ScaleX(417);
  WizardForm.ComponentsList.OnItemMouseMove:=@ShowDescription
  InfoPanel:=TPanel.Create(WizardForm);
  InfoPanel.Parent:=WizardForm.SelectComponentsPage;
  InfoPanel.Caption:='';
  InfoPanel.Top:=ScaleY(190);
  InfoPanel.Left:=ScaleX(0);
  InfoPanel.Width:=ScaleX(417);
  InfoPanel.Height:=ScaleY(40);
  InfoPanel.BevelInner:= bvRaised;
  InfoPanel.BevelOuter:= bvLowered;
  InfoCaption:=TNewStaticText.Create(WizardForm);
  InfoCaption.Parent:=WizardForm.SelectComponentsPage;
  InfoCaption.Caption:=ExpandConstant('{cm:ComponentsInfoPanel1}');
  InfoCaption.Left:=ScaleX(7);
  InfoCaption.Top:=InfoPanel.Top-ScaleY(6);
  InfoCaption.Font.Color:= clActiveCaption;
  Info:=TNewStaticText.Create(WizardForm);
  Info.Parent:=InfoPanel;
  Info.AutoSize:=False;
  Info.Left:=ScaleX(6);
  Info.Width:=ScaleX(403);
  Info.Top:=ScaleY(12);
  Info.Height:=ScaleY(24);
  Info.Caption:=ExpandConstant('{cm:ComponentsInfoPanel2}');
  Info.WordWrap:=true;
  AddDescription(1,'Справка');//первый параметр - это номер компонента, идет последовательно от начала записи компонентов
  AddDescription(2,'Английская справка');//Второй параметр - это собственно описание компонента
  AddDescription(3,'Русская справка');
  AddDescription(4,'Плагины');
  AddDescription(5,'Внутреннего просмотра');
  AddDescription(6,'Архиваторные');
  AddDescription(13,'Системные');
  AddDescription(8,'CanonCam');
  AddDescription(9,'PluginManager');
  AddDescription(10,'Registry');
  AddDescription(11,'Services');
  AddDescription(12,'StartupGuard');
  AddDescription(7,'Другие');
end;
 

Shegorat

Lord of Madness
Администратор
Ekspoint
Если под названием компонента подразумевается его идентификатор типа
Код:
Name: "software\directx";
То нет, т.к. инно хотя и хранит эти значения, но в секции code они недоступны.
Если же подразумевается его описание типа
Код:
Description: "Microsoft DirectX";
То его использовать можно, но тогда будут проблемы с одноименными компонентами.
 

Ekspoint

Новичок
жалко,а есть какой нибудь код похожий
что бы не было номера компонента
 

Shegorat

Lord of Madness
Администратор
Нет, только сразу для группы компонентов. Но ненужные компоненты можно просто пропускать, задав пустое значение между разделителями.
 

Ekspoint

Новичок
Нет, только сразу для группы компонентов. Но ненужные компоненты можно просто пропускать, задав пустое значение между разделителями.
вот так?
Код:
function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';
function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';

var
  Info: TNewStaticText;
  InfoCaption: TNewStaticText;
  InfoPanel: TPanel;

procedure DeinitializeSetup();
begin
  disabledesc();
end;

procedure InitializeWizard();
begin
  WizardForm.TypesCombo.Visible:=False;
  WizardForm.ComponentsList.Height := ScaleY(181) - WizardForm.TypesCombo.Top;
  WizardForm.ComponentsList.Top := WizardForm.TypesCombo.Top;
  WizardForm.ComponentsList.Width := ScaleX(417);

  InfoPanel := TPanel.Create(WizardForm);
  InfoPanel.Parent := WizardForm.SelectComponentsPage;
  InfoPanel.Caption := '';
  InfoPanel.Top := ScaleY(190);
  InfoPanel.Left := ScaleX(0);
  InfoPanel.Width := ScaleX(417);
  InfoPanel.Height := ScaleY(40);
  InfoPanel.BevelInner := bvRaised;
  InfoPanel.BevelOuter := bvLowered;
  InfoCaption := TNewStaticText.Create(WizardForm);
  InfoCaption.Parent := WizardForm.SelectComponentsPage;
  InfoCaption.Caption := ExpandConstant('{cm:ComponentsInfoPanel1}');
  InfoCaption.Left := ScaleX(7);
  InfoCaption.Top := InfoPanel.Top - ScaleY(6);
  InfoCaption.Font.Color := clActiveCaption;

  Info := TNewStaticText.Create(WizardForm);
  Info.Parent := InfoPanel;
  Info.AutoSize := False;
  Info.Left := ScaleX(6);
  Info.Width := ScaleX(403);
  Info.Top := ScaleY(12);
  Info.Height := ScaleY(24);
  Info.Caption := ExpandConstant('{cm:ComponentsInfoPanel2}');
  Info.WordWrap := true;

  enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
       ExpandConstant('{cm:ComponentsDescription1}; ;{cm:ComponentsDescription3};{cm:ComponentsDescription4};')
       );
end;
[/SPOILER]
 

Chopser

Новичок
В Inno Setup FAQ показан пример скрипта "Описание компонентов" через библиотеку descctrl.dll, но там только для секции [Components]. А можно сделать такое же, только для чекбоксов и радиокнопок прописанных в коде без использования секции [Components]? Картинки не нужны, только панель с текстовым описанием при наведении мыши. Заранее премного благодарен.

И еще вопросик: можно ли сделать аналог кнопки "Завершить", чтоб вставить ее на кастомную страницу, не используя пропуск страниц?
 

Косой

Новичок
Chopser, как пример с чекбоксом:
[Code*]
var
NewCheckBox1: TNewCheckBox;
Label2: TLabel;

procedure ShowHint(Sender: TObject);
begin
Label2.show;
end;

procedure hideHint(Sender: TObject);
begin
Label2.hide;
end;

procedure InitializeWizard();
begin
NewCheckBox1 := TNewCheckBox.Create(WizardForm);
with NewCheckBox1 do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(176);
Top := ScaleY(188);
Width := ScaleX(97);
Height := ScaleY(17);
Caption := 'NewCheckBox1';
OnMouseEnter:= @ShowHint;
OnMouseLeave:= @hideHint;
end;

Label2 := TLabel.Create(WizardForm);
with Label2 do
begin
Parent := WizardForm.SelectDirPage;
Transparent := False;
Left := ScaleX(208);
Top := ScaleY(142);
Width := ScaleX(20);
Height := ScaleY(39);
Caption := 'бла' + #13#10 +'бла' + #13#10 +'бла';
end;
Label2.hide;
end;
 

Chopser

Новичок
Что то вместо "бла-бла-бла" показывает вопросительные знаки... Для стандартного Inno нет кода случайно? Стандартный пишет что: OnMouseEnter:= @ShowHint; - неизвестный идентификатор, на Расширенном работает, но кажет вопросительные знаки в описании компонента.
 

Nemko

Дилетант
Модератор
Chopser, попробуйте задействовать текст через секцию CustomMessages (как в примере Exp) и компилировать в Unicode версии Inno (расширенной).

Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={sd}\My Application

[CustomMessages]
Text1=бла%nбла%nбла

[Code]
var
  NewCheckBox1: TNewCheckBox;
  Label2: TLabel;

procedure ShowHint(Sender: TObject);
begin
  Label2.Show;
end;

procedure HideHint(Sender: TObject);
begin
  Label2.Hide;
end;

procedure InitializeWizard;
begin
NewCheckBox1:=TNewCheckBox.Create(WizardForm);
with NewCheckBox1 do begin
  SetBounds(ScaleX(176), ScaleY(188), ScaleX(97), ScaleY(17));
  Caption:='NewCheckBox1';
  Parent:=WizardForm.SelectDirPage;
  OnMouseEnter:=@ShowHint;
  OnMouseLeave:=@HideHint;
end;

Label2:=TLabel.Create(WizardForm);
with Label2 do begin
  Transparent:=False;
  SetBounds(ScaleX(208), ScaleY(142), ScaleX(20), ScaleY(39));
  Caption:=CustomMessage('Text1');
  Parent:=WizardForm.SelectDirPage;
  Hide;
 end;
end;
 
Последнее редактирование:

Chopser

Новичок
Разобрался уже с вопросительными знаками. :) В стандартном Inno сначала открыл скрипт, нормально отображалось, а в расширенном не обратил внимания, потом посмотрел расширенный и в скрипте кажет ???????, прописал в скрипте в расширенном Inno бла-бла- по русски и стало нормально отображаться в скомпилированном инсталляторе. В расширенном Inno ANSI-версии все нормально работает, и в первом и во втором варианте, просто бла-бла было прописано в первом примере в Юникодной кодировке.
Спасибо всем за помощь.

Nemko, а вот по этому вопросу не можете подсказать - можно ли сделать аналог кнопки "Завершить", чтоб вставить ее на кастомную страницу, не используя пропуск страниц?

Просто делаю конфигуратор для программы, одна единственная страница с чекбоксами, радиокнопками, кнопками "ОК" и "Сброс", пишет данные в INI-файл. Вот как бы кнопку "ОК" сделать чтоб работала как кнопка "Завершить", то есть при нажатии чтоб применялись выставленные опции, затем закрытие окна. Ну вобщем как принажатии на кнопку "Завершить" только не использовать пропуск страниц.
 
Последнее редактирование:

Косой

Новичок
Chopser, как вариант, вешай тогда все нужные тебе действия на клик кнопки "OK", типа
procedure OKButtonClick(Sender: TObject);
begin
нужные действия
form.Close; - закрытие формы
end;
 

nik1967

Old Men
Проверенный
а вот по этому вопросу не можете подсказать - можно ли сделать аналог кнопки "Завершить", чтоб вставить ее на кастомную страницу, не используя пропуск страниц?
Код:
[Setup]
AppName=Language Settings
AppVersion=1.0.0.3
DefaultDirName={src}\
OutputDir=.
UsePreviousAppDir=no
UsePreviousGroup=no
UsePreviousLanguage=no
UsePreviousTasks=no
UsePreviousUserInfo=no
UsePreviousSetupType=no
ShowComponentSizes=false
DirExistsWarning=no
Uninstallable=no
OutputBaseFilename=language_setup
ShowLanguageDialog=auto
DisableDirPage=yes
DisableProgramGroupPage=yes
DisableReadyPage=yes
DisableFinishedPage=yes
VersionInfoVersion=1.0.0.3
VersionInfoCopyright=nik1967
Compression=lzma2/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes
LZMAUseSeparateProcess=yes
LZMADictionarySize=262144

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
Name: eng; MessagesFile: compiler:Default.isl

[Code]
procedure InitializeWizard();                                                 
begin
   with WizardForm do begin
       OuterNotebook.Hide; 
       InnerNotebook.Hide;
       Color:= WizardForm.Color;
       BorderIcons:= [biSystemMenu];
       NextButton.Left:= CancelButton.Left;
       CancelButton.SetBounds(ScaleX(0),ScaleY(0),ScaleX(0),ScaleY(0));
       BackButton.SetBounds(ScaleX(0),ScaleY(0),ScaleX(0),ScaleY(0));
       Center;
   end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:= false;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  WizardForm.NextButton.Caption:= 'Завершить';
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
   case CurStep of
     ssPostInstall: begin
       SaveStringToFile(ExpandConstant('{src}\example.txt'), 'Записываем действие по кнопке Завершить', false); // Здесь пишем нужные действия
     end;
   end;
end;
 
Сверху