दिलचस्प पोस्ट
JSoup चरित्र एन्कोडिंग समस्या आप सरल PostgreSQL स्क्रिप्ट में चर का उपयोग कैसे करते हैं? प्रीसीकेसिंग के बाद जीसीसी आउटपुट सी कोड हो सकता है? Codeblocks में graphics.h कैसे उपयोग करें? आईएसआईएस पर एएसपी.नेट एमवीसी 3 और विंडोज एथ रहता है / खाता / लॉगइन पर रीडायरेक्ट करता है डी 3 के साथ एसवीजी तत्व जेड-इंडेक्स को अद्यतन करना जुड़ने का उपयोग करते समय तीव्रता का समय बढ़ाता है एक UIImage (कोको टच) या सीजीआईमेज (कोर ग्राफिक्स) से पिक्सेल डेटा कैसे प्राप्त करें? एंड्रॉइड एस्प्रेसो में टोस्ट संदेश की जांच करना निरंतर विफलता के साथ चर की बैच फ़ाइल तुलना एफ़टीपी / एसएफटीपी एक अमेज़ॅन एस 3 बाल्टी एक्सेस NullPointerException onCreate में दृश्यों को एक्सेस करना () PHP के swiftmailer का उपयोग कर Gmail के साथ एनजी-एप और डेटा-एनजी-एप के बीच अंतर क्या है? उद्देश्य सी अंतर्निहित रूपांतरण पूर्णांक सटीक 'एनएसयूइन्टेगर' (उर्फ 'अहस्ताक्षरित लंबे') को 'इंट' चेतावनी के लिए खो देता है

Inno सेटअप में सीरियल नंबर के लिए कस्टमपेज

कैसे सीरियल नंबर के लिए संपादन बॉक्स के साथ Inno सेटअप में कस्टम पेज बनाने के लिए? जैसे 6x5chars या 7x5chars?

स्क्रिप्ट को जांचना चाहिए कि सभी बक्से भर दिए जाने से पहले अगला बटन उपलब्ध हो जाएगा।

यह भी अच्छा होगा कि यदि कॉपी / पेस्ट किया गया फ़ंक्शन लागू हो सकता है जो सभी संपादन बॉक्स को भरने की अनुमति देगा यदि क्लिपबोर्ड की सामग्री सीरियल नंबर पैटर्न से मेल खाती है।

वेब के समाधान से एकत्रित समाधान "Inno सेटअप में सीरियल नंबर के लिए कस्टमपेज"

यह एक ऐसा तरीका है जो कस्टम पृष्ठ का उपयोग करता है जहां अलग संपादन बॉक्स बनाए जाते हैं। आपको केवल SC_EDITCOUNT निरंतर के लिए मान निर्दिष्ट करने की जरूरत है जहां संपादन बॉक्स की संख्या निर्धारित की गई है और SC_CHARCOUNT वर्णों की संख्या क्या है जो इन संपादन बक्से में दर्ज किए जा सकते हैं। यदि आप पहले संपादन बॉक्स में हैं तो आप संपूर्ण सीरियल नंबर पेस्ट कर सकते हैं यदि यह प्रारूप में - char ( TryPasteSerialNumber फ़ंक्शन यहाँ) द्वारा सीमांकित पैटर्न द्वारा होता है। संपादन बक्से से सीरियल नंबर प्राप्त करने के लिए GetSerialNumber को कॉल करने के लिए पर्याप्त है, जहां आप आउटपुट प्रारूप के लिए एक GetSerialNumber भी निर्दिष्ट कर सकते हैं (यदि आवश्यक हो)।

 [Setup] AppName=Serial number project AppVersion=1.0 DefaultDirName={pf}\Serial number project [code] function SetFocus(hWnd: HWND): HWND; external 'SetFocus@user32.dll stdcall'; function OpenClipboard(hWndNewOwner: HWND): BOOL; external 'OpenClipboard@user32.dll stdcall'; function GetClipboardData(uFormat: UINT): THandle; external 'GetClipboardData@user32.dll stdcall'; function CloseClipboard: BOOL; external 'CloseClipboard@user32.dll stdcall'; function GlobalLock(hMem: THandle): PAnsiChar; external 'GlobalLock@kernel32.dll stdcall'; function GlobalUnlock(hMem: THandle): BOOL; external 'GlobalUnlock@kernel32.dll stdcall'; var SerialPage: TWizardPage; SerialEdits: array of TEdit; const CF_TEXT = 1; VK_BACK = 8; SC_EDITCOUNT = 6; SC_CHARCOUNT = 5; SC_DELIMITER = '-'; function IsValidInput: Boolean; var I: Integer; begin Result := True; for I := 0 to GetArrayLength(SerialEdits) - 1 do if Length(SerialEdits[I].Text) < SC_CHARCOUNT then begin Result := False; Break; end; end; function GetClipboardText: string; var Data: THandle; begin Result := ''; if OpenClipboard(0) then try Data := GetClipboardData(CF_TEXT); if Data <> 0 then Result := String(GlobalLock(Data)); finally if Data <> 0 then GlobalUnlock(Data); CloseClipboard; end; end; function GetSerialNumber(ADelimiter: Char): string; var I: Integer; begin Result := ''; for I := 0 to GetArrayLength(SerialEdits) - 1 do Result := Result + SerialEdits[I].Text + ADelimiter; Delete(Result, Length(Result), 1); end; function TrySetSerialNumber(const ASerialNumber: string; ADelimiter: Char): Boolean; var I: Integer; J: Integer; begin Result := False; if Length(ASerialNumber) = ((SC_EDITCOUNT * SC_CHARCOUNT) + (SC_EDITCOUNT - 1)) then begin for I := 1 to SC_EDITCOUNT - 1 do if ASerialNumber[(I * SC_CHARCOUNT) + I] <> ADelimiter then Exit; for I := 0 to GetArrayLength(SerialEdits) - 1 do begin J := (I * SC_CHARCOUNT) + I + 1; SerialEdits[I].Text := Copy(ASerialNumber, J, SC_CHARCOUNT); end; Result := True; end; end; function TryPasteSerialNumber: Boolean; begin Result := TrySetSerialNumber(GetClipboardText, SC_DELIMITER); end; procedure OnSerialEditChange(Sender: TObject); begin WizardForm.NextButton.Enabled := IsValidInput; end; procedure OnSerialEditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var Edit: TEdit; EditIndex: Integer; begin Edit := TEdit(Sender); EditIndex := Edit.TabOrder - SerialEdits[0].TabOrder; if (EditIndex = 0) and (Key = Ord('V')) and (Shift = [ssCtrl]) then begin if TryPasteSerialNumber then Key := 0; end else if (Key >= 32) and (Key <= 255) then begin if Length(Edit.Text) = SC_CHARCOUNT - 1 then begin if EditIndex < GetArrayLength(SerialEdits) - 1 then SetFocus(SerialEdits[EditIndex + 1].Handle) else SetFocus(WizardForm.NextButton.Handle); end; end else if Key = VK_BACK then if (EditIndex > 0) and (Edit.Text = '') and (Edit.SelStart = 0) then SetFocus(SerialEdits[EditIndex - 1].Handle); end; procedure CreateSerialNumberPage; var I: Integer; Edit: TEdit; DescLabel: TLabel; EditWidth: Integer; begin SerialPage := CreateCustomPage(wpWelcome, 'Serial number validation', 'Enter the valid serial number'); DescLabel := TLabel.Create(SerialPage); DescLabel.Top := 16; DescLabel.Left := 0; DescLabel.Parent := SerialPage.Surface; DescLabel.Caption := 'Enter valid serial number and continue the installation...'; DescLabel.Font.Style := [fsBold]; SetArrayLength(SerialEdits, SC_EDITCOUNT); EditWidth := (SerialPage.SurfaceWidth - ((SC_EDITCOUNT - 1) * 8)) div SC_EDITCOUNT; for I := 0 to SC_EDITCOUNT - 1 do begin Edit := TEdit.Create(SerialPage); Edit.Top := 40; Edit.Left := I * (EditWidth + 8); Edit.Width := EditWidth; Edit.CharCase := ecUpperCase; Edit.MaxLength := SC_CHARCOUNT; Edit.Parent := SerialPage.Surface; Edit.OnChange := @OnSerialEditChange; Edit.OnKeyDown := @OnSerialEditKeyDown; SerialEdits[I] := Edit; end; end; procedure CurPageChanged(CurPageID: Integer); begin if CurPageID = SerialPage.ID then WizardForm.NextButton.Enabled := IsValidInput; end; procedure InitializeWizard; begin CreateSerialNumberPage; end; 

और यहां ऐसा कैसे दिखता है:

यहां छवि विवरण दर्ज करें

आप CheckSerial() को उपयोगकर्ता से एक सीरियल कुंजी के लिए एक CheckSerial() ईवेंट समारोह जोड़कर संकेत कर सकते हैं।

यदि आप पेज पर अधिक नियंत्रण चाहते हैं, तो आप CreateCustomPage() का उपयोग करके CreateCustomPage() पेजों ( CreateInput...Page ) या सेटअप विज़ार्ड में से एक कस्टम पेज का उपयोग कर CreateCustomPage() और आपको आवश्यकतानुसार नियंत्रण जोड़ सकते हैं।

इनो सेटअप के साथ शामिल किए गए कोडेड्लजी उदाहरण के उदाहरण देखें।

नाम और संगठन के पाठ क्षेत्रों के नीचे एक सीरियल कुंजी बॉक्स जोड़ने का सबसे सरल तरीका है, जैसा कि आपकी जारी फ़ाइल के अनुसार कुछ जोड़ना है

 [Code] function CheckSerial(Serial: String): Boolean; begin // serial format is XXXX-XXXX-XXXX-XXXX Serial := Trim(Serial); if Length(Serial) = 19 then result := true; end; 

यह उपयोगी रूप से संयुक्त हो सकता है

 [Setup] DefaultUserInfoSerial={param:Serial} 

जो पहले से इंस्टॉल करने के लिए दर्ज किया गया था, जो सीरियल भर जाएगा।