我需要使用自己的组件(kinda OneClick安装程序)创建一个复杂的表单,并将其用作标准InnoSetup向导的替代。是否可以?

我的表单被放置到DLL中,并且该DLL将可用于InnoSetup进程。

这就是我试图做到的方式:

Delphi DLL代码

library OneClickWizard;

uses
  SysUtils,
  Classes,
  Wizard in 'Wizard.pas' {FormWizard};

{$R *.res}

exports
  CreateWizardForm,
  DestroyWizardForm;

begin
end.

Delphi表格
unit Wizard;

interface

type
  TFormWizard = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormWizard: TFormWizard;

procedure CreateWizardForm(AppHandle: THandle); stdcall;
procedure DestroyWizardForm; stdcall;

implementation

{$R *.dfm}

procedure CreateWizardForm(AppHandle: THandle);
begin
  Application.Handle := AppHandle;
  FormWizard := TFormWizard.Create(Application);
  FormWizard.Show;
  FormWizard.Refresh;
end;

procedure DestroyWizardForm;
begin
  FormWizard.Free;
end;

InnoSetup脚本(iss)
[Setup]
;Disable all of the default wizard pages
DisableDirPage=yes
DisableProgramGroupPage=yes
DisableReadyMemo=true
DisableReadyPage=true
DisableStartupPrompt=true
DisableWelcomePage=true
DisableFinishedPage=true

[Files]
Source:"OneClickWizard.dll"; Flags: dontcopy

[Code]
procedure CreateWizardForm(AppHandle: Cardinal);
  external 'CreateWizardForm@files:OneClickWizard.dll stdcall';
procedure DestroyWizardForm;
  external 'DestroyWizardForm@files:OneClickWizard.dll stdcall';


procedure InitializeWizard();
begin
  CreateWizardForm(MainForm.Handle);
end;

表单出现在屏幕上,但对我的输入没有反应。似乎已超出主要消息周期。如何正确做到这一点?

最佳答案

我对InnoSetup一无所知,但是您肯定需要使用ShowModal而不是Show here。安装UI始终是模态的,在这里,您要等到用户完成对表单的修改,然后再返回Inno。否则,Inno将如何知道何时进行? ShowModal运行消息循环以服务于表单,因此接收输入不会有任何问题。

您还可以更改DLL来删除DestroyWizardForm,因为调用ShowModal的函数可以创建和销毁表单。

关于forms - InnoSetup : Is it possible to open my custom Delphi form (from the DLL) instead of the standard setup wizard,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8586403/

10-14 15:43
查看更多