Question

Je veux obtenir plusieurs différents types de valeurs (de temps, de pression, nom, ...) de l'utilisateur.et je veux personnaliser mon inputbox.Mais il ne prendre qu'une seule valeur.

Il n'existe aucun moyen de résoudre cette situation, ou tout composant à utiliser?

Était-ce utile?

La solution

François est à droite.Vous avez atteint la limite de l'outil que vous avez été donné. InputBox n'est tout simplement pas conçu pour les complexes d'entrée, et il n'est pas conçu pour être étendue à gérer de multiples valeurs, soit.

La page que vous avez lié à dans votre commentaire est un exemple, mais il y a plutôt mal que bien, donc, je ne vous blâme pas de malentendu il.Il m'a fallu plusieurs lectures pour obtenir, trop.Au cœur de la MyAsk fonction au fond.(Ignorer le TAppendThread déclaration de la classe au dessus.Il est inutile.) MyAsk accepte une liste d'enregistrements avec des avec des invites et des valeurs, et pour chaque enregistrement, il appelle InputBox pour demander une valeur à l'utilisateur.Il pourrait être plus facile à comprendre sans l'enregistrer.Il peut être réécrite comme ceci:

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;

L'appeler comme ceci:

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

C'est un terrible interface pour l'utilisateur, bien que.Il n'y a aucun moyen de revenir en arrière, il n'y a aucun moyen de l'annuler, il n'y a aucune indication de combien de temps l'interrogatoire va durer, et il n'y a aucun moyen d'appliquer des formats pour certains types de données.Vous allez vraiment être beaucoup mieux si vous créez un formulaire personnalisé qui obtient exactement les informations dont vous avez besoin.Vous êtes à l'aide d'un outil qui facilite la conception d'un formulaire sur la chose la plus facile au monde.Ne résistez pas que.

Si vous avez besoin pour obtenir le temps, la pression, et le nom, puis faire un formulaire avec trois contrôles de saisie.L'utilisation d'un TDateTimePicker pour le moment, d'envisager une TSpinEdit pour l'entrée numérique, et l'utilisation d'un TEdit pour le nom.Mettre TLabel les contrôles à côté de chaque entrée afin que l'utilisateur sait ce que chacun est.Mettre les boutons OK et Annuler sur la forme.Définir diverses autres propriétés du formulaire, tels que le style de bordure et la légende.Il n'y a presque pas de code écrire sous cette forme.Vous êtes libre d'ajouter du code pour valider les valeurs d'entrée, même si, assurez-vous qu'ils font sens.

Pour l'utiliser, il suffit de le créer, remplir ses valeurs initiales, montrer modal, et de lire les nouvelles valeurs à l'extérieur quand il se ferme.

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;

Remarquez aussi comment j'ai vérifier le résultat de la ShowModal la méthode.Qui vous permet de savoir si l'utilisateur a appuyé sur OK ou sur Annuler pour fermer la forme.Vous ne pouvez pas le faire avec InputBox, qui renvoie toujours une chaîne de caractères.(InputQuery peux vous dire que l'information, qui est la principale différence entre ces deux fonctions, mais cela ne suffit pas vraiment faire fonction de dollars à l'aide de votre situation.)

Ne vous inquiétez pas au sujet de cette nouvelle classe de la forme de pesage en bas de votre projet.Les deux choses qui ont le plus d'impact sur la taille du projet sont les SysUtils et Les formes les unités.Vous avez déjà compris ceux, de sorte que le pire est déjà passé.Ajout d'un formulaire à un projet qui a déjà au moins une forme n'affecte pas la taille du projet, beaucoup, et surtout pas la forme que j'ai décrit ci-dessus, qui a seulement huit contrôles.

Autres conseils

Que voulez-vous dire par « inputbox » - un TEdit? Il existe plusieurs types de composants différents pour l'entrée, ce qui peut faire beaucoup de choses différentes. Pour un nom, TEdit est très bon - mais pour le temps, vous voudrez peut-être un contrôle de calendrier et de la pression que vous voudrez peut-être utiliser un contrôle qui ressemble beaucoup pour les nombres

.

Oui, la conception d'un formulaire!

Dialogs.InputBox est conçu pour obtenir 1 chaîne de l'utilisateur, rapide et simple.
Si vous voulez plus, vous devez créer un formulaire d'inscription.
Si vous voulez une boîte de dialogue de base, vous pouvez consulter le code dans Dialogs.InputQuery, et l'utiliser comme un point de départ pour coder votre propre procédure.

Si vous voulez la vraie affaire, il faut creuser et le code d'une forme réelle.

Rob Kennedy est de droite .. Une boîte d'entrée est une bonne option ... Qu'est-ce que vous essayez de sauver exactement? Espace Exe, ou ressources code source? Ou vous voulez juste pour sauver l'environnement avec votre code « vert »?

Si vous jetez un oeil à la fonction InputQuery vous verrez que ce qu'il fait est de créer un TForm et créer Somes TButtons / TLabels / TEdit, la position et la forme show modal.

Exactement ce que vous feriez avec une nouvelle forme que vous ajouteriez à votre projet .. à côté vous pouvez valider, personnaliser les commandes et les positionner et même ajouter des notes ...

Aller à la nouvelle forme ...

Vous n'avez pas à définir toute forme d'auto-créer, après la création de votre formulaire d'aller dans les options de projet, sélectionnez l'option formulaires et déplacer toutes les formes que vous ne voulez pas auto-créé à droite.

Le modèle que j'ai le plus généralement utilisé pour ces non-auto-créé des formulaires est quelque chose comme ce qui suit:

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;

le GetValues/SetValues méthodes de remplir la boîte de dialogue à partir d'un enregistrement ou de la classe qui détient les valeurs qui sont utilisés dans la routine.Je n'ai jamais essayer de manipuler les contrôles sur un formulaire à partir de l'extérieur de la forme, mais au lieu d'écrire des routines de le faire dans le formulaire lui-même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top