我正在使用RemObjects的PascalScript(优秀)和SynEdit编辑器创建一个内置的脚本引擎.它几乎完成了使用PascalScript附带的IDE示例和SynEdit中的IDE示例 - 但是 - 我无法看到如何询问PascalScript编号的源代码行是否是"可执行的".(然后我可以用它来用'Delphi蓝点'标记SynEdit排水沟).我想我可能不得不对ROPS输出进行反汇编?
这里有PascalScript专家吗?谢谢.布莱恩.
我正在使用Inno setup studio编写一个pascal函数,它检查对象是否为null并执行某些操作
到目前为止我有:
XMLDocument.setProperty('SelectionLanguage', 'XPath');
XMLNode := XMLDocument.selectSingleNode(APath);
if (XMLNode=Null) then
begin
//do stuff
End
Else
//do other stuff
End
Run Code Online (Sandbox Code Playgroud)
但我一直在收到invalid variant operation错误.
如何在Inno Setup Pascal脚本代码中检查对象是否为空?
我已经在InnoSetup脚本的"其他任务"页面中添加了一个复选框
[Tasks]
Name: "StartMenuEntry" ; Description: "Start my app when Windows starts" ; GroupDescription: "Windows Startup"; MinVersion: 4,4;
Run Code Online (Sandbox Code Playgroud)
我希望在wpSelectTasks页面显示时初始化此复选框,并在Next单击按钮时读取值.我无法弄清楚如何访问复选框`checked'值.
function NextButtonClick(CurPageID: Integer): Boolean;
var
SelectTasksPage : TWizardPage ;
StartupCheckbox : TCheckbox ;
begin
Result := true ;
case CurPageID of
wpSelectTasks :
begin
SelectTasksPage := PageFromID (wpSelectTasks) ;
StartupCheckbox := TCheckbox (SelectTasksPage... { <== what goes here??? }
StartupCheckboxState := StartupCheckbox.Checked ;
end ;
end ;
end ;
Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的自定义页面中创建一个自定义复选框(因为它是一个单页安装程序),只需要一个没有对话框或任何东西的复选框,我正在尝试编译的安装程序非常线性和简单.
我想以这种方式在复选框上绑定"FILE3.EXE":如果选中复选框,则复制DestDir中的文件(FILE3.EXE),否则如果取消选中复选框,则在安装期间跳过文件(FILE3.EXE).
这是我使用的代码,显然缺少复选框代码,因为我无法做到这一点
[Files]
Source: FILE1.EXE; DestDir: {app};
Source: FILE2.EXE; DestDir: {app};
Source: FILE3.EXE; DestDir: {app}; //OPTIONAL
Run Code Online (Sandbox Code Playgroud) 我试图在运行时在Delphi中加载预编译的RemObjects Pascal脚本.但是,当我尝试加载时,Delphi除了"无法导入VALUE_TEAMCODE". Value_TeamCode是我已经在Pascal脚本中注册的Delphi应用程序中的一个函数.
这就是我在做的事情.下面是粗略的伪代码 - 实际代码分为多个文件.此外,SetCompiled当需要运行脚本时,下面的调用会在应用程序中发生.
关于代码的注意事项:
FPascalScript是aTPSScriptDebugger
...
//Register custom functions with Pascal Script
FuncsRegister;
//Load script
FPascalScript.Script.AddStrings(AContent);
//Compile script
FPascalScript.Compile;
//Get compiled script
FPascalScript.GetCompiled(sCompiledScript)
//Try and set script back in - ERROR Here 'Cannot Import VALUE_TEAMCODE'
FPascalScript.PascalScript.Debugger.SetCompiled(sCompiledScript);
...
Run Code Online (Sandbox Code Playgroud)
也许我错了.我不确定是否可以加载预编译的脚本.
我在RemObjects WebSite Wiki上搜索,但删除了Pascal脚本帮助.我还在StackOverflow上搜索了各种主题,但似乎没有与此问题相关.
再说一遍.我已经在运行时编译和执行脚本而没有任何问题.出于性能原因,我需要预编译.
任何帮助赞赏.
更新:
目前的解决方法是在我的系统中为每个脚本配备一个脚本引擎.然后,这些引擎在预编译后保留在内存中.这将删除每个脚本编译开销30毫秒.它也使用了更多的内存但不足以成为一个问题.
我仍然宁愿只使用一个脚本引擎.(因此需要加载预编译的脚本)
我需要获取用户选择安装我的应用程序的路径.
如果我设置CreateAppDir=yes并设置了一个DefaultDirName=C:\MyApp\用户可以将其更改为其他目录.完成此操作后,我需要知道他们在下一个安装向导步骤中选择了哪个目录.我怎样才能获得这个价值?
与此问题类似:
如何在Inno Setup安装脚本的[Run]部分设置进度条值?
当Inno Setup进入该[Run]部分时,进度条显示为100%并停在此位置.
我在本Run节中安装了许多文件,我希望重新启动进度条并控制它,因为它会安装每个程序.
状态消息很容易改变(StatusMsg),但我失去了一些进展.你能帮帮我吗?
例:
[Run]
Filename: "msiexec.exe"; Parameters: "/i ""msxml.msi"" /quiet"; \
StatusMsg: "MSXML..."; Flags: runascurrentuser
Filename: "msiexec.exe"; Parameters: "/i ""capicom_dc_sdk.msi"" /quiet"; \
StatusMsg: "CAPICOM..."; Flags: runascurrentuser
Run Code Online (Sandbox Code Playgroud)
由于我想在安装过程中控制进度条,我不知道该怎么做.我想也许在使用BeforeInstall参数,创建一个代码,通过执行类似WizardForm.ProgressGauge.Position = 0;和在AfterInstall参数中相反的方式将进度条设置为0 WizardForm.ProgressGauge.Position = 100;,但是在安装过程中如何更改?
谢谢.
在Inno Setup Pascal脚本中将布尔值转换为String的最简单方法是什么?应该完全隐含的这个微不足道的任务似乎需要一个完整的if/ else构造.
function IsDowngradeUninstall: Boolean;
begin
Result := IsCommandLineParamSet('downgrade');
MsgBox('IsDowngradeUninstall = ' + Result, mbInformation, MB_OK);
end;
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为"类型不匹配".IntToStr不接受Boolean.BoolToStr不存在.
我正在尝试在自定义页面上显示图像 我可以让自定义页面显示或在预定义页面上显示图像,但不能在自定义页面上显示。
我认为问题在于Parent := CustomPage.ID;.
Parent := WizardForm.SelectTasksPage; 虽然有效。
如何正确地做到这一点?
procedure ImageOnClick(Sender: TObject);
var
ErrorCode: Integer;
begin
ShellExec('', 'http://test.com', '', '', SW_SHOW, ewNoWait, ErrorCode);
end;
var
CustomPage: TWizardPage;
BtnImage: TBitmapImage;
procedure InitializeWizard;
begin
CustomPage := CreateCustomPage(wpLicense, 'Heading', 'Sub heading.');
ExtractTemporaryFile('image.bmp');
BtnImage := TBitmapImage.Create(WizardForm);
with BtnImage do
begin
Parent := CustomPage.ID;
Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\image.bmp');
AutoSize := True;
Left := 90;
Top := WizardForm.SelectTasksPage.Top + WizardForm.SelectTasksPage.Height - Height - 8;
Cursor := crHand;
OnClick := @ImageOnClick;
end;
end;
Run Code Online (Sandbox Code Playgroud) 德尔福部分:
我有一个关于事件的类,从那个事件我需要调用一个将接口对象传递给它的过程.它在Delphi中工作正常,但我在Pascal脚本中声明它有问题.
在后台 - IGPGraphics接口是一部分Delphi GDI+ library而没有方法定义如下:
type
IGdiplusBase = interface
['{24A5D3F5-4A9B-42A2-9F60-20825E2740F5}']
IGPGraphics = interface(IGdiPlusBase)
['{57F85BA4-CB01-4466-8441-948D03588F54}']
Run Code Online (Sandbox Code Playgroud)
以下是我在Pascal脚本中需要做的简化Delphi伪代码:
type
TRenderEvent = procedure(Sender: TObject; const GPGraphics: IGPGraphics) of object;
TRenderClass = class(TGraphicControl)
private
FOnRender: TRenderEvent;
public
property OnRender: TRenderEvent read FOnRender write FOnRender;
end;
// when the TRenderClass object instance fires its OnRender event I want to call
// the RenderObject procedure passing the IGPGraphics interfaced object to it; I
// hope I'm doing it right, I'm just a …Run Code Online (Sandbox Code Playgroud) pascalscript ×10
inno-setup ×8
delphi ×3
checkbox ×1
delphi-2009 ×1
ide ×1
installer ×1
pascal ×1
progress-bar ×1
remobjects ×1
scripting ×1
synedit ×1