我想从用户那里得到多种不同类型的值(时间,压力,名称......)。我想定制我的输入框。但它只需要一个值。有没有办法使用delphi inputbox有多个值?
有没有什么办法可以解决这种情况,或者有什么组件可以使用?
我想从用户那里得到多种不同类型的值(时间,压力,名称......)。我想定制我的输入框。但它只需要一个值。有没有办法使用delphi inputbox有多个值?
有没有什么办法可以解决这种情况,或者有什么组件可以使用?
弗朗索瓦是对的。你已经达到了你得到的工具的极限。 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和表格单位。你已经包括了这些,所以最糟糕的是已经过去了。将表单添加到已具有至少一个表单的项目并不会影响项目大小,特别是不是我上面描述的仅具有八个控件的表单。
你是什么意思的“inputbox” - 一个TEdit?输入有许多不同的组件,可以做很多不同的事情。对于一个名字,TEdit是非常好的 - 但是随着时间的推移,你可能需要一个日历控件,而对于压力,你可能想要使用一个看起来很棒的数字控件。
是的,设计一个窗体!
Dialogs.InputBox旨在从用户那里获得1个字符串,快速而简单。
如果你想要更多,你必须设计一个入境表格。
如果您想要一个基本的对话框,您可以查看Dialogs.InputQuery中的代码,并将其用作编写自己的过程的起点。
如果你想要真正的交易,你必须挖掘和编码一个真正的窗体。
罗布肯尼迪是正确的..输入框不是一个好的选择... 你到底想要保存什么? Exe空间,资源或源代码?或者你只是想用你的“绿色”代码来保存环境?
如果你看看InputQuery函数,你会发现它所做的是创建一个TForm并创建一些TButtons/TLabels/TEdit,定位并显示模态的形式。
正是你会做一个新的形式,你会添加到您的项目..你身边可以验证,定制控件并将其定位甚至添加提示...
配合新形式。 ..
您不必将每个表单设置为自动创建,在创建表单进入项目选项后,选择表单选项并将不想自动创建的所有表单移动到右侧。
我最普遍使用这些非自动生成的表单的模式是类似以下内容:
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方法方法从记录或类认为是值填充对话框在例程中使用。我从来不试图从窗体外部操纵窗体上的控件,而是编写例程在窗体本身中执行它。
没有必要得到讨厌的弗朗索瓦。 –
谢谢,但我想让我的软件更轻,所以我不想在我的项目中添加更多的表单。 有一个例子,我发现,但它很难理解.. :( http://www.delphipages.com/forum/showthread.php?t=154839 – Rapunzo
我想我太累了,不知道它可能是解释为我现在看到了......改变了。 –