我决定在基于inno-setup的安装程序中创建自定义向导页面.但我不想从头开始创建它.我想采取TInputDirWizardPage并修改它,例如添加一个组合框.可能吗?怎么做?
我需要将一个字符串值返回给调用inno安装脚本.问题是我找不到管理分配内存的方法.如果我在DLL端分配,我没有任何东西可以在脚本端解除分配.我不能使用输出参数,因为Pascal脚本中也没有分配函数.我该怎么办?
当我编译下面的Inno Setup脚本时,它给了我一个错误(下面).我从这里借了代码,所以我不确定为什么它不能正常工作.
Line 136:
Column 10:
Invalid prototype for 'FileDoesNotExist'
Run Code Online (Sandbox Code Playgroud)
第136行是 function FileDoesNotExist(file: string): Boolean;
[Run]
Filename: "{sys}\regsvr32.exe"; Parameters: "msstdfmt.dll"; WorkingDir: {app}\Pronto\Programs\; BeforeInstall: FileDoesNotExist(ExpandConstant('{sys}\msstdfmt.dll')); StatusMsg: "Registering Controls..."
[Code]
function FileDoesNotExist(file: string): Boolean;
begin
if (FileExists(file)) then
begin
Result := False;
end
else
begin
Result := True;
end;
end;
Run Code Online (Sandbox Code Playgroud) 您好我用Inno Setup(基于Delphi)替换文本文件中的文本有问题.
我的代码:
procedure FileReplaceString(const FileName, searchstring, replacestring: string);
var
fs: TFileStream;
S: string;
begin
fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone);
try
SetLength(S, fs.Size);
fs.ReadBuffer(S[1], fs.Size);
finally
fs.Free;
end;
{ the compiler stops here with: unknown identifier 'StringReplace' }
S := StringReplace(S, SearchString, replaceString, [rfReplaceAll, rfIgnoreCase]);
fs := TFileStream.Create(FileName, fmCreate);
try
fs.WriteBuffer(S[1], Length(S));
finally
fs.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
我发现我必须使用StringChange(),但我不知道如何在我的代码中使用它.我不太了解Delphi或Inno Setup.我希望你能帮助我.
我想在安装文件夹后调用一个函数,但是InstallEnv函数似乎被调用了好几次,也许每个文件都是文件夹(待确认).有没有办法在安装所有这些文件后只调用一次?我不能使用该Run部分,因为我想要使用返回代码进行错误捕获.
Source: "InputFiles\virtualenv-1.8.2\*"; DestDir: "{tmp}/virtualenv"; \
Flags: recursesubdirs; AfterInstall: InstallEnv;
Run Code Online (Sandbox Code Playgroud) 我在这里找到了一个我需要的代码.仅允许在文本框中写入数字.但我仍然想要更多,没有提供"下一步"按钮而没有在此文本框中写入数字.
可以帮我?
procedure NumbersOnly(Sender: TObject; var Key: Char);
var
S: string;
begin
S := ('1234567890'#8);
if Pos(Key, S) = 0 then
Key := #0;
end;
Run Code Online (Sandbox Code Playgroud) 有没有办法在代码部分中浏览和递归复制/移动目录的所有文件和子目录?(PrepareToInstall)
我需要忽略一个特定的目录,但是使用xcopy它会忽略所有目录/default/,例如,我只需要忽略一个特定的目录.
该Files部分在需要时稍后执行.
因此,给定此功能,我GetRoot := ROOTPage.Values[0];在行上收到错误"Identifier Expected" .我希望它告诉我ROOTPage没有定义?
const
DefaultRoot = 'C:\IAmGRoot';
Var
ROOTPage : TInputQueryWizardPage;
procedure SetupRoot;
begin
ROOTPage := CreateInputQueryPage(wpUserInfo,
ExpandConstant('{cm:RootTitle}'),
ExpandConstant('{cm:RootInstructions}'),
ExpandConstant('{cm:RootDescription}') + ' "' + DefaultRoot + '"'
);
ROOTPage.Add(ExpandConstant('{cm:SSRoot}') + ':', False);
ROOTPage.Values[0] := ExpandConstant('{DefaultRoot}');
// add SSROOT to path
end;
function GetRoot : string;
begin
GetRoot := ROOTPage.Values[0];
end;
Run Code Online (Sandbox Code Playgroud)
我该如何解释这个错误.Pascal中的标识符是什么?
这个页面告诉我标识符是变量名.也许我需要以ROOTPage.Values[0]某种方式扩展它,因为我从Inno Setup对象引用一个数组?
或许我需要以不同的方式返回值.我在Pascal上看到一个页面表示你需要避免在参数较少的函数上分配函数值以避免递归循环.这是否意味着我应该传递一个虚拟值?还是有不同的语法?该页面没有解释.
我暗自认为我的真正问题是我没有正确定义我的功能......但是很好.这至少可以编译.这个问题可能变成:你如何在Pascal中处理无参数函数?
我不认为Inno Setup是问题的一部分,但我正在与Inno Setup合作以防万一.
更新: 它似乎不是数组,因为它得到相同的错误:
const
DefaultRoot = 'C:\IAmGRoot';
function GetRoot : …Run Code Online (Sandbox Code Playgroud) 我需要检查一些端口是否可用?如何在 Inno Setup 中做到这一点?有没有办法在 Inno Setup 中使用套接字?有没有这方面的图书馆?如果有如何导入并使用它?
谢谢您的回答。
我正在使用 Inno Setup。我想要两个自定义页面,例如:
var
PasswordEdit: TPasswordEdit;
UserEdit: TEdit;
Page: TWizardPage;
Page2: TWizardPage;
...
Page := CreateCustomPage(wpWelcome, 'Page1', '');
Page2 := CreateCustomPage(wpWelcome, 'Page2', '');
Run Code Online (Sandbox Code Playgroud)
而是Page2出现在面前Page。这是创建更多自定义页面的正确方法吗?