我想要得到多个不同类型的价值(时间、压力、名字,...)从用户。我想要定我的输入框.但是,它只需要一个价值。

是否有任何方法来解决这种情况,或任何组件的使用?

有帮助吗?

解决方案

弗朗索瓦*是正确的。你已经达到限制的工具,你已经给出。 InputBox 只是不是设计用于复杂的输入,这是不能扩大到处理多种价值观。

你的网页链接到 在评论具有一个例子,但它提出了相当差,所以我不怪你误解。我花了几个读取得,太。在其核心是的 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形式 单元。你已经包括的那些,因此最糟糕的已经过去。添加一个形成对一个项目,已经有至少一种形式并不影响项目的大小很多,特别是没有的形式我上所述,其中只有八个控制。

其他提示

究竟你“输入框”意味着什么 - 一个TEDIT?有许多不同类型的输入组件,它可以做许多不同的事情的。对于名称,TEDIT很不错 - 但对于时间,你可能需要一个日历控件,以及压力可能要使用的数字看起来很大控制

是,设计一个表!

Dialogs.InputBox被设计为获取从用户,快速和简单的1串。结果 如果你想要更多,你要设计一个报名表。结果 如果你想有一个基本的对话框,你可以看看Dialogs.InputQuery代码,并把它作为一个起点,编写自己的程序。

如果你想真正的交易,你必须挖掘和代码真正形成。

罗伯肯尼迪是正确的..一个输入框是不是一个好的选择? 究竟什么是你想保存?埃克空间,ressources或源代码?或者你只是想环境保存在您的“绿色”的代码?

如果您在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方法填充方法从记录或类,其保持了在该程序中使用的值的对话框。我从来没有试图操纵窗体上的控件从表单之外,而是写程序做的形式本身。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top