2011-09-14 21 views
5

मुझे उपयोगकर्ता को इंस्टॉल के दौरान पासवर्ड के लिए पूछने की आवश्यकता है, जिसे तब इंस्टॉलेशन के बाद चलाए जाने वाले कमांड के हिस्से के रूप में उपयोग किया जाता है। मैं ऐसा करने के लिए एक कस्टम पेज का उपयोग कर रहा हूं और यह ठीक काम करता है।कस्टम अनइंस्टॉल पेज (MsgBox नहीं)

मुझे एक ही अनइंस्टॉल के दौरान एक ही प्रश्न पूछने की आवश्यकता है, जिसे एक कमांड के हिस्से के रूप में उपयोग किया जाता है जो अनइंस्टॉल करने के बाद चलता है।

मैंने सहायता की जांच की है और अनइंस्टॉल के लिए एक पृष्ठ आईडी प्रतीत नहीं होता है, जिसका उपयोग मैं अपने CreateInputQuery फ़ंक्शन में कर सकता हूं। मुझे विशेष रूप से दिमाग नहीं है, अगर पृष्ठ को प्रदर्शित होने तक, अनइंस्टॉल करने के मध्य या अंत में प्रदर्शित किया जाता है, जब तक यह प्रदर्शित होता है।

मैं अनइंस्टॉल करने के लिए MsgBox का उपयोग नहीं करना चाहता क्योंकि मैं एक मानक पृष्ठ के स्वरूप और अनुभव चाहता हूं।

कोई सुझाव यह है कि मैं इसे कैसे प्राप्त कर सकता हूं?

+0

संबंधित: [स्थापना रद्द करें पर जादूगर पेज - jrsoftware.innosetup Newsgr oups] (http://news.jrsoftware.org/read/article.php?id=97991&group=jrsoftware.innosetup#97991) – hakre

उत्तर

2

इनो वर्तमान में अनइंस्टॉल करते समय विज़ार्ड पृष्ठों का समर्थन नहीं करता है। आपको इसके बजाय फॉर्म का उपयोग करने की आवश्यकता होगी।

+0

मुझे लगता है कि मैं भी एक ही निष्कर्ष पर आया हूं। सबसे बड़ी समस्या यह है कि सभी पेजआईडी स्थापित करने की दिशा में तैयार हैं और अनइंस्टॉल नहीं करते हैं। – eyoopmeduck

+0

यह सबसे बड़ी समस्या नहीं है क्योंकि अनइंस्टॉल में सेटअप के समान वही विज़ार्ड मॉडल नहीं है। – Deanna

+0

आप वास्तव में अनइंस्टॉल फॉर्म में पृष्ठों को लागू कर सकते हैं। मेरा उत्तर देखें: https://stackoverflow.com/q/7415457/850848#42550055 –

2

मैं इनोसेटअप 5.4.2 का उपयोग कर रहा हूं और दस्तावेज़ों में कई Uninstall Event Functions शामिल हैं: प्रक्रिया CurUninstallStepChanged (CurUninstallStep: TUninstallStep);

आपको [कोड] अनुभाग के भीतर एक इनपुट पेज बनाने में सक्षम होना चाहिए।

+0

मैं इस संस्करण का भी उपयोग कर रहा हूं। क्षमा करें, मूल प्रश्न में इसका उल्लेख किया जाना चाहिए था। तो, मेरी InitializeWizard प्रक्रिया में संवाद (और जहां यह पृष्ठों के अनुक्रम में फिट बैठता है) को परिभाषित करने के बजाय, मैं मैन्युअल रूप से CreateCustomForm का उपयोग करके इसे कोड करता हूं। मुझे लगता है कि CodeClasses.iss नमूना मदद कर सकता है। सुझाव के लिए धन्यवाद - मैं इसे जाने दूंगा ... – eyoopmeduck

5

सौभाग्य से इनो सेटअप अपने फॉर्म बनाने के लिए पर्याप्त क्षमता प्रदान करता है ताकि आप किसी अन्य मोडल फॉर्म पर अनइंस्टॉल फॉर्म के किसी भी पेज का अनुकरण कर सकें। यहां मैं जो बनाने में कामयाब रहा हूं। फॉर्म UninstallForm से आयाम लेता है, इसमें TNewNotebook नियंत्रण और बटन के बीच कूदने के लिए बटन और संवाद रद्द करने के लिए बटन शामिल हैं।

demo

const 
    ControlGap = 5; // determined empirically 

// Set Back/Next buttons state according to current selected notebook page 
procedure UpdateButtonsState(Form: TSetupForm); 
var 
    Notebook: TNewNotebook; 
    BtnBack, BtnNext: TButton; 
begin 
    Notebook := TNewNotebook(Form.FindComponent('Notebook')); 
    BtnBack := TButton(Form.FindComponent('BtnBack')); 
    BtnNext := TButton(Form.FindComponent('BtnNext')); 

    // Update buttons state 
    BtnBack.Enabled := (Notebook.ActivePage <> Notebook.Pages[0]); 
    if Notebook.ActivePage <> Notebook.Pages[Notebook.PageCount - 1] then 
    begin 
    BtnNext.Caption := SetupMessage(msgButtonNext) 
    BtnNext.ModalResult := mrNone; 
    end 
    else 
    begin 
    BtnNext.Caption := SetupMessage(msgButtonFinish); 
    BtnNext.ModalResult := mrYes; 
    end; 
end; 

// Change notebook page 
procedure BtnPageChangeClick(Sender: TObject); 
var 
    NextPage: TNewNotebookPage; 
    Notebook: TNewNotebook; 
    Form: TWinControl; 
    Button, BtnBack, BtnNext: TButton; 
begin 
    Button := TButton(Sender); 
    Form := Button; 
    while not (Form is TSetupForm) do 
    Form := Form.Parent; 
    Notebook := TNewNotebook(Form.FindComponent('Notebook')); 
    BtnBack := TButton(Form.FindComponent('BtnBack')); 
    BtnNext := TButton(Form.FindComponent('BtnNext')); 

    // Avoid cycled style of Notebook's page looping 
    if (Button = BtnBack) and (Notebook.ActivePage = Notebook.Pages[0]) then 
    NextPage := nil 
    else 
    if (Button = BtnNext) and (Notebook.ActivePage = Notebook.Pages[Notebook.PageCount - 1]) then 
    NextPage := nil 
    else 
    NextPage := Notebook.FindNextPage(Notebook.ActivePage, Button = BtnNext); 
    Notebook.ActivePage := NextPage; 

    UpdateButtonsState(TSetupForm(Form)); 
end; 

// Add a new page to notebook and return it 
function AddPage(NotebookForm: TSetupForm): TNewNotebookPage; 
var 
    Notebook: TNewNotebook; 
begin 
    Notebook := TNewNotebook(NotebookForm.FindComponent('Notebook')); 
    Result := TNewNotebookPage.Create(Notebook); 
    Result.Notebook:=Notebook; 
    Result.Parent:=Notebook; 
    Result.Align := alClient; 
    if Notebook.ActivePage = nil then 
    Notebook.ActivePage := Result; 
    UpdateButtonsState(NotebookForm); 
end; 

// Create a form with notebook and 3 buttons: Back, Next, Cancel 
function CreateNotebookForm: TSetupForm; 
var 
    Notebook: TNewNotebook; 
    NotebookPage: TNewNotebookPage; 
    Pan: TPanel; 
    TmpLabel: TLabel; 
    MaxWidth, i: Integer; 
    BtnBack, BtnNext, BtnCancel: TButton; 
    BtnLabelMsgIDs: array of TSetupMessageID; 
begin 
    Result := CreateCustomForm; 
    Result.SetBounds(0, 0, UninstallProgressForm.Width, UninstallProgressForm.Height); 
    Result.Position := poOwnerFormCenter; 

    Notebook := TNewNotebook.Create(Result); 
    Notebook.Parent := Result; 
    Notebook.Name := 'Notebook'; // will be used for searching 
    Notebook.Align := alClient; 

    Pan := TPanel.Create(Result); 
    Pan.Parent := Notebook; 
    Pan.Caption := ''; 
    Pan.Align := alBottom; 

    // Create buttons 

    BtnNext := TNewButton.Create(Result); 
    with BtnNext do 
    begin 
    Parent := Pan; 
    Name := 'BtnNext'; // will be used for searching 
    Caption := SetupMessage(msgButtonNext); 
    OnClick := @BtnPageChangeClick; 
    ParentFont := True; 
    end; 

    BtnBack := TNewButton.Create(Result); 
    with BtnBack do 
    begin 
    Parent := Pan; 
    Caption := SetupMessage(msgButtonBack); 
    Name := 'BtnBack'; // will be used for searching 
    OnClick := @BtnPageChangeClick; 
    ParentFont := True; 
    end; 

    BtnCancel := TNewButton.Create(Result); 
    with BtnCancel do 
    begin 
    Parent := Pan; 
    Name := 'BtnCancel'; // will be used for searching 
    Caption := SetupMessage(msgButtonCancel); 
    ModalResult := mrCancel; 
    Cancel := True; 
    ParentFont := True; 
    end; 

    // Determine dimensions of buttons. Should use TCanvas.TextWidth here 
    // but it doesn't allow Font property assignment :(

    TmpLabel := TLabel.Create(Result); 
    with TmpLabel do 
    begin 
    Left := 0; 
    Top := 0; 
    Parent := Pan; 
    ParentFont := True; 
    Visible := False; 
    WordWrap := False; 
    Autosize := True; 
    end; 

    // Determine max label width among these labels: Back, Next, Cancel, Finish 
    SetArrayLength(BtnLabelMsgIDs, 4); 
    BtnLabelMsgIDs[0] := msgButtonBack; 
    BtnLabelMsgIDs[1] := msgButtonNext; 
    BtnLabelMsgIDs[2] := msgButtonCancel; 
    BtnLabelMsgIDs[3] := msgButtonFinish; 
    MaxWidth := 0; 
    for i := Low(BtnLabelMsgIDs) to High(BtnLabelMsgIDs) do 
    begin 
    TmpLabel.Caption := SetupMessage(BtnLabelMsgIDs[i]) + 'WWW'; // Add letters for surrounding spaces 
    if MaxWidth < TmpLabel.Width then 
     MaxWidth := TmpLabel.Width; 
    end; 

    TmpLabel.Caption := 'Yy'; // Determine height 

    // Assign sizes and positions 
    Pan.ClientHeight := TmpLabel.Height*4; 

    with BtnBack do 
    begin 
    Width := MaxWidth; 
    Height := TmpLabel.Height*2; 
    Left := Parent.ClientWidth - 3*(MaxWidth + ScaleX(ControlGap)); 
    Top := (Parent.ClientHeight - Height) div 2; 
    end; 
    with BtnNext do 
    begin 
    Width := MaxWidth; 
    Height := TmpLabel.Height*2; 
    Left := Parent.ClientWidth - 2*(MaxWidth + ScaleX(ControlGap)); 
    Top := (Parent.ClientHeight - Height) div 2; 
    end; 
    with BtnCancel do 
    begin 
    Width := MaxWidth; 
    Height := TmpLabel.Height*2; 
    Left := Parent.ClientWidth - 1*(MaxWidth + ScaleX(ControlGap)); 
    Top := (Parent.ClientHeight - Height) div 2; 
    end; 
end; 

प्रयोग

तरह
// UninstallProgressForm is about to be shown 
// Show modal dialog which allows to select additional components to uninstall 
procedure InitializeUninstallProgressForm; 
var 
    Form: TSetupForm; 
    i: Integer; 
    NotebookPage: TNewNotebookPage; 
    ModResult: Integer; 
begin 
    Form := CreateNotebookForm; 
    for i := 1 to 4 do 
    begin 
    NotebookPage := AddPage(Form); 
    with NotebookPage do 
    begin 
     Color := clWindow; 
     with TLabel.Create(Form) do 
     begin 
     Parent := NotebookPage; 
     SetBounds(0, 0, 50, 30); 
     Autosize := true; 
     Font.Size := 14; 
     Caption := 'Label ' + IntToStr(i); 
     end; 
    end; 
    end; 

    ModResult := Form.ShowModal; 
    if ModResult = mrYes then 
    MsgBox('Continuing uninstall', mbInformation, MB_OK) 
    else 
    begin 
    MsgBox('Cancelled', mbInformation, MB_OK); 
    Abort; 
    end; 

    ... 
end; 
+0

दिलचस्प विचार! बस, अगर आप इस तरह से अनइंस्टॉलेशन प्रक्रिया को * अवरुद्ध कर सकते हैं, तो एम्बेड करना बेहतर नहीं होगा, आइए 'अनइंस्टॉल प्रोग्रेसफॉर्म' के ऊपर एक और फॉर्म रखने के बजाय 'अनइंस्टॉल प्रोग्रेसफॉर्म' के क्लाइंट एरिया पर 'टीपीनल' बढ़ाया गया है? क्या आपके पास इस कोड के साथ दो अलग-अलग (चलने योग्य) रूप नहीं हैं? – TLama

+0

@TLama यकीन है कि, मैंने कोशिश की पहली बात थी लेकिन दुर्भाग्य से यह काम नहीं करेगा। अनइंस्टॉलर कोड बिना किसी शर्त के अनइंस्टॉलफॉर्म को अनदेखा कर देता है, चाहे हमारे किसी भी क्रिया के बावजूद। तो ऐसा लगता है कि वर्तमान में अनइंस्टॉलेशन प्रक्रिया को घुसपैठ करने का एकमात्र तरीका मोडल रूप है :( – Fr0sT

5

आप (पृष्ठ और अगला/वापस बटन के साथ) स्थापित रूप की तरह व्यवहार करने के लिए स्थापना रद्द करें प्रपत्र को संशोधित कर सकते हैं।

InitializeUninstallProgressForm में:

  • नया पृष्ठ बनाएँ और उन्हें UninstallProgressForm.InnerNotebook (या .OuterNotebook) को सम्मिलित करें।
  • "अगला" और "बैक" बटन लागू करें।
  • आप "रद्द करें" बटन भी काम कर सकते हैं।
  • UninstallProgressForm.ShowModal का उपयोग कर फ़ॉर्म के मोडल लूप चलाएं।
  • केवल मोडल पाश निकलने के बाद, फ़ॉर्म के मूल लेआउट को पुनर्स्थापित करें और अनइंस्टॉलेशन जारी रखें।
[Code] 

var 
    UninstallFirstPage: TNewNotebookPage; 
    UninstallSecondPage: TNewNotebookPage; 
    UninstallBackButton: TNewButton; 
    UninstallNextButton: TNewButton; 

procedure UpdateUninstallWizard; 
begin 
    if UninstallProgressForm.InnerNotebook.ActivePage = UninstallFirstPage then 
    begin 
    UninstallProgressForm.PageNameLabel.Caption := 'First uninstall wizard page'; 
    UninstallProgressForm.PageDescriptionLabel.Caption := 
     'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; 
    end 
    else 
    if UninstallProgressForm.InnerNotebook.ActivePage = UninstallSecondPage then 
    begin 
    UninstallProgressForm.PageNameLabel.Caption := 'Second uninstall wizard page'; 
    UninstallProgressForm.PageDescriptionLabel.Caption := 
     'Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'; 
    end; 

    UninstallBackButton.Visible := 
    (UninstallProgressForm.InnerNotebook.ActivePage <> UninstallFirstPage); 

    if UninstallProgressForm.InnerNotebook.ActivePage <> UninstallSecondPage then 
    begin 
    UninstallNextButton.Caption := SetupMessage(msgButtonNext); 
    UninstallNextButton.ModalResult := mrNone; 
    end 
    else 
    begin 
    UninstallNextButton.Caption := 'Uninstall'; 
    { Make the "Uninstall" button break the ShowModal loop } 
    UninstallNextButton.ModalResult := mrOK; 
    end; 
end; 

procedure UninstallNextButtonClick(Sender: TObject); 
begin 
    if UninstallProgressForm.InnerNotebook.ActivePage = UninstallSecondPage then 
    begin 
    UninstallNextButton.Visible := False; 
    UninstallBackButton.Visible := False; 
    end 
    else 
    begin 
    if UninstallProgressForm.InnerNotebook.ActivePage = UninstallFirstPage then 
    begin 
     UninstallProgressForm.InnerNotebook.ActivePage := UninstallSecondPage; 
    end; 
    UpdateUninstallWizard; 
    end; 
end; 

procedure UninstallBackButtonClick(Sender: TObject); 
begin 
    if UninstallProgressForm.InnerNotebook.ActivePage = UninstallSecondPage then 
    begin 
    UninstallProgressForm.InnerNotebook.ActivePage := UninstallFirstPage; 
    end; 
    UpdateUninstallWizard; 
end; 

procedure InitializeUninstallProgressForm(); 
var 
    PageText: TNewStaticText; 
    PageNameLabel: string; 
    PageDescriptionLabel: string; 
    CancelButtonEnabled: Boolean; 
    CancelButtonModalResult: Integer; 
begin 
    if not UninstallSilent then 
    begin 
    { Create the first page and make it active } 
    UninstallFirstPage := TNewNotebookPage.Create(UninstallProgressForm); 
    UninstallFirstPage.Notebook := UninstallProgressForm.InnerNotebook; 
    UninstallFirstPage.Parent := UninstallProgressForm.InnerNotebook; 
    UninstallFirstPage.Align := alClient; 

    PageText := TNewStaticText.Create(UninstallProgressForm); 
    PageText.Parent := UninstallFirstPage; 
    PageText.Top := UninstallProgressForm.StatusLabel.Top; 
    PageText.Left := UninstallProgressForm.StatusLabel.Left; 
    PageText.Width := UninstallProgressForm.StatusLabel.Width; 
    PageText.Height := UninstallProgressForm.StatusLabel.Height; 
    PageText.AutoSize := False; 
    PageText.ShowAccelChar := False; 
    PageText.Caption := 'Press Next to proceeed with uninstallation.'; 

    UninstallProgressForm.InnerNotebook.ActivePage := UninstallFirstPage; 

    PageNameLabel := UninstallProgressForm.PageNameLabel.Caption; 
    PageDescriptionLabel := UninstallProgressForm.PageDescriptionLabel.Caption; 

    { Create the second page } 

    UninstallSecondPage := TNewNotebookPage.Create(UninstallProgressForm); 
    UninstallSecondPage.Notebook := UninstallProgressForm.InnerNotebook; 
    UninstallSecondPage.Parent := UninstallProgressForm.InnerNotebook; 
    UninstallSecondPage.Align := alClient; 

    PageText := TNewStaticText.Create(UninstallProgressForm); 
    PageText.Parent := UninstallSecondPage; 
    PageText.Top := UninstallProgressForm.StatusLabel.Top; 
    PageText.Left := UninstallProgressForm.StatusLabel.Left; 
    PageText.Width := UninstallProgressForm.StatusLabel.Width; 
    PageText.Height := UninstallProgressForm.StatusLabel.Height; 
    PageText.AutoSize := False; 
    PageText.ShowAccelChar := False; 
    PageText.Caption := 'Press Uninstall to proceeed with uninstallation.'; 

    UninstallNextButton := TNewButton.Create(UninstallProgressForm); 
    UninstallNextButton.Parent := UninstallProgressForm; 
    UninstallNextButton.Left := 
     UninstallProgressForm.CancelButton.Left - 
     UninstallProgressForm.CancelButton.Width - 
     ScaleX(10); 
    UninstallNextButton.Top := UninstallProgressForm.CancelButton.Top; 
    UninstallNextButton.Width := UninstallProgressForm.CancelButton.Width; 
    UninstallNextButton.Height := UninstallProgressForm.CancelButton.Height; 
    UninstallNextButton.OnClick := @UninstallNextButtonClick; 

    UninstallBackButton := TNewButton.Create(UninstallProgressForm); 
    UninstallBackButton.Parent := UninstallProgressForm; 
    UninstallBackButton.Left := 
     UninstallNextButton.Left - UninstallNextButton.Width - 
     ScaleX(10); 
    UninstallBackButton.Top := UninstallProgressForm.CancelButton.Top; 
    UninstallBackButton.Width := UninstallProgressForm.CancelButton.Width; 
    UninstallBackButton.Height := UninstallProgressForm.CancelButton.Height; 
    UninstallBackButton.Caption := SetupMessage(msgButtonBack); 
    UninstallBackButton.OnClick := @UninstallBackButtonClick; 
    UninstallBackButton.TabOrder := UninstallProgressForm.CancelButton.TabOrder; 

    UninstallNextButton.TabOrder := UninstallBackButton.TabOrder + 1; 

    UninstallProgressForm.CancelButton.TabOrder := UninstallNextButton.TabOrder + 1; 

    { Run our wizard pages } 
    UpdateUninstallWizard; 
    CancelButtonEnabled := UninstallProgressForm.CancelButton.Enabled 
    UninstallProgressForm.CancelButton.Enabled := True; 
    CancelButtonModalResult := UninstallProgressForm.CancelButton.ModalResult; 
    UninstallProgressForm.CancelButton.ModalResult := mrCancel; 

    if UninstallProgressForm.ShowModal = mrCancel then Abort; 

    { Restore the standard page payout } 
    UninstallProgressForm.CancelButton.Enabled := CancelButtonEnabled; 
    UninstallProgressForm.CancelButton.ModalResult := CancelButtonModalResult; 

    UninstallProgressForm.PageNameLabel.Caption := PageNameLabel; 
    UninstallProgressForm.PageDescriptionLabel.Caption := PageDescriptionLabel; 

    UninstallProgressForm.InnerNotebook.ActivePage := 
     UninstallProgressForm.InstallingPage; 
    end; 
end; 

First page

Second page

Uninstalling


भी देखें Inno Setup - How to create a OuterNotebook/welcome page in the uninstaller?

+0

क्या इंस्टॉलर के स्वागत पृष्ठ से मेल खाने के लिए पहले पृष्ठ को आसानी से बदलना (छुपाएं, स्थानांतरित करना आदि) संभव है? (मैं कोशिश कर रहा हूं लेकिन मैं नहीं कर सकते हैं) –

+0

स्वागत पृष्ठ 'आउटर नोटबुक' का एक पृष्ठ है, न कि 'इनरनेटबुक'। लेकिन यह अगला/बैक बटन के तर्क को जटिल करता है। –

+0

निश्चित रूप से, स्वागत पृष्ठ 'आउटटर नोटबुक' का एक पृष्ठ है '- जो शीर्ष शीर्षलेख को कवर करता है। शीर्ष शीर्षलेख (' मेनपैनेल') 'इनरनेटबुक' के साथ 'इनरनेटबुक' नामक 'आउटरनेटबुक' पृष्ठ का एक हिस्सा है - संरचना इंस्टॉलर और अनइंस्टॉलर पर समान है। कि अनइंस्टॉलर पर अधिकांश संरचना का उपयोग नहीं किया जाता है (क्योंकि केवल एक ही पृष्ठ है) - लेकिन यह वास्तव में आपके लिए अच्छा है क्योंकि आप इंस्टॉलर के समान लेआउट को आसानी से कार्यान्वित कर सकते हैं। –

संबंधित मुद्दे