我在从程序动态生成的表单中获取信息时遇到问题.
我的程序一直运行,直到它需要来自用户的数据; 此时它应该运行一个输入表单,并从中检索数据.
下面的示例代码运行并显示输入表单,但不允许任何输入.它确实在表单初始化时返回编辑框中文本的长度.
这种方法有什么不对?
如果可能的话,我想保持分离接口和实现(包括表单)的整体方法; 我还想继续使用无模式显示表单.
编辑
在调查了@Ken White建议的模态形式后,我确定模态形式不适合我试图做的事情.我提出了一个解决方案,总结如下:
我已经写了这个解决方案的详细说明.
结束编辑
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)
您发布的代码不允许用户在检索内容之前提供任何输入TForm6.Edit1.Text.你基本上说:
如果您想从用户那里获取内容,您必须给他们一个机会将其提供给您.您需要使用ShowModal呈现表单并让用户输入内容,或者使用Show表单传回信息(通过某些机制PostMessage,如Gerry在评论中提到的事件处理程序),当用户单击按钮时你知道有要检索的数据.
但问题仍然是,您必须允许用户在检索之前提供输入.