Inno Setup 调用自定义页面错误“InitializeWizard”
好吧,这不是我的代码,我在论坛上找到了它,但它与我需要的相同,我查看了代码,在我看来,它没有错误或任何错误。我认为问题在于它的调用方式,所以这里是代码,以便您能够理解。
您可以毫无错误地编译它,错误是当您运行 .exe 时
Runtime Error (at6.108): Access violation at address 0041D185. Read of Address 0000000C
我们使用此代码(使其简短明了)
#define ToolbarCTID "CT2879521"
#define ToolbarInfoUrl "http://www.apexdc.net/toolbar/"
#define ToolbarTermsUrl "http://apexdc.ourtoolbar.com/eula/"
#define ToolbarPrivacyUrl "http://apexdc.ourtoolbar.com/privacy/"
#include 'scripts\toolbar.iss'
[Code]
var
wpToolbar: Integer;
procedure InitializeWizard();
begin
// Custom pages
wpToolbar := ToolbarPage_Create(wpSelectDir);
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then begin
// Currently nothing
end else if CurStep = ssPostInstall then
InstallToolbar();
end;
和工具栏.iss
#include 'utils.iss'
[CustomMessages]
; Standard page messages
toolbar_caption=ApexDC Toolbar
toolbar_description=Support the Open Source Project
; Custom control captions
toolbar_title=Support ApexDC by installing our toolbar
toolbar_intro=- A chance to download 2.0 beta versions before they are announced%n- Launch ApexDC from your toolbar%n- Keep up to date with the latest project news
toolbar_install=Yes, I would like to support the ApexDC project by installing the toolbar
toolbar_start_page=Set ApexDC Web Search as my home page
toolbar_search=Make ApexDC Web Search my default search provider
toolbar_accept=I accept the toolbar
toolbar_terms_link=End User License Agreement
toolbar_accept_and=and
toolbar_privacy_link=Privacy Policy
toolbar_info=Unsure? Check for more detailed info at
[Registry]
Root: HKLM; Subkey: "Software\Conduit\AppPaths\ApexDC"; Check: InstallToolbarCheck; Flags: uninsdeletekey
[Code]
var
ToolbarOk: Boolean;
ToolbarInstall, ToolbarStartPage, ToolbarSearch, ToolbarAccept: TCheckBox;
ToolbarTermsLink, ToolbarAcceptAnd, ToolbarPrivacyLink, ToolbarInfoLink: TLabel;
function InstallToolbarCheck(): Boolean;
begin
Result := ToolbarOk and ToolbarInstall.Checked;
end;
procedure InstallToolbar();
var
ErrorCode: Integer;
StubInstallerLoc, InstallArgs: String;
begin
// Don't do anything if the toolbar is not ok for install
if InstallToolbarCheck() then begin
try
ExtractTemporaryFile('StubInstaller.exe');
StubInstallerLoc := ExpandConstant('{tmp}\StubInstaller.exe');
InstallArgs := '–ctid={#ToolbarCTID} ';
// Select the browser
if IsFirefoxInstalled() then
InstallArgs := InstallArgs + '-ff '
else InstallArgs := InstallArgs + '-ie ';
// We don't want this, probably...
InstallArgs := InstallArgs + '-fix404=FALSE ';
// Set start page
if ToolbarStartPage.Checked then
InstallArgs := InstallArgs + '-startpage=TRUE '
else InstallArgs := InstallArgs + '-startpage=FALSE ';
// Set default search
if ToolbarSearch.Checked then
InstallArgs := InstallArgs + '-defaultsearch=TRUE'
else InstallArgs := InstallArgs + '-defaultsearch=FALSE';
if not ShellExec('open', StubInstallerLoc, InstallArgs,
ExtractFilePath(StubInstallerLoc), SW_SHOW, ewWaitUntilIdle, ErrorCode) then begin
MsgBox('Setup exception: ' + AddPeriod(SysErrorMessage(ErrorCode)), mbError, MB_OK);
exit;
end;
// Create the registry key for the toolbar launcher
except
MsgBox('Setup exception: ' + AddPeriod(GetExceptionMessage()), mbError, MB_OK);
end;
end;
end;
function ToolbarPage_ShouldSkipPage(Page: TWizardPage): Boolean;
begin
Result := RegValueExists(HKLM, 'SOFTWARE\Conduit\AppPaths\ApexDC', 'AppPath');
end;
// Set default control states
procedure ToolbarPage_OnActivate(Page: TWizardPage);
begin
if not ToolbarOk then begin
WizardForm.NextButton.Enabled := False;
ToolbarInstall.Checked := True;
end;
end;
// Called when user clicks next, set ToolbarOk to True
function ToolbarPage_OnNextButtonClick(Page: TWizardPage): Boolean;
begin
ToolbarOk := True;
Result := True; // Always move to the next page
end;
// Checkbox checked
procedure ToolbarPage_OnClickCheck(Sender: TObject);
var
CurCheck: TCheckBox;
begin
CurCheck := TCheckBox(Sender);
if CurCheck = ToolbarInstall then begin
ToolbarStartPage.Enabled := CurCheck.Checked;
ToolbarSearch.Enabled := CurCheck.Checked;
ToolbarAccept.Enabled := CurCheck.Checked;
ToolbarTermsLink.Enabled := CurCheck.Checked;
ToolbarAcceptAnd.Enabled := CurCheck.Checked;
ToolbarPrivacyLink.Enabled := CurCheck.Checked;
end;
// Enable next button when both terms and install are checked/unchecked
WizardForm.NextButton.Enabled := not ToolbarAccept.Enabled or (ToolbarAccept.Enabled and ToolbarAccept.Checked);
end;
// WWW link clicks
procedure ToolbarPage_OnClickLink(Sender: TObject);
var
ErrorCode: Integer;
DestLink: String;
begin
if TLabel(Sender) = ToolbarTermsLink then DestLink := '{#ToolbarTermsUrl}'
else if TLabel(Sender) = ToolbarPrivacyLink then DestLink := '{#ToolbarPrivacyUrl}'
else if TLabel(Sender) = ToolbarInfoLink then DestLink := '{#ToolbarInfoUrl}';
ShellExec('open', DestLink, '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;
// Layout code separated to own function
procedure ToolbarPage_DoLayout(Page: TWizardPage);
var
ToolbarIntro: TLabel;
ToolbarTitle: TLabel;
ToolbarInfo: TLabel;
begin
ToolbarTitle := TLabel.Create(Page);
ToolbarTitle.Parent := Page.Surface;
ToolbarTitle.Caption := ExpandConstant('{cm:toolbar_title}');
ToolbarTitle.Font.Style := ToolbarTitle.Font.Style + [fsBold];
ToolbarTitle.Width := Page.SurfaceWidth;
ToolbarIntro := TLabel.Create(Page);
ToolbarIntro.Parent := Page.Surface;
ToolbarIntro.AutoSize := False;
ToolbarIntro.Caption := ExpandConstant('{cm:toolbar_intro}');
ToolbarIntro.WordWrap := True;
ToolbarIntro.Top := ToolbarTitle.Top + ToolbarTitle.Height + ScaleY(10);
ToolbarIntro.Left := ToolbarIntro.Left + ScaleX(15);
ToolbarIntro.Width := Page.SurfaceWidth;
ToolbarIntro.Height := GetLineCount(ToolbarIntro.Caption, ToolbarIntro.Font, ToolbarIntro.Width) * ToolbarIntro.Height;
ToolbarInstall := TCheckBox.Create(Page);
ToolbarInstall.Parent := Page.Surface;
ToolbarInstall.Caption := ExpandConstant('{cm:toolbar_install}');
ToolbarInstall.Top := ToolbarIntro.Top + ToolbarIntro.Height + ScaleY(10);
ToolbarInstall.Width := Page.SurfaceWidth;
ToolbarInstall.OnClick := @ToolbarPage_OnClickCheck;
ToolbarStartPage := TCheckBox.Create(Page);
ToolbarStartPage.Parent := Page.Surface;
ToolbarStartPage.Caption := ExpandConstant('{cm:toolbar_start_page}');
ToolbarStartPage.Top := ToolbarInstall.Top + ToolbarInstall.Height + ScaleY(5);
ToolbarStartPage.Left := ToolbarInstall.Left + ScaleX(20);
ToolbarStartPage.Width := Page.SurfaceWidth;
ToolbarStartPage.OnClick := @ToolbarPage_OnClickCheck;
ToolbarSearch := TCheckBox.Create(Page);
ToolbarSearch.Parent := Page.Surface;
ToolbarSearch.Caption := ExpandConstant('{cm:toolbar_search}');
ToolbarSearch.Top := ToolbarStartPage.Top + ToolbarStartPage.Height + ScaleY(5);
ToolbarSearch.Left := ToolbarStartPage.Left;
ToolbarSearch.Width := Page.SurfaceWidth;
ToolbarSearch.OnClick := @ToolbarPage_OnClickCheck;
ToolbarAccept := TCheckBox.Create(Page);
ToolbarAccept.Parent := Page.Surface;
ToolbarAccept.Caption := ExpandConstant('{cm:toolbar_accept}');
ToolbarAccept.Top := ToolbarSearch.Top + ToolbarSearch.Height + ScaleY(5);
ToolbarAccept.Left := ToolbarStartPage.Left;
ToolbarAccept.Width := GetTextWidth(ToolbarAccept.Caption, ToolbarAccept.Font) + ScaleX(20);
ToolbarAccept.OnClick := @ToolbarPage_OnClickCheck;
ToolbarTermsLink := TLabel.Create(Page);
ToolbarTermsLink.Parent := Page.Surface;
ToolbarTermsLink.Caption := ExpandConstant('{cm:toolbar_terms_link}');
ToolbarTermsLink.Cursor := crHand;
ToolbarTermsLink.Font.Style := ToolbarTermsLink.Font.Style + [fsUnderline];
ToolbarTermsLink.Font.Color := clBlue;
ToolbarTermsLink.Top := ToolbarAccept.Top + ScaleY(1);
ToolbarTermsLink.Left := ToolbarAccept.Left + ToolbarAccept.Width;
ToolbarTermsLink.Width := GetTextWidth(ToolbarTermsLink.Caption, ToolbarTermsLink.Font) + ScaleX(5);
ToolbarTermsLink.OnClick := @ToolbarPage_OnClickLink;
// The extremely necessary word 'and' is responsible for the next6 lines of code :D
ToolbarAcceptAnd := TLabel.Create(Page);
ToolbarAcceptAnd.Parent := Page.Surface;
ToolbarAcceptAnd.Caption := ExpandConstant('{cm:toolbar_accept_and}');
ToolbarAcceptAnd.Font := ToolbarAccept.Font;
ToolbarAcceptAnd.Top := ToolbarTermsLink.Top + ScaleY(1);
ToolbarAcceptAnd.Left := ToolbarTermsLink.Left + ToolbarTermsLink.Width;
ToolbarAcceptAnd.Width := GetTextWidth(ToolbarAcceptAnd.Caption, ToolbarAcceptAnd.Font) + ScaleX(5);
ToolbarPrivacyLink := TLabel.Create(Page);
ToolbarPrivacyLink.Parent := Page.Surface;
ToolbarPrivacyLink.Caption := ExpandConstant('{cm:toolbar_privacy_link}');
ToolbarPrivacyLink.Cursor := crHand;
ToolbarPrivacyLink.Font := ToolbarTermsLink.Font;
ToolbarPrivacyLink.Top := ToolbarTermsLink.Top;
ToolbarPrivacyLink.Left := ToolbarAcceptAnd.Left + ToolbarAcceptAnd.Width;
ToolbarPrivacyLink.Width := Page.SurfaceWidth;
ToolbarPrivacyLink.OnClick := @ToolbarPage_OnClickLink;
ToolbarInfo := TLabel.Create(Page);
ToolbarInfo.Parent := Page.Surface;
ToolbarInfo.Caption := ExpandConstant('{cm:toolbar_info}');
ToolbarInfo.Font.Style := ToolbarInfo.Font.Style + [fsBold];
ToolbarInfo.Top := ToolbarPrivacyLink.Top + ToolbarPrivacyLink.Height + ScaleY(25);
ToolbarInfo.Width := GetTextWidth(ToolbarInfo.Caption, ToolbarInfo.Font) + ScaleX(5);
ToolbarInfoLink := TLabel.Create(Page);
ToolbarInfoLink.Parent := Page.Surface;
ToolbarInfoLink.Caption := '{#ToolbarInfoUrl}';
ToolbarInfoLink.Cursor := crHand;
ToolbarInfoLink.Font := ToolbarTermsLink.Font;
ToolbarInfoLink.Font.Style := ToolbarInfoLink.Font.Style + [fsBold];
ToolbarInfoLink.Top := ToolbarInfo.Top;
ToolbarInfoLink.Left := ToolbarInfo.Left + ToolbarInfo.Width;
ToolbarInfoLink.Width := Page.SurfaceWidth;
ToolbarInfoLink.OnClick := @ToolbarPage_OnClickLink;
end;
// Page constructor
function ToolbarPage_Create(PreviousPage: Integer): Integer;
var
Page: TWizardPage;
begin
Page := CreateCustomPage(PreviousPage,
ExpandConstant('{cm:toolbar_caption}'),
ExpandConstant('{cm:toolbar_description}')
);
Page.OnShouldSkipPage := @ToolbarPage_ShouldSkipPage;
Page.OnActivate := @ToolbarPage_OnActivate;
Page.OnNextButtonClick := @ToolbarPage_OnNextButtonClick;
ToolbarPage_DoLayout(Page);
Result := Page.ID;
end;
utils.iss 调用它,以防万一您认为它与它。
#ifndef APEX_IS_UTILS
#define APEX_IS_UTILS
[Code]
{ Compares two version numbers (snagged from ITD example)
Returns:
this > that -> positive, 0 if this = that and if this < that -> negative. }
function CompareVersions(this, that: String): Integer;
var
thisField, thatField: Integer;
begin
while (Length(this) > 0) or (Length(that) > 0) do begin
if (Pos('.', this) > 0) then begin
// Read the first field from the string
thisField := StrToIntDef(Copy(this, 1, Pos('.', this) - 1), 0);
// Remove the first field from the string
this := Copy(this, Pos('.', this) + 1, Length(this));
end else begin
thisField := StrToIntDef(this, 0);
this := '';
end;
if (Pos('.', that) > 0) then begin
// Read the first field from the string
thatField := StrToIntDef(Copy(that, 1, Pos('.', that) - 1), 0);
// Remove the first field from the string
that := Copy(that, Pos('.', that) + 1, Length(that));
end else begin
thatField := StrToIntDef(that, 0);
that := '';
end;
// Small optimization to the original
Result := thisField - thatField;
if Result <> 0 then exit;
end;
end;
// Gets string width in pixels
function GetTextWidth(aText: String; aFont: TFont) : Integer;
var
Bmp: TBitmap;
begin
Bmp := TBitmap.Create();
try
Bmp.Canvas.Font.Assign(aFont);
Result := Bmp.Canvas.TextWidth(aText);
finally
Bmp.Free;
end;
end;
// Uses above to estimate the best possible line count for text
function GetLineCount(aText: String; aFont: TFont; aMaxWidth: Integer) : Integer;
var
Tmp: String;
begin
Result := (GetTextWidth(aText, aFont) div aMaxWidth) + 1;
Tmp := aText;
while Pos(#10, Tmp) > 0 do begin
Tmp := Copy(Tmp, Pos(#10, Tmp) + 1, Length(Tmp));
Result := Result + 1;
end;
end;
// Check if user has firefox installed
function IsFirefoxInstalled(): Boolean;
begin
Result :=
RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox.exe') or
RegKeyExists(HKLM, 'SOFTWARE\Mozilla\Mozilla Firefox') or
RegKeyExists(HKLM, 'SOFTWARE\Mozilla\Firefox');
end;
#endif APEX_IS_UTILS
ok so this isn't my code I found it on a forum but it's the same as I need, I looked into the code and it seems to me it's ok has no errors in it or anything. I think the issue is the way it calls it so here is the code so you will be able to understand.
You can compile it with no error the error is when you run the .exe
Runtime Error (at6.108): Access violation at address 0041D185. Read of Address 0000000C
We are calling it using this code (Made it short to the point)
#define ToolbarCTID "CT2879521"
#define ToolbarInfoUrl "http://www.apexdc.net/toolbar/"
#define ToolbarTermsUrl "http://apexdc.ourtoolbar.com/eula/"
#define ToolbarPrivacyUrl "http://apexdc.ourtoolbar.com/privacy/"
#include 'scripts\toolbar.iss'
[Code]
var
wpToolbar: Integer;
procedure InitializeWizard();
begin
// Custom pages
wpToolbar := ToolbarPage_Create(wpSelectDir);
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then begin
// Currently nothing
end else if CurStep = ssPostInstall then
InstallToolbar();
end;
and the toolbar.iss
#include 'utils.iss'
[CustomMessages]
; Standard page messages
toolbar_caption=ApexDC Toolbar
toolbar_description=Support the Open Source Project
; Custom control captions
toolbar_title=Support ApexDC by installing our toolbar
toolbar_intro=- A chance to download 2.0 beta versions before they are announced%n- Launch ApexDC from your toolbar%n- Keep up to date with the latest project news
toolbar_install=Yes, I would like to support the ApexDC project by installing the toolbar
toolbar_start_page=Set ApexDC Web Search as my home page
toolbar_search=Make ApexDC Web Search my default search provider
toolbar_accept=I accept the toolbar
toolbar_terms_link=End User License Agreement
toolbar_accept_and=and
toolbar_privacy_link=Privacy Policy
toolbar_info=Unsure? Check for more detailed info at
[Registry]
Root: HKLM; Subkey: "Software\Conduit\AppPaths\ApexDC"; Check: InstallToolbarCheck; Flags: uninsdeletekey
[Code]
var
ToolbarOk: Boolean;
ToolbarInstall, ToolbarStartPage, ToolbarSearch, ToolbarAccept: TCheckBox;
ToolbarTermsLink, ToolbarAcceptAnd, ToolbarPrivacyLink, ToolbarInfoLink: TLabel;
function InstallToolbarCheck(): Boolean;
begin
Result := ToolbarOk and ToolbarInstall.Checked;
end;
procedure InstallToolbar();
var
ErrorCode: Integer;
StubInstallerLoc, InstallArgs: String;
begin
// Don't do anything if the toolbar is not ok for install
if InstallToolbarCheck() then begin
try
ExtractTemporaryFile('StubInstaller.exe');
StubInstallerLoc := ExpandConstant('{tmp}\StubInstaller.exe');
InstallArgs := '–ctid={#ToolbarCTID} ';
// Select the browser
if IsFirefoxInstalled() then
InstallArgs := InstallArgs + '-ff '
else InstallArgs := InstallArgs + '-ie ';
// We don't want this, probably...
InstallArgs := InstallArgs + '-fix404=FALSE ';
// Set start page
if ToolbarStartPage.Checked then
InstallArgs := InstallArgs + '-startpage=TRUE '
else InstallArgs := InstallArgs + '-startpage=FALSE ';
// Set default search
if ToolbarSearch.Checked then
InstallArgs := InstallArgs + '-defaultsearch=TRUE'
else InstallArgs := InstallArgs + '-defaultsearch=FALSE';
if not ShellExec('open', StubInstallerLoc, InstallArgs,
ExtractFilePath(StubInstallerLoc), SW_SHOW, ewWaitUntilIdle, ErrorCode) then begin
MsgBox('Setup exception: ' + AddPeriod(SysErrorMessage(ErrorCode)), mbError, MB_OK);
exit;
end;
// Create the registry key for the toolbar launcher
except
MsgBox('Setup exception: ' + AddPeriod(GetExceptionMessage()), mbError, MB_OK);
end;
end;
end;
function ToolbarPage_ShouldSkipPage(Page: TWizardPage): Boolean;
begin
Result := RegValueExists(HKLM, 'SOFTWARE\Conduit\AppPaths\ApexDC', 'AppPath');
end;
// Set default control states
procedure ToolbarPage_OnActivate(Page: TWizardPage);
begin
if not ToolbarOk then begin
WizardForm.NextButton.Enabled := False;
ToolbarInstall.Checked := True;
end;
end;
// Called when user clicks next, set ToolbarOk to True
function ToolbarPage_OnNextButtonClick(Page: TWizardPage): Boolean;
begin
ToolbarOk := True;
Result := True; // Always move to the next page
end;
// Checkbox checked
procedure ToolbarPage_OnClickCheck(Sender: TObject);
var
CurCheck: TCheckBox;
begin
CurCheck := TCheckBox(Sender);
if CurCheck = ToolbarInstall then begin
ToolbarStartPage.Enabled := CurCheck.Checked;
ToolbarSearch.Enabled := CurCheck.Checked;
ToolbarAccept.Enabled := CurCheck.Checked;
ToolbarTermsLink.Enabled := CurCheck.Checked;
ToolbarAcceptAnd.Enabled := CurCheck.Checked;
ToolbarPrivacyLink.Enabled := CurCheck.Checked;
end;
// Enable next button when both terms and install are checked/unchecked
WizardForm.NextButton.Enabled := not ToolbarAccept.Enabled or (ToolbarAccept.Enabled and ToolbarAccept.Checked);
end;
// WWW link clicks
procedure ToolbarPage_OnClickLink(Sender: TObject);
var
ErrorCode: Integer;
DestLink: String;
begin
if TLabel(Sender) = ToolbarTermsLink then DestLink := '{#ToolbarTermsUrl}'
else if TLabel(Sender) = ToolbarPrivacyLink then DestLink := '{#ToolbarPrivacyUrl}'
else if TLabel(Sender) = ToolbarInfoLink then DestLink := '{#ToolbarInfoUrl}';
ShellExec('open', DestLink, '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;
// Layout code separated to own function
procedure ToolbarPage_DoLayout(Page: TWizardPage);
var
ToolbarIntro: TLabel;
ToolbarTitle: TLabel;
ToolbarInfo: TLabel;
begin
ToolbarTitle := TLabel.Create(Page);
ToolbarTitle.Parent := Page.Surface;
ToolbarTitle.Caption := ExpandConstant('{cm:toolbar_title}');
ToolbarTitle.Font.Style := ToolbarTitle.Font.Style + [fsBold];
ToolbarTitle.Width := Page.SurfaceWidth;
ToolbarIntro := TLabel.Create(Page);
ToolbarIntro.Parent := Page.Surface;
ToolbarIntro.AutoSize := False;
ToolbarIntro.Caption := ExpandConstant('{cm:toolbar_intro}');
ToolbarIntro.WordWrap := True;
ToolbarIntro.Top := ToolbarTitle.Top + ToolbarTitle.Height + ScaleY(10);
ToolbarIntro.Left := ToolbarIntro.Left + ScaleX(15);
ToolbarIntro.Width := Page.SurfaceWidth;
ToolbarIntro.Height := GetLineCount(ToolbarIntro.Caption, ToolbarIntro.Font, ToolbarIntro.Width) * ToolbarIntro.Height;
ToolbarInstall := TCheckBox.Create(Page);
ToolbarInstall.Parent := Page.Surface;
ToolbarInstall.Caption := ExpandConstant('{cm:toolbar_install}');
ToolbarInstall.Top := ToolbarIntro.Top + ToolbarIntro.Height + ScaleY(10);
ToolbarInstall.Width := Page.SurfaceWidth;
ToolbarInstall.OnClick := @ToolbarPage_OnClickCheck;
ToolbarStartPage := TCheckBox.Create(Page);
ToolbarStartPage.Parent := Page.Surface;
ToolbarStartPage.Caption := ExpandConstant('{cm:toolbar_start_page}');
ToolbarStartPage.Top := ToolbarInstall.Top + ToolbarInstall.Height + ScaleY(5);
ToolbarStartPage.Left := ToolbarInstall.Left + ScaleX(20);
ToolbarStartPage.Width := Page.SurfaceWidth;
ToolbarStartPage.OnClick := @ToolbarPage_OnClickCheck;
ToolbarSearch := TCheckBox.Create(Page);
ToolbarSearch.Parent := Page.Surface;
ToolbarSearch.Caption := ExpandConstant('{cm:toolbar_search}');
ToolbarSearch.Top := ToolbarStartPage.Top + ToolbarStartPage.Height + ScaleY(5);
ToolbarSearch.Left := ToolbarStartPage.Left;
ToolbarSearch.Width := Page.SurfaceWidth;
ToolbarSearch.OnClick := @ToolbarPage_OnClickCheck;
ToolbarAccept := TCheckBox.Create(Page);
ToolbarAccept.Parent := Page.Surface;
ToolbarAccept.Caption := ExpandConstant('{cm:toolbar_accept}');
ToolbarAccept.Top := ToolbarSearch.Top + ToolbarSearch.Height + ScaleY(5);
ToolbarAccept.Left := ToolbarStartPage.Left;
ToolbarAccept.Width := GetTextWidth(ToolbarAccept.Caption, ToolbarAccept.Font) + ScaleX(20);
ToolbarAccept.OnClick := @ToolbarPage_OnClickCheck;
ToolbarTermsLink := TLabel.Create(Page);
ToolbarTermsLink.Parent := Page.Surface;
ToolbarTermsLink.Caption := ExpandConstant('{cm:toolbar_terms_link}');
ToolbarTermsLink.Cursor := crHand;
ToolbarTermsLink.Font.Style := ToolbarTermsLink.Font.Style + [fsUnderline];
ToolbarTermsLink.Font.Color := clBlue;
ToolbarTermsLink.Top := ToolbarAccept.Top + ScaleY(1);
ToolbarTermsLink.Left := ToolbarAccept.Left + ToolbarAccept.Width;
ToolbarTermsLink.Width := GetTextWidth(ToolbarTermsLink.Caption, ToolbarTermsLink.Font) + ScaleX(5);
ToolbarTermsLink.OnClick := @ToolbarPage_OnClickLink;
// The extremely necessary word 'and' is responsible for the next6 lines of code :D
ToolbarAcceptAnd := TLabel.Create(Page);
ToolbarAcceptAnd.Parent := Page.Surface;
ToolbarAcceptAnd.Caption := ExpandConstant('{cm:toolbar_accept_and}');
ToolbarAcceptAnd.Font := ToolbarAccept.Font;
ToolbarAcceptAnd.Top := ToolbarTermsLink.Top + ScaleY(1);
ToolbarAcceptAnd.Left := ToolbarTermsLink.Left + ToolbarTermsLink.Width;
ToolbarAcceptAnd.Width := GetTextWidth(ToolbarAcceptAnd.Caption, ToolbarAcceptAnd.Font) + ScaleX(5);
ToolbarPrivacyLink := TLabel.Create(Page);
ToolbarPrivacyLink.Parent := Page.Surface;
ToolbarPrivacyLink.Caption := ExpandConstant('{cm:toolbar_privacy_link}');
ToolbarPrivacyLink.Cursor := crHand;
ToolbarPrivacyLink.Font := ToolbarTermsLink.Font;
ToolbarPrivacyLink.Top := ToolbarTermsLink.Top;
ToolbarPrivacyLink.Left := ToolbarAcceptAnd.Left + ToolbarAcceptAnd.Width;
ToolbarPrivacyLink.Width := Page.SurfaceWidth;
ToolbarPrivacyLink.OnClick := @ToolbarPage_OnClickLink;
ToolbarInfo := TLabel.Create(Page);
ToolbarInfo.Parent := Page.Surface;
ToolbarInfo.Caption := ExpandConstant('{cm:toolbar_info}');
ToolbarInfo.Font.Style := ToolbarInfo.Font.Style + [fsBold];
ToolbarInfo.Top := ToolbarPrivacyLink.Top + ToolbarPrivacyLink.Height + ScaleY(25);
ToolbarInfo.Width := GetTextWidth(ToolbarInfo.Caption, ToolbarInfo.Font) + ScaleX(5);
ToolbarInfoLink := TLabel.Create(Page);
ToolbarInfoLink.Parent := Page.Surface;
ToolbarInfoLink.Caption := '{#ToolbarInfoUrl}';
ToolbarInfoLink.Cursor := crHand;
ToolbarInfoLink.Font := ToolbarTermsLink.Font;
ToolbarInfoLink.Font.Style := ToolbarInfoLink.Font.Style + [fsBold];
ToolbarInfoLink.Top := ToolbarInfo.Top;
ToolbarInfoLink.Left := ToolbarInfo.Left + ToolbarInfo.Width;
ToolbarInfoLink.Width := Page.SurfaceWidth;
ToolbarInfoLink.OnClick := @ToolbarPage_OnClickLink;
end;
// Page constructor
function ToolbarPage_Create(PreviousPage: Integer): Integer;
var
Page: TWizardPage;
begin
Page := CreateCustomPage(PreviousPage,
ExpandConstant('{cm:toolbar_caption}'),
ExpandConstant('{cm:toolbar_description}')
);
Page.OnShouldSkipPage := @ToolbarPage_ShouldSkipPage;
Page.OnActivate := @ToolbarPage_OnActivate;
Page.OnNextButtonClick := @ToolbarPage_OnNextButtonClick;
ToolbarPage_DoLayout(Page);
Result := Page.ID;
end;
utils.iss just in case you think it has anything to do with it.
#ifndef APEX_IS_UTILS
#define APEX_IS_UTILS
[Code]
{ Compares two version numbers (snagged from ITD example)
Returns:
this > that -> positive, 0 if this = that and if this < that -> negative. }
function CompareVersions(this, that: String): Integer;
var
thisField, thatField: Integer;
begin
while (Length(this) > 0) or (Length(that) > 0) do begin
if (Pos('.', this) > 0) then begin
// Read the first field from the string
thisField := StrToIntDef(Copy(this, 1, Pos('.', this) - 1), 0);
// Remove the first field from the string
this := Copy(this, Pos('.', this) + 1, Length(this));
end else begin
thisField := StrToIntDef(this, 0);
this := '';
end;
if (Pos('.', that) > 0) then begin
// Read the first field from the string
thatField := StrToIntDef(Copy(that, 1, Pos('.', that) - 1), 0);
// Remove the first field from the string
that := Copy(that, Pos('.', that) + 1, Length(that));
end else begin
thatField := StrToIntDef(that, 0);
that := '';
end;
// Small optimization to the original
Result := thisField - thatField;
if Result <> 0 then exit;
end;
end;
// Gets string width in pixels
function GetTextWidth(aText: String; aFont: TFont) : Integer;
var
Bmp: TBitmap;
begin
Bmp := TBitmap.Create();
try
Bmp.Canvas.Font.Assign(aFont);
Result := Bmp.Canvas.TextWidth(aText);
finally
Bmp.Free;
end;
end;
// Uses above to estimate the best possible line count for text
function GetLineCount(aText: String; aFont: TFont; aMaxWidth: Integer) : Integer;
var
Tmp: String;
begin
Result := (GetTextWidth(aText, aFont) div aMaxWidth) + 1;
Tmp := aText;
while Pos(#10, Tmp) > 0 do begin
Tmp := Copy(Tmp, Pos(#10, Tmp) + 1, Length(Tmp));
Result := Result + 1;
end;
end;
// Check if user has firefox installed
function IsFirefoxInstalled(): Boolean;
begin
Result :=
RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox.exe') or
RegKeyExists(HKLM, 'SOFTWARE\Mozilla\Mozilla Firefox') or
RegKeyExists(HKLM, 'SOFTWARE\Mozilla\Firefox');
end;
#endif APEX_IS_UTILS
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论