2011-12-21 12 views
5

के बजाय मेरा कस्टम डेल्फी फॉर्म (डीएलएल से) खोलना संभव है, मुझे अपने घटकों (थोडा वनक्लिक इंस्टॉलर) के साथ एक जटिल फ़ॉर्म बनाना होगा, और इसे इसके प्रतिस्थापन के रूप में उपयोग करना होगा मानक InnoSetup विज़ार्ड। क्या यह संभव है?इनोसेटअप: मानक सेटअप विज़ार्ड

मेरा फॉर्म डीएलएल में रखा गया है, और यह डीएलएल इनोसेटअप प्रक्रिया के लिए उपलब्ध होगा।

यह कैसे मैं ऐसा करने की कोशिश की है:

library OneClickWizard; 

uses 
    SysUtils, 
    Classes, 
    Wizard in 'Wizard.pas' {FormWizard}; 

{$R *.res} 

exports 
    CreateWizardForm, 
    DestroyWizardForm; 

begin 
end. 

डेल्फी रूप

डेल्फी DLL कोड

unit Wizard; 

interface 

type 
    TFormWizard = class(TForm) 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    FormWizard: TFormWizard; 

procedure CreateWizardForm(AppHandle: THandle); stdcall; 
procedure DestroyWizardForm; stdcall; 

implementation 

{$R *.dfm} 

procedure CreateWizardForm(AppHandle: THandle); 
begin 
    Application.Handle := AppHandle; 
    FormWizard := TFormWizard.Create(Application); 
    FormWizard.Show; 
    FormWizard.Refresh; 
end; 

procedure DestroyWizardForm; 
begin 
    FormWizard.Free; 
end; 

InnoSetup स्क्रिप्ट (आईएसएस)

[Setup] 
;Disable all of the default wizard pages 
DisableDirPage=yes 
DisableProgramGroupPage=yes 
DisableReadyMemo=true 
DisableReadyPage=true 
DisableStartupPrompt=true 
DisableWelcomePage=true 
DisableFinishedPage=true 

[Files] 
Source:"OneClickWizard.dll"; Flags: dontcopy 

[Code] 
procedure CreateWizardForm(AppHandle: Cardinal); 
    external '[email protected]:OneClickWizard.dll stdcall'; 
procedure DestroyWizardForm; 
    external '[email protected]:OneClickWizard.dll stdcall'; 


procedure InitializeWizard(); 
begin 
    CreateWizardForm(MainForm.Handle); 
end; 

स्क्रीन पर दिखाई देने वाला फॉर्म, लेकिन यह मेरे इनपुट पर प्रतिक्रिया नहीं करता है। ऐसा लगता है कि यह मुख्य संदेश चक्र से बाहर है। यह सही तरीके से कैसे करें?

उत्तर

5

मुझे इनोसेटअप के बारे में बिल्कुल कुछ नहीं पता है लेकिन निश्चित रूप से आपको यहां दिखाने के बजाय शोमोडाल का उपयोग करने की आवश्यकता है। इंस्टॉलेशन यूआई अनिवार्य रूप से मोडल है और आप यहां जो चाहते हैं वह तब तक प्रतीक्षा करना है जब तक कि उपयोगकर्ता इनो पर वापस आने से पहले फॉर्म के साथ पुन: सक्रिय नहीं हो जाता। अन्यथा, आगे बढ़ने के दौरान इनो को कैसे पता चलेगा? ShowModal फ़ॉर्म की सेवा के लिए एक संदेश लूप चलाता है ताकि इनपुट प्राप्त करने में कोई समस्या न हो।

आप DestroyWizardForm को हटाने के लिए अपना डीएलएल भी बदल देंगे क्योंकि शोमोडल कॉल करने वाले फ़ंक्शन दोनों फ़ॉर्म को बना और नष्ट कर सकते हैं।

+0

शर्म की बात है! निश्चित रूप से, मुझे ShowModal – Andrew

1

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

या तो कम या कम से कम, इनो के मूल रूप और विज़ार्ड पृष्ठ फ़ंक्शंस/तर्क का उपयोग करके।

6

मेरी सेटअप में मैं कुछ इसी तरह से करते हैं। InnoSetup कोड मैं StrToInt(ExpandConstant('{wizardhwnd}')) के रूप में संभाल पारित DLL में

(मेरा अनुमान है कि MainForm.Handle शून्य है): मुझ पर

OldAppHandle := Application.Handle; 
try 
    Application.Handle := hAppHandle; // hAppHandle the handle from InnoSetup 
    F := TfmZForm.Create(Application); 
    try 
    F.Caption := lpTitle; 
    F.ShowModal; 
    Result := F.ErrorCode; 
    finally 
    F.Free; 
    end; 
finally 
    Application.Handle := OldAppHandle; 
end; 
+0

का उपयोग करना चाहिए, यहां बड़ा अंतर है ShowModal I संदेह –

+0

मैंने आपके समाधान को थोड़ा संशोधित किया है, क्योंकि मैं मानक InnoSetup विज़ार्ड को छिपाना चाहता हूं: InitializeWizard() प्रक्रिया में मैंने WizardForm.BorderStyle: = bsNone जोड़ा; WizardForm.Width: = 0; जादूगरफॉर्म। हाइट: = 0; CreateWizardForm (WizardForm.Handle); – Andrew

+0

@ कोबिक, मुझे खेद है, लेकिन मुझे डेविड के जवाब को सही के रूप में देखना है, क्योंकि वह शोमोडल() का उपयोग करने का प्रस्ताव रखने वाले पहले व्यक्ति थे – Andrew