Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

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

Аватара для El Sanchez

Ветеран


Contributor


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

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


Цитата Shkutu:
полный список инстансов вытащить из реестра можно при желании, но вот выбрать конкретный действительно не могу »
Shkutu, тогда вы пишете в реестр мусор.

Цитата Shkutu:
Деинсталлятор кладу в ту же папку, куда устанавливается экземпляр программы. »
Shkutu, вы все правильно сделали, это от вас я и хотел услышать. В каждой копии программы по деинсталлятору, удаляющего только саму копию и не трогая остальные. Только каждый из деинсталляторов должен быть готовым к удалению не только своей копии, но и родительской директории UCS, если он остался последним среди удаленных копий. Тоже самое и с реестром. Удаление файлов организовать через [UninstallDelete], удаление реестровых записей через [Registry] с нужными флагами:
читать дальше »

Код: Выделить весь код
[UninstallDelete]
Type: filesandordirs; Name: {app}\UCS\instances\{code:GetInstanceName}
Type: dirifempty; Name: {app}\UCS\instances
Type: dirifempty; Name: {app}\UCS

[Registry]
Root: HKLM; Subkey: SOFTWARE\UCS; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: SOFTWARE\UCS\instances; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: SOFTWARE\UCS\instances\{code:GetInstanceName}; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: SOFTWARE\UCS\instances\{code:GetInstanceName}; ValueType: string; ValueName: path; ValueData: {app}\UCS\{code:GetInstanceName}; Flags: uninsdeletevalue


Цитата Shkutu:
деинсталлятора никаких страниц нет. »
Формы инсталлятора и деинсталлятора похожи и обе имеют страничный компонент TNewNotebook, так что ничто не мешает для деинсталлятора добавить свои страницы, только строить их с нуля нужно, шаблоны-функции Create*Page - это не для деинсталлятора. Вот пример, создается пустая страница, кнопка Далее для перехода на следующую страницу (если выборочных страниц больше одной делать, то необходима еще кнопка Назад), стандартная страница с прогрессом должна быть последней:
читать дальше »

Код: Выделить весь код
//////////////////////////////////////////////////
procedure UninsNextButtonOnClick(Sender: TObject);
begin
    with UninstallProgressForm.InnerNotebook do
    begin
        ActivePage := Pages[ActivePage.PageIndex + 1];      // go to next page
        if ActivePage.PageIndex = PageCount-1 then          // on last page...
        begin
            TButton(Sender).Hide;                           // ...hide Next button...
            UninstallProgressForm.Close;                    // ...and close modal form
        end;
    end;
end;

////////////////////////////////////////////////////
procedure UninsCancelButtonOnClick(Sender: TObject);
begin
    UninstallProgressForm.ModalResult := mrAbort;
end;

////////////////////////////////////////////
procedure InitializeUninstallProgressForm();
var
    Page: TNewNotebookPage;
    UninsNextButton: TButton;
begin
    with UninstallProgressForm do
    begin
        // create Next button
        UninsNextButton := TButton.Create(UninstallProgressForm);
        with UninsNextButton do
        begin
            Parent := UninstallProgressForm;
            Top := UninstallProgressForm.CancelButton.Top;
            Width := UninstallProgressForm.CancelButton.Width;
            Height := UninstallProgressForm.CancelButton.Height;
            Left := UninstallProgressForm.CancelButton.Left - Width - ScaleX(10);
            Caption := SetupMessage(msgButtonNext);
            OnClick := @UninsNextButtonOnClick;
        end;

        // modify Cancel button
        CancelButton.Enabled := True;
        CancelButton.OnClick := @UninsCancelButtonOnClick;

        // create custom page
        Page := TNewNotebookPage.Create(UninstallProgressForm);
        with Page do
        begin
            Parent := UninstallProgressForm.InnerNotebook;
            Notebook := UninstallProgressForm.InnerNotebook;
            PageIndex := 0; // first page
        end;

        // set active (first) page
        InnerNotebook.ActivePage := InnerNotebook.Pages[0];

        // default page to last page
        InstallingPage.PageIndex := InnerNotebook.PageCount-1;

        // show form
        if ShowModal = mrAbort then Abort;
    end;
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:16, 05-09-2013 | #1092