YurCompMan2 Цитата: при перемещении курсора над компонентом подсказка обновляется много раз; а также подсказка не исчезает после перемещения курсора вправо или влево, что загораживает список компонентов.
Я дал только пример для OnItemMouseMove. Всё остальное для твоего скрипта делай сам. Например [more=вот так]
; только для расширенной сборки Inno Setup by ResTools
[Setup]
AppName=Components Descriptions
AppVerName=Components Descriptions
CreateAppDir=false
[Languages]
Name: ru; MessagesFile: compiler:Languages\Russian.isl
[Types]
Name: tweak; Description: Оптимальный выбор
Name: full; Description: Выбрать все компоненты
Name: deselect; Description: Сбросить все компоненты
Name: custom; Description: Пользовательский режим; Flags: iscustom
[Components]
Name: Safe; Description: Параметры безопасности; Types: deselect
Name: Safe\wscsvc; Description: Отключить 'Центр обеспечения безопасности'; Types: full tweak
Name: Safe\Signing; Description: Разрешить установку неподписанных драйверов; Types: full
Name: WB; Description: 'Мой компьютер' - Настройки; Types: deselect
Name: WB\Computer; Description: Добавить ярлыки - Корзина, Сетевые подключения; Types: full tweak
Name: WB\Low; Description: Уведомление о недостатке свободного места на диске
Name: WB\Low\1; Description: Изменить порог срабатывания с 10 % до 1%; Flags: exclusive; Types: tweak
Name: WB\Low\No; Description: Не предупреждать о переполнении дисков; Flags: exclusive; Types: full
Name: IE; Description: Настройки обозревателя Internet Explorer; Types: deselect
Name: IE\Cache; Description: Временные файлы Internet - использовать сжатие; Types: full tweak
Name: User; Description: Параметры входа в систему
Name: User\Logon; Description: Пользователи - использовать страницу приветствия; Flags: exclusive; Types: full
Name: User\Logon2K; Description: Классический вид - выводить запрос имени и пароля; Flags: exclusive; Types: tweak
Name: User\Autologon; Description: Задействовать автоматический вход в систему; Types: full tweak
Name: User\Sound; Description: Не сопровождать звуком загрузку и завершение работы; Types: full
Name: User\English; Description: Английский язык ввода по умолчанию для всех; Types: full
Name: Sys; Description: Настройки системы и оборудования; Types: deselect
Name: Sys\Memory; Description: Память - оптимизировать работу ядра Windows
Name: Sys\Memory\1024; Description: 1024Мб физической памяти на этом компьютере; Flags: exclusive
Name: Sys\Timeout; Description: Разрешить быстрое завершение работы; Types: full tweak
[Code]
var HintLock: Boolean; Point: TPoint; CompDesc: TEdit; MessageForm: TForm; MessagePanel: TPanel; MessageLabel: TLabel; n, frame: integer; CompUpKey: Boolean; Descriptions: String; CompHints: array of String;
procedure GetCursorPos(var Point: TPoint); external 'GetCursorPos@user32 stdcall delayload';
function SetWindowPos(hWnd, hWndInsertAfter, X, Y, cx, cy, wFlags: Longint):Boolean; external 'SetWindowPos@user32.dll stdcall';
function ExtractIcon(hInst: LongInt; lpszExeFileName: PChar; nIconIndex: LongInt): LongInt; external 'ExtractIconA@shell32 stdcall delayload';
function DrawIconEx(hdc, x, y, hIcon, cx, cy, AniCur, Draw, Flags: Longint): Longint; external 'DrawIconEx@user32 stdcall delayload';
function GetModuleHandle(lpModuleName: LongInt): LongInt; external 'GetModuleHandleA@kernel32 stdcall delayload';
Procedure DrawIcon(Form: TWinControl; File: String; nIcon, Left, Top, Size, BColor: Integer); var Panel: TPanel; Rect: TRect; Begin
Panel:= TPanel.Create(Form); Panel.SetBounds(Left, Top, Size, Size); Panel.Parent:= Form
with TBitmapImage.Create(Panel) do begin Parent:= Panel; with Bitmap do begin
Width:= Size; Height:= Size; Rect.Right:= Size; Rect.Bottom:= Size; Canvas.Brush.Color:= BColor; Canvas.FillRect(Rect);
DrawIconEx(Canvas.Handle, 0,0, ExtractIcon(GetModuleHandle(0), ExpandConstant(File), nIcon), Size, Size,0,0,3); end; end;
End;
Function StringToArray(Text, Cut: String): array of String; var t, i, k: Integer; Begin { создать массив из текста}
SetArrayLength(Result, 0);
Repeat SetArrayLength(Result, GetArrayLength(Result) + 1); t:= 1; k:= Pos(Cut, Text);
if k > 0 then t:= Length(Cut) else k:= Pos(#10, Text); i:= GetArrayLength(Result) - 1;
if k > 0 then begin Result[i]:= Copy(Text, 1, k - 1); Text:= Copy(Text, k + t, Length(Text)) end else begin Result[i]:= Text; SetLength(Text, 0) end;
Until Length(Text) = 0;
End;
Procedure ResizeLabel(Obj: TLabel; Text: String; MaxWidth: Integer); var k, w, h: integer; Begin { размер формы подгоняется под текст}
Obj.AutoSize:= true; Obj.WordWrap:= false; Obj.Caption:= Text; { авторазмер}
w:= Obj.Width; h:= Obj.Height; n:= (w + frame*2)/MaxWidth + 1
Repeat
Obj.Width:= w/n + frame*2*n + k
Obj.Height:= h * n
Obj.WordWrap:= true; k:= k + 4
Until Obj.Height/h = n
End;
Procedure ShowHint(String: string; AIndex: Integer; XCenter, YCenter: Bool); Begin { размер формы подгоняется под текст, если AIndex = 0, значок не рисуется}
HintLock:= true; frame:= 10; if AIndex <> 0 then String:= ' '+ String;
GetCursorPos(Point); MessageLabel.Left:= frame; MessageLabel.Top:= frame
ResizeLabel(MessageLabel, String, WizardForm.ClientWidth)
if XCenter then Point.X:= WizardForm.Left + WizardForm.Width/2 - (MessageLabel.Width + frame*2 -2)/2 else Point.X:= Point.X + 12;
if YCenter then Point.Y:= WizardForm.Top + WizardForm.BeveledLabel.Top else Point.Y:= Point.Y + 12;
MessageForm.SetBounds(Point.X, Point.Y, MessageLabel.Width + frame*2 -2, MessageLabel.Height + frame*2 -2)
if AIndex <> 0 then DrawIcon(MessageForm, '{sys}\shell32.dll', AIndex, 9, 8, 16, MessagePanel.Color);
MessageForm.Show; SetWindowPos(MessageForm.Handle, -1, 0, 0, 0, 0, 3);
End;
Procedure CompKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); Begin
CompUpKey:= true
n:= WizardForm.ComponentsList.ItemIndex
if n >= 0 then ShowHint(CompHints[n], -1001, true, true) else MessageForm.Hide;
End;
Procedure CompMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
Begin
if (Index < 0) or (Index + 1 > GetArrayLength(CompHints)) then CompDesc.Text:= '' else CompDesc.Text:= CompHints[Index]
End;
Procedure ObjectOnClick2(Sender: TObject);
Begin
MessageForm.Hide;
End;
Procedure ObjectOnClick(Sender: TObject);
Begin
Case TObject(Sender) of { событие объекта}
CompDesc:
if CompDesc.Text > '' then
if CompUpKey then CompUpKey:= false else ShowHint(CompDesc.Text, -1001, false, false)
else MessageForm.Hide;
// MessageForm: WizardForm.BringToFront;
end;
End;
Procedure CurPageChanged(CurPageID: Integer);
Begin
if CurPageID <> wpSelectComponents then MessageForm.Hide;
End;
Procedure InitializeWizard;
Begin
CompDesc:= TEdit.Create(WizardForm)
CompDesc.Parent:= WizardForm
CompDesc.Visible:= false
CompDesc.OnChange:= @ObjectOnClick
MessageForm:= CreateCustomForm;
MessageForm.BorderStyle:= bsNone
MessageForm.OnActivate:= @ObjectOnClick
MessagePanel:= TPanel.Create(MessageForm)
MessagePanel.BevelInner:= bvLowered;
MessagePanel.Align:= alClient;
MessagePanel.Color:= $E1FFFF;
MessagePanel.Parent:= MessageForm
MessageLabel:= TLabel.Create(MessagePanel)
MessageLabel.Font.Name:= 'Arial'
MessageLabel.Font.Size:= WizardForm.Font.Size + 1
MessageLabel.Parent:= MessagePanel
MessageLabel.OnClick:= @ObjectOnClick2
WizardForm.ComponentsList.OnKeyUp:= @CompKeyUp
Descriptions:=
'Демонстрационный режим. Действия по изменению настроек системы или параметров безопасности не выполняются. Компоненты и их описания даны только для примера. Описания отделяются друг от друга точкой с запятой и должны содержать не более 255 символов.;' +
'Отключить «Центр обеспечения безопасности» (рекомендуется отключить эту практически бесполезную службу);' +
'Разрешить установку неподписанных драйверов (упрощает настройку компьютера сразу после установки системы);' +
'«Мой компьютер» - Секция настроек, влияющих на работу компьютера;' +
'ярлыки Корзина и Сетевые подключения будут созданы в папке «Мой компьютер»;' +
'Изменить порог срабатывание уведомления о недостатке свободного места на диске;' +
'Изменить порог срабатывания с 10 % (значение по-умолчанию) до 1% (необходимо для дисков большой ёмкости);' +
'Выдача всплывающей подсказки о переполнении дисков будет отключена;' +
'Общие настройки обозревателя Internet Explorer;' +
'Папка временных файлов Internet Explorer будет сжата средствами файловой системы NTFS;' +
'Параметры входа в систему;' +
'Пользователи - использовать страницу приветствия (новый экран загрузки, появившийся в Windows XP);' +
'Классический вид - выводить запрос имени и пароля (экран загрузки, использующийся в Windows 2000);' +
'Задействовать автоматический вход в систему для текущего пользователя без запроса имени и пароля;' +
'Не сопровождать звуком загрузку и завершение работы (немного ускоряет загрузку «Рабочего стола»);' +
'Английский язык ввода по умолчанию для всех (для новых пользователей);' +
'Настройка системы на имеющийся объём оперативной памяти и процессорного кэша, оптимизация файловой подсистемы;' +
'После установке данной опции уменьшать объём оперативной памяти НЕЖЕЛАТЕЛЬНО;' +
'Вычисленный объём установленной физической памяти на этом компьютере;' +
'Разрешить быстрое завершение работы (сетевые соединения могут быть разорваны преждевременно)';
CompHints:= StringToArray(Descriptions,';')
WizardForm.ComponentsList.OnItemMouseMove:= @CompMouseMove;
End;
[/more].
Чтобы хинт исчезал, создай на WizardForm прозрачный TLabel и при наведении на него скрывай форму.