2012-06-30 4 views
2

마법사 페이지에서 단추를 만들었습니다. 하지만이 시리얼 폼 페이지에 버튼 만 보여주고 싶습니다. 이제 버튼이 모든 마법사 페이지에 표시됩니다. 시리얼 페이지에서만 어떻게 보이게 할 수 있습니까?특정 페이지에서만 볼 수있는 버튼을 만들 수 있습니까? (이노 설치)

이 내가 시리얼 양식 페이지에 사용했던 코드는 다음과 같습니다

[Code] 
enter code here function SetFocus(hWnd: HWND): HWND; 
    external '[email protected] stdcall'; 
function OpenClipboard(hWndNewOwner: HWND): BOOL; 
    external '[email protected] stdcall'; 
function GetClipboardData(uFormat: UINT): THandle; 
    external '[email protected] stdcall'; 
function CloseClipboard: BOOL; 
    external '[email protected] stdcall'; 
function GlobalLock(hMem: THandle): PAnsiChar; 
    external '[email protected] stdcall'; 
function GlobalUnlock(hMem: THandle): BOOL; 
    external '[email protected] stdcall'; 

var 
    SerialPage: TWizardPage; 
    SerialEdits: array of TEdit; 

const 
    CF_TEXT = 1; 
    VK_BACK = 8; 
    SC_EDITCOUNT = 6; 
    SC_CHARCOUNT = 5; 

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 TryPasteSerialNumber: Boolean; 
var 
    S: string; 
    I: Integer; 
    J: Integer; 
    Delimiter: string; 
begin 
    Result := True; 
    Delimiter := '-'; 
    S := GetClipboardText;  
    if Length(S) <> ((SC_EDITCOUNT * SC_CHARCOUNT) + 
    ((SC_EDITCOUNT - 1) * Length(Delimiter))) then 
    Exit;  
    for I := 0 to GetArrayLength(SerialEdits) - 1 do 
    begin 
    J := (I * SC_CHARCOUNT) + (I * Length(Delimiter)) + 1; 
    SerialEdits[I].Text := Copy(S, J, SC_CHARCOUNT); 
    end; 
end; 

function GetSerialNumber(const 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; 

procedure OnSerialEditChange(Sender: TObject); 
var 
    CanContinue: Boolean; 
begin 
    CanContinue := GetSerialNumber('-') = 'my serial'; 
    WizardForm.NextButton.Enabled := CanContinue; 
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 the valid serial number and continue with 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 := False; 
end; 

procedure AboutButtonOnClick(Sender: TObject); 
var 
    ErrorCode: Integer; 
begin 
    ShellExecAsOriginalUser('open', 'http://www.mywebsite.com', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode); 
end; 

procedure CreateAboutButton(ParentForm: TSetupForm; CancelButton: TNewButton); 
var 
    AboutButton: TNewButton; 
begin 
    AboutButton := TNewButton.Create(ParentForm); 
    AboutButton.Left := ParentForm.ClientWidth - CancelButton.Left - CancelButton.Width; 
    AboutButton.Top := CancelButton.Top; 
    AboutButton.Width := CancelButton.Width; 
    AboutButton.Height := CancelButton.Height; 
    AboutButton.Caption := '&Get Serial'; 
    AboutButton.OnClick := @AboutButtonOnClick; 
    AboutButton.Parent := ParentForm; 
end; 

procedure InitializeWizard; 
begin 
    CreateSerialNumberPage; 
    CreateAboutButton(WizardForm, WizardForm.CancelButton); 
end; 

난 당신이 나에게 사람들을 도울 수 있기를 바랍니다!

답변

3

이미 절차가 CurPageChanged 인 경우 현재 페이지에 따라 버튼의 표시 여부를 설정할 수 있습니다. 해당 페이지를 볼 때 다음에만 나타납니다, 당신은 당신이에 볼 수 있도록하려는 페이지에서 실제로 버튼을 넣으면

... 

var 
    AboutButton: TNewButton; 

procedure CreateAboutButton(ParentForm: TSetupForm; CancelButton: TNewButton); 
begin 
    AboutButton := TNewButton.Create(ParentForm); 
    ... 
end; 


procedure CurPageChanged(CurPageID: Integer); 
begin 
    ... 
    AboutButton.Visible := CurPageID = SerialPage.ID; 
end; 
+0

어디에서이 코드를 붙여야합니까? – notusedanymore

+0

@korteder ????? –

+0

코드를 중계하는 방법을 모르겠습니다. 그것은 좋아 보이지만 어디에 붙여야할지 모르겠다. 전체 코드를 보낼 수 있습니까? – notusedanymore

1

: 물론 당신은 당신의 'AboutButton'글로벌 VAR를 확인해야합니다. 해당 페이지에 적합한 위치를 설정 한 다음 해당 페이지에 이미있는 다른 컨트롤의 Parent를 부모로 설정해야합니다.

그렇지 않으면 (일반 페이지 영역 외부에 표시하고 싶다면) Sertac이 말한대로하십시오.

관련 문제