Pregunta

Quiero obtener varios tipos de valores diferentes (tiempo, presión, nombre,...) del usuario.y quiero personalizar mi cuadro de entrada.Pero solo se necesita un valor.

¿Hay alguna forma de solucionar esta situación o algún componente a utilizar?

¿Fue útil?

Solución

François es correcto. Has alcanzado el límite de la herramienta que le han dado. InputBox simplemente no está diseñado para la entrada compleja, y no está diseñado para ser extendido para manejar múltiples valores, tampoco.

La página se ha vinculado a en su comentario tiene un ejemplo , pero se le presenta bastante mal, así que no te culpo por malentendido. Me tomó unos cuantos lee para obtener, también. En su parte central es la función MyAsk en la parte inferior. (No haga caso de la declaración de clase TAppendThread en la parte superior. Es inútil.) MyAsk acepta una lista de registros con con indicaciones y valores, y para cada registro, se llama InputBox para solicitar un valor por parte del usuario. Podría ser más fácil de entender sin el registro. Se podría reescribirse así:

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;

Llamada así:

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

Eso es un terribles interfaz para el usuario, sin embargo. No hay forma de volver atrás, no hay manera de cancelar, no hay ninguna indicación de cuánto tiempo el interrogatorio va a durar, y no hay manera de hacer cumplir formatos para ciertos tipos de datos. Usted realmente va a ser mucho mejor si se quiere diseñar un formulario personalizado que recibe la información que necesita exactamente. Estás usando una herramienta que hace que el diseño de un formulario sobre la cosa más fácil del mundo. No se resista a ello.

Si usted necesita para obtener el tiempo, la presión, y el nombre, a continuación, hacer una forma con tres controles de entrada. Utilizar un TDateTimePicker por el momento, considere un TSpinEdit para la entrada numérica, y utilizar un TEdit para el nombre. Ponga los controles TLabel junto a cada entrada que el usuario sepa lo que cada uno es para. Ponga botones Aceptar y Cancelar en el formulario. Definir las distintas propiedades del formulario, como el estilo de borde y el título. No hay casi ningún código a escribir en esa forma. Usted es libre de añadir código para validar los valores de entrada, sin embargo, para asegurarse de que tienen sentido.

Para usarlo, simplemente cree que, poblar sus valores iniciales, muestran de forma modal, y leer los nuevos valores a cabo cuando se cierra.

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;

Nótese también cómo verificar el resultado del método ShowModal . Que le permite saber si el usuario pulsa Aceptar o Cancelar para cerrar el formulario. No se puede hacer eso con InputBox, que siempre devuelve una cadena. ( InputQuery Se puede decir que la información, que es la principal diferencia entre los dos funciones, pero que por sí sola no hace realmente bien la función vale la pena utilizar en su situación.)

No se preocupe por esta nueva clase de formulario pesa sobre su proyecto. Las dos cosas que tienen el mayor impacto en el tamaño del proyecto son los SysUtils y Formularios unidades. Ya ha incluido los que, por lo que el peor de esto es ya pasado. Adición de una forma a un proyecto que ya tiene al menos una forma no afecta al tamaño del proyecto mucho a todos, especialmente no en la forma que he descrito anteriormente, que sólo tiene ocho controles.

Otros consejos

¿Qué es exactamente lo que quiere decir con "caja de texto" - un TEdit? Hay muchos tipos diferentes de componentes para la entrada, que se pueden hacer muchas cosas diferentes. Para un nombre, TEdit es muy bueno - pero por el tiempo, es posible que desee un control de calendario, y la presión es posible que desee utilizar un control que se ve muy bien para los números

.

Sí, diseñar un formulario!

Dialogs.InputBox está diseñado para obtener 1 cadena del usuario, rápido y sencillo.
Si quieres más, usted tiene que diseñar un formulario de inscripción.
Si quieres un diálogo básico, puede mirar el código en Dialogs.InputQuery, y lo utilizan como punto de partida para codificar su propio procedimiento.

Si desea que el verdadero negocio, usted tiene que cavar y código de una forma real.

Kennedy

de Rob es correcto .. Un cuadro de entrada no es una buena opción ... ¿Qué estás tratando de ahorrar? Espacio exe, Recursos o el código fuente? O lo que desea es salvar el medio ambiente con el código "verde"?

Si se echa un vistazo a la función InputQuery verá que lo que hace es crear un TForm y crear somes TButtons / TLabels / TEdit, la posición y la forma modal espectáculo.

Exactamente lo que se haría con un nuevo formulario que deberá añadir a su proyecto .. lado puede validar, personalizar los controles y la posición de ellos e incluso añadir toques ...

Vaya con la nueva forma ...

No es necesario configurar todos los formularios para que se creen automáticamente; después de crear el formulario, vaya a las opciones del proyecto, seleccione la opción de formularios y mueva todos los formularios que no desea que se creen automáticamente a la derecha.

El patrón que uso más generalmente para estos formularios no creados automáticamente es algo como el siguiente:

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;

los métodos GetValues/SetValues ​​completan el diálogo desde un registro o clase que contiene los valores que se utilizan en la rutina.Nunca intento manipular controles en un formulario desde fuera del formulario, sino que escribo rutinas para hacerlo en el formulario mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top