2009-12-10 14 views

Répondre

7

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.

3

Qu'entendez-vous exactement par "inputbox" - un TEdit? Il y a beaucoup de différents types de composants pour l'entrée, qui peuvent 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 pour la pression, vous voudrez peut-être utiliser un contrôle qui a l'air bien pour les nombres.

3

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

Si vous voulez faire la vraie affaire, vous devez creuser et coder un vrai formulaire.

+3

Pas besoin d'être méchant François. –

+0

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

+0

Je suppose que j'étais trop fatigué pour remarquer qu'il pourrait être interprété comme je le vois maintenant ... Changé –

0

Rob Kennedy est juste .. Une boîte d'entrée n'est pas une bonne option ... Qu'est-ce que vous essayez d'économiser exactement? Exe Espace, ressources ou code source? Ou vous voulez juste sauver l'environnement avec votre code "vert"? Si vous jetez un coup d'oeil à la fonction InputQuery, vous verrez que ce qu'il fait est de créer un TForm et de créer des TButtons/TLabels/TEdit, de positionner et de montrer le formulaire 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 ...

Go avec la nouvelle forme.

0

Vous n'avez pas besoin de définir chaque formulaire à créer automatiquement, après avoir créé votre formulaire allez dans les options du projet, sélectionnez l'option formulaires et déplacez tous les formulaires que vous ne voulez pas créer automatiquement à droite.

Le modèle que je plupart utilise généralement ces formes non-auto-créé 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; 

les méthodes getvalues ​​/ setValeurs peuplent la boîte de dialogue à partir d'un enregistrement ou une classe qui contient les valeurs qui sont utilisé dans la routine. Je n'essaie jamais de manipuler des contrôles sur un formulaire depuis l'extérieur du formulaire mais plutôt d'écrire des routines pour le faire dans le formulaire lui-même.

Questions connexes