Есть ли какой-нибудь способ использовать delphi inputbox с несколькими значениями?

StackOverflow https://stackoverflow.com/questions/1879427

  •  18-09-2019
  •  | 
  •  

Вопрос

Я хочу получить от пользователя значения нескольких различных типов (время, давление, имя, ...).и я хочу настроить свое поле ввода.Но это принимает только одно значение.

Есть ли какой-нибудь способ решить эту ситуацию или какой-либо компонент для использования?

Это было полезно?

Решение

Франсуа прав.Вы достигли предела возможностей данного вам инструмента. InputBox simply не предназначен для сложного ввода, и он также не предназначен для расширения для обработки нескольких значений.

Страница, на которую вы ссылались в вашем комментарии есть пример, но он представлен довольно плохо, так что я не виню вас за неправильное понимание этого.Мне тоже потребовалось несколько чтений, чтобы разобраться.В его основе лежит 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 могу сообщить вам эту информацию, которая является основным различием между этими двумя функциями, но само по себе это не делает ни одну из функций стоящей использования в вашей ситуации.)

Не беспокойтесь о том, что этот новый класс формы утяжелит ваш проект.Две вещи, которые оказывают наибольшее влияние на размер проекта, - это СисУтилы и Формы единицы измерения.Вы уже включили их, так что худшее из этого уже позади.Добавление формы в проект, в котором уже есть хотя бы одна форма, вообще не сильно влияет на размер проекта, особенно на форму, которую я описал выше, в которой всего восемь элементов управления.

Другие советы

Что именно вы подразумеваете под "inputbox" - TEdit?Существует много различных типов компонентов для ввода, которые могут делать много разных вещей.Для названия TEdit очень хорош, но для времени вам может понадобиться элемент управления календарем, а для давления вы можете использовать элемент управления, который отлично подходит для чисел.

Да, разработайте Форму!

Диалоги.InputBox предназначен для быстрого и простого получения 1 строки от пользователя.
Если вы хотите большего, вам нужно создать Форму для входа.
Если вам нужен базовый диалог, вы можете посмотреть код в Dialogs.InputQuery и использовать его в качестве отправной точки для написания вашей собственной процедуры.

Если вы хотите получить реальную сделку, вам нужно покопаться и закодировать реальную Форму.

Кеннеди Роба прав..Поле ввода - НЕ очень хороший вариант...Что именно вы пытаетесь спасти ?Исполняемое пространство, ресурсы или исходный код?Или вы просто хотите сохранить окружающую среду с помощью своего "зеленого" кода?

Если вы взглянете на функцию 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