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

时间:2011-10-26 00:51:02

标签: delphi delphi-xe

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

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

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

这种方法有什么不对?

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

修改

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

  1. 两个界面:
  2. IResult - 定义为将所需数据从表单传送到UserInput。
  3. IUserInput - 从IResult中的表单获取用户输入。
  4. 两个创建者功能 - 每个接口一个。
  5. 接口的实现 - 每个接口一个对象,一个用于实际用户输入表单。
  6. 我已经写了detailed description这个解决方案。

    结束编辑

    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.
    

1 个答案:

答案 0 :(得分:6)

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

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

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

    但重点仍然是,您必须允许用户在检索之前提供输入。