当前位置: 首页 > 知识库问答 >
问题:

Inno Setup/Pascal 脚本 - 强制转换返回 nil

卢树
2023-03-14

我正在尝试为我正在使用Inno Setup Compiler 5.5.1制作的安装程序编写一些Pascal脚本。我目前正在尝试添加一个执行命令的自定义向导页面,从文本字段(TEdit 组件)中获取用户输入。我定义了 NextButtonClick 函数,它检查页面 ID 是否是我定义的自定义页面,并尝试从字段中检索用户输入。当我从页面的 Surface 属性的组件中获取它时,它会作为 TComponent 返回。要获得下一个,我需要将其转换为 TEdit,所以我尝试强制转换它,它似乎返回 nil。除了过去几天我一直在做的Inno脚本之外,我对Pascal没有太多经验,所以我可能做错了什么。但我会感谢你的帮助!

这是代码块,为我提供了一个参考问题(保留了调试行):

function NextButtonClick(CurPageID: Integer): Boolean;
var
    ResultCode: Integer;
    CurrPage: TWizardPage;
    Server : TComponent;
    Server2: TEdit;
    SurfacePage : TNewNotebookPage;
    ServerStr : String;
begin
    if CurPageID = 100 then
    begin
      CurrPage := PageFromID(100);
      SurfacePage := CurrPage.Surface;
      Server := SurfacePage.Controls[0];
      Server2 := TEdit(Server);  // RETURNS NIL HERE
      if Server2 = nil then
        MsgBox('', mbInformation, MB_OK);
      ServerStr := Server2.Text;
      MsgBox(ServerStr, mbInformation, MB_OK);
      //ShellExec('', 'sqlcmd', '-S ' + ServerStr + ' -Q ":r setMemUsage.sql"', ExpandConstant('{app}') + '\sql', SW_SHOW, ewWaitUntilTerminated, ResultCode);

    end;
    Result := True;
end;

共有1个答案

江睿
2023-03-14

我无法模拟你的问题。我用过这个极简主义的代码:

[Code]
var
  CustomPageID: Integer;

procedure InitializeWizard;
var
  EditBox: TEdit;
  CustomPage: TWizardPage;
begin
  CustomPage := CreateCustomPage(wpWelcome, '', '');
  CustomPageID := CustomPage.ID;
  EditBox := TEdit.Create(WizardForm);
  EditBox.Parent := CustomPage.Surface;
end;

procedure CurPageChanged(CurPageID: Integer);
var
  EditBox: TEdit;
  Component: TComponent;
  CustomPage: TWizardPage;
begin
  if (CurPageID = CustomPageID) then
  begin
    CustomPage := PageFromID(CustomPageID);
    Component := CustomPage.Surface.Controls[0];
    if (Component is TEdit) then
    begin
      MsgBox('Controls[0] is assigned and is TEdit', mbInformation, MB_OK);
      EditBox := TEdit(Component);
      EditBox.Text := 'Hi, I''m just a modified edit text!';
    end;
  end;
end;
 类似资料:
  • 我试图返回一个列表,并将该响应重定向到我的模型类。 例如:如果我使用,它工作得很好,但我不想为每个模型编写响应方法。 方法 错误 出现错误(Type=内部服务器错误,状态=500)。创建名为“index”的bean时出错:调用init方法失败;嵌套异常为java.lang.ClassCastException:java.util.LinkedHashMap不能强制转换为com.xxx.Applic

  • 我尝试通过methodhandles将方法链接在一起,其中一些方法来自泛型类型。如果函数返回泛型类型,我必须为MethodType指定Object.Class,但我看不到将其转换回泛型类型参数类型的简单方法。在大多数情况下,这没有问题,因为invoke似乎自动转换它们,但我必须创建mhs,它可以用InvokeExact运行。难道没有简单的方法使用MethodHandles进行强制转换吗? 我的测试

  • 有没有一种简单的方法可以做到这一点: 编辑:我写了一份正确答案的工作副本:

  • 隐含的强制转换 隐含的 强制转换是指这样的类型转换:它们是隐藏的,由于其他的动作隐含地发生的不明显的副作用。换句话说,任何(对你)不明显的类型转换都是 隐含的强制转换。 虽然 明确的 强制转换的目的很明白,但是这可能 太过 明显 —— 隐含的 强制转换拥有相反的目的:使代码更难理解。 从表面上来看,我相信这就是许多关于强制转换的愤怒的源头。绝大多数关于“JavaScript强制转换”的抱怨实际上都

  • 明确的强制转换 明确的 强制转换指的是明显且明确的类型转换。对于大多数开发者来说,有很多类型转换的用法可以清楚地归类于这种 明确的 强制转换。 我们在这里的目标是,在我们的代码中指明一些模式,在这些模式中我们可以清楚明白地将一个值从一种类型转换至另一种类型,以确保不给未来将读到这段代码的开发者留下任何坑。我们越明确,后来的人就越容易读懂我们的代码,也不必费太多的力气去理解我们的意图。 关于 明确的

  • 大家好,我在一个使用SpringDataJPA的SpringMVC项目中工作,我在一个从JpaRepository扩展而来的接口中有一个nativeQuey,在该查询中,我从不同的表中选择一些值,并返回一个 我打印了该ArrayList的值,其内容如下: 由于查询返回3行,每行有7个值,我怀疑这些对象是3(列表),每个列表有7个字段,我非常确定它们是字符串和int,我在类中有两个导入,我想在其中强