François a raison. Vous avez atteint la limite de l'outil qui vous a été donné. InputBox
n'est simplement pas conçu pour les entrées complexes, et il n'est pas non plus conçu pour être étendu pour gérer plusieurs valeurs.
The page you linked to Dans votre commentaire a un exemple, mais il est présenté plutôt mal, donc je ne vous blâme pas pour l'avoir mal compris. Il m'a fallu aussi quelques lectures pour en avoir. Au cœur se trouve la fonction MyAsk
en bas. (Ignorez la déclaration de classe TAppendThread
en haut, c'est inutile.) MyAsk
accepte une liste d'enregistrements avec des invites et des valeurs, et appelle pour chaque enregistrement InputBox
pour demander une valeur à l'utilisateur. Il pourrait être plus facile à comprendre sans le dossier. Il pourrait ê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;
appel 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 une l'interface horrible pour l'utilisateur, cependant. Il n'y a aucun moyen de revenir en arrière, il n'y a aucun moyen d'annuler, il n'y a aucune indication de combien de temps l'interrogation va durer, et il n'y a aucun moyen d'imposer des formats pour certains types de données. Vous serez vraiment mieux si vous concevez un formulaire personnalisé qui obtient exactement l'information dont vous avez besoin. Vous utilisez un outil qui rend la conception d'un formulaire sur la chose la plus facile au monde. Ne résiste pas à ça.
Si vous avez besoin d'obtenir l'heure, la pression et le nom, faites un formulaire avec trois contrôles d'entrée. Utilisez un TDateTimePicker
pour l'instant, considérez un TSpinEdit
pour l'entrée numérique et utilisez un TEdit
pour le nom. Mettez TLabel
contrôles à côté de chaque entrée afin que l'utilisateur sache à quoi chacun est destiné. Mettez les boutons OK et Annuler sur le formulaire. Définissez diverses autres propriétés de formulaire, telles que le style de bordure et la légende. Il y a presque aucun code pour écrire sous cette forme. Vous êtes libre d'ajouter du code pour valider les valeurs d'entrée, cependant, pour vous assurer qu'elles ont du sens. Pour l'utiliser, il suffit de le créer, de remplir ses valeurs initiales, de l'afficher de façon modale et de lire les nouvelles valeurs lorsqu'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;
Notez également comment je vérifie le résultat de la méthode ShowModal
. Cela vous permet de savoir si l'utilisateur a appuyé sur OK ou Annuler pour fermer le formulaire. Vous ne pouvez pas faire cela avec InputBox
, qui renvoie toujours une chaîne. (InputQuery
peut vous dire cette information, qui est la principale différence entre ces deux fonctions, mais cela ne rend pas vraiment l'une ou l'autre fonction utile dans votre situation.)
Ne vous inquiétez pas pour cette nouvelle classe de poids votre projet. Les deux éléments qui ont le plus d'impact sur la taille du projet sont les unités SysUtils et Forms. Vous avez déjà inclus ceux-ci, donc le pire est déjà passé. L'ajout d'un formulaire à un projet qui a déjà au moins un formulaire n'affecte pas du tout la taille du projet, surtout pas le formulaire que j'ai décrit ci-dessus, qui n'a que huit contrôles.
Pas besoin d'être méchant François. –
Merci, mais je veux alléger mon logiciel, donc je ne veux pas ajouter d'autres formes à mon projet. Il y a un exemple que j'ai trouvé mais il est difficile à comprendre .. :( http://www.delphipages.com/forum/showthread.php?t=154839 – Rapunzo
Je suppose que j'étais trop fatigué pour remarquer qu'il pourrait être interprété comme je le vois maintenant ... Changé –