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