Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


elmariacci, Ну всё, запилил тебе уберпатчер,для разных папок:
краткое описание работы (а то много буков печатать):
AskForPath( OnlyWithFolder('audio', OnlyVersionFolders( SearchForFolders( AddBackslash(RemoveBackslash( WizardDirValue() )) + 'res_mods') ) ) );
сначала SearchForFolders ищет папки в пути установки + 'res_mods' и возвращает массив путей
он сразу же передаётся в OnlyVersionFolders которая фильтрует пути по последним папкам чтоб они были вериями-номерными и возвращает возможно другой или тот же массив
полученный массив передаётся в OnlyWithFolder, которая ищет на уровне дальше папку "audio" и возвращает новый массив записей
и только теперь полученный массив мы выводим в виде комбобокса на форме и спрашиваем куда именно ставить аудио!

читать дальше »
Код: Выделить весь код

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
InfoBeforeFile=compiler:Default.isl


[Components]
Name: "zvuk"; Description: "Звуки(перед установкой скопируйте папку audio в res_mods\XX.XX.XX\)"
Name: "zvuk\audio"; Description: "Звонок крита";
Name: "zvuk\zasvet"; Description: "Озвучка лампочки";


[Files]
; zvuk Files
Source: {fonts}\*; DestDir: {code:GetInstallPath}\audio; Flags: external; Components: zvuk; Check: CheckInstallPath();


[Dirs]
; for Test
Name: "{app}\res_mods\0.8.5\audio"
Name: "{app}\res_mods\0.8.6\audio"

; DUMMY:
Name: "{app}\res_mods\0.8.7"
Name: "{app}\res_mods\hl2"
Name: "{app}\res_mods\Valve"

                                      
[  code]
var
    InstallPath: String;
    

function GetInstallPath(const Dummy: String): String;
begin
    if ForceDirectories(InstallPath) then Result := RemoveBackslash(InstallPath);
end;

function CheckInstallPath(): Boolean;
begin
    Result := InstallPath <> '';
end;

///////////////////////////

function SearchForFolders(const RootFolder: String): array of String;  // получить имена всех папок в папке (без рекурсии)
var
    NewSearchPath: String;
    FindRec: TFindRec;
    Len: Integer;
begin
    NewSearchPath := AddBackslash(RemoveBackslash(RootFolder));
    if FindFirst(NewSearchPath + '*.*', FindRec) then
    try
        repeat
            if (FindRec.Name <> '.') and (FindRec.Name <> '..') then if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY then
            begin
                Len := GetArrayLength(Result);
                SetArrayLength(Result, Len+1);
                Result[Len] := NewSearchPath + FindRec.Name;
            end;
        until not FindNext(FindRec);
    finally
        FindClose(FindRec);
    end;
end;


function OnlyVersion(const iStr: String): String; /// оставлять только цифры
var
    i: Integer;
begin
    Result := '';
    if Length(iStr) > 0 then for i := 1 to Length(iStr) do
    case iStr[i] of
        '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': Result := Result + iStr[i];
    end;
end;


function OnlyWithFolder(const FolderName: String ;const Path: array of String): array of String; // оставлять только пути с именем искомой папки
var
    i, Len: Integer;
begin
    for i := 0 to GetArrayLength(Path)-1 do if DirExists(AddBackslash(RemoveBackslash(Path[i])) + FolderName) then
    begin
        Len := GetArrayLength(Result);
        SetArrayLength(Result, Len+1);
        Result[Len] := Path[i];
    end;
end;



function OnlyVersionFolders(const Path: array of String): array of String; // оставлять папки только с цифрами,
var
    i, Len: Integer;
begin
    for i := 0 to GetArrayLength(Path)-1 do if Length( OnlyVersion(ExtractFileName(Path[i])) ) = 5 then
    begin
        Len := GetArrayLength(Result);
        SetArrayLength(Result, Len+1);
        Result[Len] := Path[i];
    end;
end;


function GetNormalTextLen(const Text: String): Integer;
begin
    with TLabel.Create(nil) do
    try
        Caption := Text;
        Result := Width;
    finally
        Free;
    end;
end;


function AskForPath(const Path: array of String): String;
var
    AskForm: TForm;
    PathCombo: TNewComboBox;
    Len, i: Integer;
begin
    Len := GetArrayLength(Path);
    if Len = 0 then Exit;
    
    AskForm := TForm.Create(nil);
    with AskForm do

    begin
        Caption := 'Какую папку патчить?';
        Position := poScreenCenter;
        
        PathCombo := TNewComboBox.Create(AskForm);
        with PathCombo do
        begin
            Parent := AskForm;
            SetBounds(ScaleX(7), ScaleY(7), ScaleX(GetNormalTextLen(Path[0]) + 25), ScaleY(23));
            Style := csDropDownList;
            for i := 0 to Len-1 do Items.Add(Path[i]);
            ItemIndex := 0;
        end;
        
        ClientWidth := ScaleX(PathCombo.Width + 16);
        ClientHeight := ScaleY(77);
        
        with TButton.Create(AskForm) do
        begin
            Parent := AskForm;
            Left := ScaleX(7);
            Top := ScaleY(PathCombo.Top + PathCombo.Height + 16);
            Caption := SetupMessage(msgButtonOK);
            ModalResult := mrOk;
        end;
        with TButton.Create(AskForm) do
        begin
            Parent := AskForm;
            Left := ScaleX(90);
            Top := ScaleY(PathCombo.Top + PathCombo.Height + 16);
            Caption := SetupMessage(msgButtonCancel);
            ModalResult := mrCancel;
        end;
    
        if ShowModal = mrOk then Result := PathCombo.Text;
    end;
end;


function NextButtonClick(CurPageID: Integer): Boolean;
var
    UnefInstallPath: String;
begin
    if CurPageID = wpSelectComponents then
    begin
        if IsComponentSelected('zvuk') then
        begin
            UnefInstallPath := AskForPath( OnlyWithFolder('audio', OnlyVersionFolders( SearchForFolders( AddBackslash(RemoveBackslash( WizardDirValue() )) + 'res_mods') ) ) );
            Result := UnefInstallPath <> '';
            if not Result then MsgBox('No', mbError, MB_OK) else InstallPath := UnefInstallPath;
        end else Result := True;
    end else Result := True;
end;


PS: чтоб пример работал первый раз установи без компонентов

==============================================================================================

neorom,
вот обновлённая процедура:
читать дальше »
Код: Выделить весь код
procedure BetterInfo();
var
    Buff: String;
begin
    Buff := ExpandConstant(CurrentFilename);
    StringChange(Buff, AppPath, '');
    fLabel.Caption := '{#SetupSetting("AppName")}' + Buff;
end;

Последний раз редактировалось Johny777, 20-04-2013 в 15:24.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:12, 20-04-2013 | #261