如何从动态生成的表单中检索数据?

Chr*_*ton 1 delphi delphi-xe

我在从程序动态生成的表单中获取信息时遇到问题.

我的程序一直运行,直到它需要来自用户的数据; 此时它应该运行一个输入表单,并从中检索数据.

下面的示例代码运行并显示输入表单,但不允许任何输入.它确实在表单初始化时返回编辑框中文本的长度.

这种方法有什么不对?

如果可能的话,我想保持分离接口和实现(包括表单)的整体方法; 我还想继续使用无模式显示表单.

编辑

在调查了@Ken White建议的模态形式后,我确定模态形式不适合我试图做的事情.我提出了一个解决方案,总结如下:

  1. 两个接口:
  2. IResult - 定义为将表单中所需的数据传递给UserInput.
  3. IUserInput - 从IResult中的表单获取用户输入.
  4. 两个创建者功能 - 每个接口一个.
  5. 接口的实现 - 每个接口一个对象,一个用于实际用户输入表单.

我已经写了这个解决方案的详细说明.

结束编辑

program TestProject2;

uses Dialogs, Forms, StdCtrls, SysUtils;

type
  ITestForm = interface
    function getFormString: string;
    procedure setFormString(aString: string);
  end;

  TForm6 = class(TForm, ITestForm)
    Edit1: TEdit;
  private
    function getFormString: string;
    procedure setFormString(aString: string);
  end;

{$R Unit6.dfm}

function NewTestFormOutput: string;
  var
    tmpForm: TForm6;
  begin
    Application.CreateForm(TForm6, tmpForm);
    tmpForm.Show;
    Result := tmpForm.getFormString;
  end;

function TForm6.getFormString: string;
  begin
    Result := Edit1.Text;
  end;

procedure TForm6.setFormString(aString: string);
  begin
    Edit1.Text := aString;
  end;

var
  i: Integer;
  parser: string;
begin
  parser := NewTestFormOutput;
  i := Length(parser);
  ShowMessage('The length is: ' + InttoStr(i));
end.
Run Code Online (Sandbox Code Playgroud)

Ken*_*ite 6

您发布的代码不允许用户在检索内容之前提供任何输入TForm6.Edit1.Text.你基本上说:

  1. 创建表单
  2. 向用户显示
  3. 立即在表格的Edit1.Text中读取设计时设置的内容

如果您想从用户那里获取内容,您必须给他们一个机会将其提供给您.您需要使用ShowModal呈现表单并让用户输入内容,或者使用Show表单传回信息(通过某些机制PostMessage,如Gerry在评论中提到的事件处理程序),当用户单击按钮时你知道有要检索的数据.

但问题仍然是,您必须允许用户在检索之前提供输入.