2012-04-12 17 views
6

के तहत wpInstalling पेज पर एकाधिक छवियों का प्रदर्शन (स्लाइड शो) मैंने सरल स्क्रिप्ट तैयार की है जो पृष्ठ पर बार पर छवि प्रदर्शित करती है।इनो सेटअप - प्रोग्रेसगेज बार

लेकिन ... मुझे और जटिल कार्यक्षमता की आवश्यकता है।

मुझे जो चाहिए वह कई छवियों को दिखाता है, प्रत्येक एक्स (उदा। 7) सेकेंड के बाद (लूप के साथ जब एक्स एक्स * छवियों की संख्या अधिक होती है) या एक्स (उदा। 10) स्थापना के बाद प्रत्येक। मैंने ProgressGauge.Position में छवियों को प्रदर्शित करने की कोशिश की है, लेकिन मैं असफल रहा।

यहाँ मैं क्या है:

procedure CurPageChanged(CurPageID: Integer); 
var 
    BmpFile: TBitmapImage; 
begin 
    ExtractTemporaryFile('01.bmp'); 
    ExtractTemporaryFile('02.bmp'); 
    ExtractTemporaryFile('03.bmp'); 

    if CurPageID = wpInstalling then 
    begin 
    BmpFile:= TBitmapImage.Create(WizardForm); 
    BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\01.bmp')); 
    BmpFile.Width:= ScaleX(420); 
    BmpFile.Height:= ScaleY(180); 
    BmpFile.Left := WizardForm.ProgressGauge.Left + ScaleX(0); 
    BmpFile.Top := WizardForm.ProgressGauge.Top + ScaleY(35); 

    // BmpFile.Parent:= WizardForm.InstallingPage; 
    // BmpFile:= TBitmapImage.Create(WizardForm); 
    // BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\03.bmp')); 
    // BmpFile.Width:= ScaleX(420); 
    // BmpFile.Height:= ScaleY(400); 
    // BmpFile.Left := WizardForm.ProgressGauge.Left + ScaleX(0); 
    // BmpFile.Top := WizardForm.ProgressGauge.Top + ScaleY(35); 
    // BmpFile.Parent:= WizardForm.InstallingPage; 

    // BmpFile:= TBitmapImage.Create(WizardForm); 
    // BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\03.bmp')); 
    // BmpFile.Width:= ScaleX(420); 
    // BmpFile.Height:= ScaleY(400); 
    // BmpFile.Left := WizardForm.ProgressGauge.Left + ScaleX(0); 
    // BmpFile.Top := WizardForm.ProgressGauge.Top + ScaleY(35); 
    // BmpFile.Parent:= WizardForm.InstallingPage; 
    end; 
end; 

लक्ष्य है:
wpInstalling पर वहाँ प्रदर्शित एक्स छवियों, एक्स सेकंड प्रति या स्थापना की एक्स प्रतिशत के बाद हर अगले होना चाहिए।

उत्तर

7

चूंकि ProgressGauge में कोई प्रगति परिवर्तन घटना नहीं है और सेटअप एपीआई संदेशों को संसाधित करने का कोई तरीका नहीं है, आपको Windows API टाइमर का उपयोग करने की आवश्यकता होगी। इस टाइमर को कॉलबैक फ़ंक्शन की आवश्यकता होती है जिसे आप दुर्भाग्य से इनो सेटअप स्क्रिप्ट में परिभाषित नहीं कर सकते हैं, इसलिए आपको यह काम करने के लिए कुछ बाहरी लाइब्रेरी की आवश्यकता होगी। हालांकि InnoCallback लाइब्रेरी है जो वास्तव में यह कर सकती है।

निम्न कोड के लिए अपने स्थापना निर्देशिका में InnoCallback.dll पुस्तकालय कॉपी, अपने Inno सेटअप स्क्रिप्ट के साथ इस कोड को मर्ज और (वर्तमान सेटिंग्स के साथ प्रत्येक दूसरे OnSlideTimer घटना में एक स्लाइड शो पेज मोड़ जो समय समय पर बुलाया जाएगा किसी तरह लागू)।

[Files] 
Source: "InnoCallback.dll"; DestDir: "{tmp}"; Flags: dontcopy 

[code] 
var 
    TimerID: Integer; 

type 
    TTimerProc = procedure(Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; 
    SysTime: DWORD); 

function WrapTimerProc(Callback: TTimerProc; ParamCount: Integer): LongWord; 
    external '[email protected]:InnoCallback.dll stdcall';  
function SetTimer(hWnd: HWND; nIDEvent, uElapse: UINT; 
    lpTimerFunc: UINT): UINT; external '[email protected] stdcall'; 
function KillTimer(hWnd: HWND; uIDEvent: UINT): BOOL; 
    external '[email protected] stdcall'; 

procedure OnSlideTimer(Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; 
    SysTime: DWORD); 
begin 
    { here you can turn your slideshow pages; use some variable to store the } 
    { current index of the slide you are on, note that this procedure is called } 
    { periodically each 1000 ms (see below why), so here you can also check the } 
    { progress value, if you want to } 
end; 

procedure StartSlideTimer; 
var 
    TimerCallback: LongWord; 
begin 
    TimerCallback := WrapTimerProc(@OnSlideTimer, 4); 
    { third parameter here is the timer's timeout value in milliseconds } 
    TimerID := SetTimer(0, 0, 1000, TimerCallback); 
end; 

procedure KillSlideTimer; 
begin 
    if TimerID <> 0 then 
    begin 
    if KillTimer(0, TimerID) then 
     TimerID := 0; 
    end; 
end; 

function InitializeSetup: Boolean; 
begin 
    Result := True; 
    TimerID := 0; 
end; 

procedure DeinitializeSetup; 
begin 
    KillSlideTimer; 
end; 

procedure CurPageChanged(CurPageID: Integer); 
begin 
    if CurPageID = wpInstalling then 
    StartSlideTimer 
    else 
    KillSlideTimer; 
end; 
+0

जिसने मेरी समस्या हल की! मैंने वैश्विक वैर इंडेक्स जोड़ा है: इंटीजर; और छवियों (IntToStr) – RobeN

+1

युप के लिए थोड़ा संशोधित कोड, यदि आपको आवश्यकता हो तो आप समय काउंटर या प्रगति गेज तक पहुंच सकते हैं। यही कारण है कि मैंने केवल आपके मामले के लिए टाइमर ईवेंट को कार्यान्वित करने के तरीके को दिखाया ;-) लेकिन शायद आपको प्रगति गेज स्थिति भी जांचनी चाहिए, क्योंकि अगर कोई त्रुटि होती है तो यह बहुत अच्छा नहीं लगेगा और आप अभी भी अपने स्लाइड शो को घुमाएंगे। मुझे लगता है कि आपको केवल अपनी छवियों को स्लाइड करना चाहिए जब 'WizardForm.ProgressGauge.State = npbsNormal', लेकिन यह आपके ऊपर भी है। उपलब्ध प्रगति राज्यों के लिए ['यहां'] देखें (http://www.jrsoftware.org/ishelp/topic_scriptclasses.htm#TNewProgressBarState)। – TLama

+1

मैंने किया। 'त्रुटि' के लिए 'रुका हुआ' के लिए विशेष कार्य और 'स्थिति = अधिकतम' (तृतीय पक्ष ऐप्स स्थापना के दौरान) के लिए। मदद और समर्थन के लिए धन्यवाद! – RobeN

2

छवि बदलने के लिए प्रत्येक फ़ाइल प्रविष्टि पर AfterInstall का उपयोग क्यों नहीं करें?

+0

यह वही नहीं है जो मुझे चाहिए। TLama का समाधान बेहतर तरीका है (कम से कम मेरे लिए)। – RobeN

+0

आपके काम का एक उदाहरण देखने के लिए अच्छा होगा ... मुझे अभी भी इस स्क्रिप्ट को सही तरीके से काम करने में समस्या है। – Dielo

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