我想从用户那里获得多种不同类型的值(时间,压力,名称......)。我想自定义我的输入框。但它只需要一个值。
有没有办法解决这种情况或使用的任何组件?
答案 0 :(得分: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
来执行此操作,{{1}}始终返回一个字符串。 (InputQuery
可以告诉你这些信息,这是这两个函数之间的主要区别,但仅凭这一点并不能使这两种函数在你的情况下值得使用。)
不要担心这个新的表单类会影响您的项目。对项目大小影响最大的两件事是 SysUtils 和 Forms 单位。你已经包含了那些,所以最糟糕的已经过去了。将表单添加到已经包含至少一个表单的项目中根本不会影响项目大小,尤其不是上面描述的表单,它只有八个控件。
答案 1 :(得分:3)
你究竟是什么意思“输入框” - 一个TEdit?输入有许多不同类型的组件,可以做很多不同的事情。对于一个名字,TEdit非常好 - 但是随着时间的推移,你可能想要一个日历控件,而对于压力,你可能想要使用一个看起来很适合数字的控件。
答案 2 :(得分:3)
是的,设计表格!
Dialogs.InputBox旨在从用户那里获得1个字符串,快速而简单 如果您想要更多,您必须设计一个报名表 如果需要基本对话框,可以查看Dialogs.InputQuery中的代码,并将其用作编写自己的过程的起点。
如果你想要真正的交易,你必须深入挖掘并编写真实的表格。
答案 3 :(得分:0)
Rob's Kennedy是对的..输入框不是一个好选择...... 你到底想要保存什么? Exe Space,ressources或源代码?或者您只是想用“绿色”代码保存环境?
如果你看一下InputQuery函数,你会发现它的作用是创建一个TForm,然后创建一些TButtons / TLabels / TEdit,position和show modal形式。
您要对要添加到项目中的新表单执行什么操作..旁边您可以验证,自定义控件并定位它们甚至添加提示......
使用新表单...
答案 4 :(得分: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方法从包含例程中使用的值的记录或类填充对话框。我从不尝试从表单外部操作表单上的控件,而是编写例程以在表单本身中执行它。