zavul0n
Новичок
Добрый день. Прошу помощи в отладке скрипта.
Суть: Кастомный TFolderTreeView созданный через TTreeView, который будет считывать диски/папки при запуске инсталлятора. При клике на диск - считывать следующий уровень папок и так далее.
Пока получилось добиться работы только на USB с ничтожно малым кол-вом папок. При попытке открыть список папок на жестком - инсталлятор тупо зависает.
P.S. Познаний в Delphi - кот наплакал, но при компиляции в Delphi 6 - все работает исправно.
За основу брал вот это - http://decoding.dax.ru/practic/treeview/treeview.html
Суть: Кастомный TFolderTreeView созданный через TTreeView, который будет считывать диски/папки при запуске инсталлятора. При клике на диск - считывать следующий уровень папок и так далее.
Пока получилось добиться работы только на USB с ничтожно малым кол-вом папок. При попытке открыть список папок на жестком - инсталлятор тупо зависает.
Код:
; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!
#define MyAppName "My Program"
#define MyAppVersion "1.5"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "MyProg.exe"
[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
[_code]
#define A = (Defined UNICODE) ? "W" : "A"
const
DRIVE_REMOVABLE = 2;
DRIVE_FIXED = 3;
DRIVE_REMOTE = 4;
DRIVE_CDROM = 5;
var
TreeView1: TTreeView;
function GetDriveType(nDrive: string): Longint; external 'GetDriveType{#A}@kernel32.dll stdcall';
procedure NextLevel(ParentNode: TTreeNode);
var
sr, srChild: TFindRec;
node: TTreeNode;
path: string;
begin
node := ParentNode;
path := '';
repeat
path := node.Text + '\' + path;
node := node.Parent;
until node = nil;
// Находим первую директорию
if FindFirst( path + '*.*', sr ) then
begin
repeat
if ( sr.Name <> '.' ) and ( sr.Name <> '..' ) then
if ( sr.Attributes and FILE_ATTRIBUTE_DIRECTORY ) = FILE_ATTRIBUTE_DIRECTORY then
begin
// Добавляем найденную папку в TreeView
node := TreeView1.Items.AddChild( ParentNode, sr.Name );
node.ImageIndex := 0;
node.SelectedIndex := 1;
// Утверждаем, что нет подкаталогов
node.HasChildren := false;
// Проверяем, так ли это
if FindFirst( path + sr.Name + '\*.*', srChild ) then
begin
repeat
if ( srChild.Name <> '.' ) and ( srChild.Name <> '..' ) then
if ( srChild.Attributes and FILE_ATTRIBUTE_DIRECTORY ) = FILE_ATTRIBUTE_DIRECTORY then
node.HasChildren := true;
until FindNext(srChild) = False or node.HasChildren;
end;
FindClose( srChild );
end;
until FindNext( sr ) = false;
end
else
ParentNode.HasChildren := false;
FindClose( sr );
end;
procedure TreeView1Expanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
begin
TreeView1.Items.BeginUpdate;
node.DeleteChildren;
NextLevel( node );
TreeView1.Items.EndUpdate;
end;
procedure InitializeWizard;
var
node: TTreeNode;
DriveType: integer;
i: integer;
begin
TreeView1 := TTreeView.Create(WizardForm);
with TreeView1 do
begin
Parent := WizardForm.WelcomePage;
Left := ScaleX(176);
Top := ScaleY(168);
Width := ScaleX(321);
Height := ScaleY(146);
Indent := 19;
OnExpanding:=@TreeView1Expanding;
end;
TreeView1.Items.BeginUpdate;
for i := 0 to 25 do
begin
DriveType := GetDriveType( PAnsiChar( Chr( i + 65 ) + ':\' ) );
if DriveType = 1 then continue;
node := TreeView1.Items.AddChild( nil, Chr( i+65 ) + ':' );
node.SelectedIndex := node.ImageIndex;
node.HasChildren := true;
end;
// Обновляем TreeView
TreeView1.Items.EndUpdate;
end;
За основу брал вот это - http://decoding.dax.ru/practic/treeview/treeview.html