2009-12-10 57 views

回答

7

弗朗索瓦是对的。你已经达到了你得到的工具的极限。 InputBox根本不是为复杂输入而设计的,它也不是为扩展以处理多个值而设计的。

The page you linked to在你的评论中有一个例子,但它的表现很差,所以我不会责怪你误解它。我花了一些读也得到了。其核心是底部的MyAsk功能。 (忽略顶部的TAppendThread类声明,没用。)MyAsk接受带有提示和值的记录列表,并且对于每条记录,它调用InputBox向用户请求值。没有记录可能会更容易理解。它可以被改写这样的:

procedure MultiInputBox(const Prompts: array of string; var Values: array of string]); 
var 
    i: Integer; 
begin 
    Assert(Length(Prompts) = Length(Values)); 
    for i := 0 to High(Prompts) do begin 
    Values[i] := InputBox(Application.Title, Prompts[i], Values[i]); 
    end; 
end; 

这样称呼它:

TempTime := TimeToStr(DefaultTime); 
TempPressure := IntToStr(DefaultPressure); 
TempName := DefaultName; 
MultiInputBox(['Time', 'Pressure', 'Name'], [TempTime, TempPressure, TempName]); 
TimeToUse := StrToTime(TempTime); 
PressureToUse := StrToInt(TempPressure); 
NameToUse := TempName; 

这是一个可怕的接口为用户,虽然。没有办法返回,没有办法取消,没有迹象表明审讯将持续多久,并且没有办法强制某些数据类型的格式。如果你设计一个自定义表单来获得你所需要的信息,那么你真的会变得更好。您正在使用一种工具来设计关于世界上最简单的事物的表格。不要抵制这一点。

如果您需要获取时间,压力和名称,然后制作一个带有三个输入控件的窗体。时间使用TDateTimePicker,对于数字输入请考虑TSpinEdit,并使用TEdit作为名称。将TLabel控件放在每个输入旁边,以便用户知道每个输入的用途。将确定和取消按钮放在窗体上。设置各种其他表单属性,例如边框样式和标题。有几乎没有代码写在那种形式。不过,您可以自由添加代码来验证输入值,以确保它们有意义。

要使用它,只需创建它,填充其初始值,以模态方式显示它,并在关闭时读取新值。

var 
    form: TDatePressureNameDialog; 
begin 
    form := TDatePressureNameDialog.Create(nil); 
    try 
    form.TimePicker.Value := DefaultTime; 
    form.PressureEdit.Value := DefaultPressure; 
    form.NameEdit.Text := DefaultName; 
    if form.ShowModal = mrOK then begin 
     TimeToUse := Frac(form.TimePicker.Value); 
     PressureToUse := form.PressureEdit.Value; 
     NameToUse := form.NameEdit.Text; 
    end; 
    finally 
    form.Free; 
    end; 
end; 

另请注意我如何检查ShowModal方法的结果。这可以让你知道用户是按下“确定”还是“取消”来关闭表单。您不能用InputBox这样做,它总是返回一个字符串。 (InputQuery可以告诉你这些信息,这是这两种功能之间的主要区别,但这并不能真正使这两种功能都值得在你的情况下使用)。

不要担心这个新的表单类别你的项目。对项目规模影响最大的两件事是SysUtils表格单位。你已经包括了这些,所以最糟糕的是已经过去了。将表单添加到已具有至少一个表单的项目并不会影响项目大小,特别是不是我上面描述的仅具有八个控件的表单。

3

你是什么意思的“inputbox” - 一个TEdit?输入有许多不同的组件,可以做很多不同的事情。对于一个名字,TEdit是非常好的 - 但是随着时间的推移,你可能需要一个日历控件,而对于压力,你可能想要使用一个看起来很棒的数字控件。

3

是的,设计一个窗体!

Dialogs.InputBox旨在从用户那里获得1个字符串,快速而简单。
如果你想要更多,你必须设计一个入境表格。
如果您想要一个基本的对话框,您可以查看Dialogs.InputQuery中的代码,并将其用作编写自己的过程的起点。

如果你想要真正的交易,你必须挖掘和编码一个真正的窗体。

+3

没有必要得到讨厌的弗朗索瓦。 –

+0

谢谢,但我想让我的软件更轻,所以我不想在我的项目中添加更多的表单。 有一个例子,我发现,但它很难理解.. :( http://www.delphipages.com/forum/showthread.php?t=154839 – Rapunzo

+0

我想我太累了,不知道它可能是解释为我现在看到了......改变了。 –

0

罗布肯尼迪是正确的..输入框不是一个好的选择... 你到底想要保存什么? Exe空间,资源或源代码?或者你只是想用你的“绿色”代码来保存环境?

如果你看看InputQuery函数,你会发现它所做的是创建一个TForm并创建一些TButtons/TLabels/TEdit,定位并显示模态的形式。

正是你会做一个新的形式,你会添加到您的项目..你身边可以验证,定制控件并将其定位甚至添加提示...

配合新形式。 ..

0

您不必将每个表单设置为自动创建,在创建表单进入项目选项后,选择表单选项并将不想自动创建的所有表单移动到右侧。

我最普遍使用这些非自动生成的表单的模式是类似以下内容:

Function GetValuesFromDialog : boolean; 
var 
    dlg : tValuesDialog; 
begin 
    result := false; 
    dlg := tValuesDialog.Create(nil); 
    try 
    // set initial values in dialog 
    dlg.SetValues(rData); 
    // show the dialog 
    result := dlg.ShowModal = mrOk; 
    // pull values from dialog 
    if result then 
     dlg.GetValues(rData); 
    finally 
    dlg.free; 
    end; 
end; 

中的GetValues/setValues方法方法从记录或类认为是值填充对话框在例程中使用。我从来不试图从窗体外部操纵窗体上的控件,而是编写例程在窗体本身中执行它。

相关问题