Gibt es eine Möglichkeit, das Delphi-Eingabefeld mit mehreren Werten zu verwenden?
-
18-09-2019 - |
Frage
Ich möchte vom Benutzer mehrere verschiedene Wertetypen (Zeit, Druck, Name usw.) erhalten.und ich möchte mein Eingabefeld anpassen.Aber es braucht nur einen Wert.
Gibt es eine Möglichkeit, diese Situation zu lösen oder eine Komponente zu verwenden?
Lösung
François ist richtig. Sie haben die Grenze des Werkzeugs erreichen Sie gegeben worden sind. InputBox
einfach nicht für komplexe Eingabe konzipiert und entworfen ist nicht zu sein erweitert um mehrere Werte zu handhaben, auch nicht.
Die Seite, die Sie in Ihrem Kommentar verknüpft hat ein Beispiel , aber es ist eher schlecht präsentiert, so dass ich Sie nicht für Missverständnisse es schuld. Es hat mich ein paar mal gelesen, auch zu bekommen. Im Kern ist die MyAsk
Funktion am unteren Rand. (Ignorieren Sie die TAppendThread
Klassendeklaration an der Spitze. Es ist nutzlos.) MyAsk
akzeptiert eine Liste von Datensätzen mit mit Eingabeaufforderungen und Werte, und für jeden Datensatz, ruft er InputBox
Wert vom Benutzer anzufordern. Es könnte ohne die Aufzeichnung leichter zu verstehen sein. Es könnte wie folgt neu geschrieben werden:
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;
Nennen Sie es wie folgt aus:
TempTime := TimeToStr(DefaultTime);
TempPressure := IntToStr(DefaultPressure);
TempName := DefaultName;
MultiInputBox(['Time', 'Pressure', 'Name'], [TempTime, TempPressure, TempName]);
TimeToUse := StrToTime(TempTime);
PressureToUse := StrToInt(TempPressure);
NameToUse := TempName;
Das ist eine schrecklich Schnittstelle für den Benutzer, though. Es gibt keinen Weg zurück zu gehen, gibt es keine Möglichkeit zu stornieren, gibt es keinen Hinweis darauf, wie lange die Befragung dauern wird, und es gibt keine Möglichkeit, Formate für bestimmte Datentypen zu erzwingen. Sie werden wirklich viel besser dran, wenn Sie ein benutzerdefiniertes Formular entwerfen, die genau die Informationen erhält man braucht. Sie verwenden ein Tool, das in der Welt eine Form über die einfachste Sache macht entwerfen. Sie nicht, dass widerstehen.
Wenn Sie die Zeit erhalten müssen, den Druck und den Namen, die machen dann ein Formular mit drei Eingangskontrollen. Verwenden Sie einen TDateTimePicker
für die Zeit, sollten Sie eine TSpinEdit
für die numerische Eingabe, und verwenden Sie ein TEdit
für den Namen. Setzen Sie TLabel
Kontrollen neben jedem Eingang, so dass der Benutzer weiß, was jeder für ist. Legen Sie Schaltflächen OK und Abbrechen auf dem Formular. Stellen Sie verschiedene andere Form Eigenschaften, wie zum Beispiel die Grenze Stil und dem Titel. Es gibt fast keinen Code in dieser Form zu schreiben. Du bist frei, Code hinzufügen, um die Eingabewerte zu bestätigen, obwohl, um sicherzustellen, dass sie Sinn machen.
Um es zu nutzen, erstellen Sie einfach es, bevölkern seine Anfangswerte, zeigen Sie sie modal, und lesen Sie die neuen Werte aus, wenn es geschlossen wird.
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;
Beachten Sie auch, wie ich überprüfen das Ergebnis der ShowModal
Verfahren . Das lässt Sie wissen, ob der Benutzer gedrückt OK oder Abbrechen, um das Formular zu schließen. Sie können das tun, nicht mit InputBox
, die immer einen String zurückgibt. ( InputQuery
können Sie diese Informationen sagen, was der Hauptunterschied zwischen den beiden ist, Funktionen, aber das allein nicht wirklich so oder Funktion wert in Ihrer Situation mit machen.)
Kümmere dich nicht um diese neue Form Klasse Ihr Projekt zu beschweren. Die beiden Dinge, die den größten Einfluss auf die Projektgröße haben, sind die SysUtils und Formulare Einheiten. Sie haben bereits enthalten diejenigen, so dass das Schlimmste ist schon vorbei. Hinzufügen eine Form zu einem Projekt, das bereits mindestens eine Form hat nicht die Projektgröße überhaupt viel beeinflussen, vor allem nicht die Form I oben beschrieben, die nur acht Kontrollen haben.
Andere Tipps
Was genau meinst du mit „inputbox“ - ein TEdit? Es gibt viele verschiedene Arten von Komponenten für die Eingabe, die viele verschiedene Dinge tun. Für einen Namen, ist TEdit sehr gut - aber für die Zeit, können Sie ein Kalender-Steuerelement mögen, und für Druck können Sie eine Steuerung verwenden, die für Zahlen sehen gut aus
.Ja, ein Formular entwerfen!
Dialogs.InputBox ist so konzipiert, 1 String vom Benutzer, schnell und einfach zu bekommen.
Wenn Sie mehr wollen, müssen Sie ein Anmeldeformular entwerfen.
Wenn Sie einen grundlegenden Dialog wollen, können Sie den Code in Dialogs.InputQuery aussehen, und es als Ausgangspunkt nutzen, um Ihre eigenen Verfahren zu codieren.
Wenn Sie die Real Deal wollen, müssen Sie in und Code ein echtes Formular graben.
Rob Kennedy ist richtig .. Ein Eingabefeld ist nicht eine gute Wahl ... Was genau wollen Sie sparen? Exe Raum, Ressourcen oder Quellcode? Oder Sie wollen einfach nur die Umwelt retten mit dem „grünen“ Code?
Wenn Sie einen Blick auf die Inputquery-Funktion übernehmen werden Sie das sehen, was es tut, ist eine TForm erstellen und erstellen somes TButtons / TLabels / TEdit, Position und zeigen Sie das Formular modal.
Genau das, was man mit einer neuen Form tun würde, die Sie zu Ihrem Projekt hinzufügen würden .. neben Sie bestätigen können, die Steuerelemente anpassen und positionieren Sie sie und sogar Hinweise hinzufügen ...
Gehen Sie mit der neuen Form ...
Sie müssen nicht jedes Formular auf automatische Erstellung einstellen. Nachdem Sie Ihr Formular erstellt haben, gehen Sie zu den Projektoptionen, wählen Sie die Formularoption aus und verschieben Sie alle Formulare, die nicht automatisch erstellt werden sollen, nach rechts.
Das Muster, das ich am häufigsten für diese nicht automatisch erstellten Formulare verwende, ist etwa das Folgende:
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;
Die GetValues/SetValues-Methoden füllen den Dialog aus einem Datensatz oder einer Klasse, die die in der Routine verwendeten Werte enthält.Ich versuche nie, Steuerelemente in einem Formular von außerhalb des Formulars zu manipulieren, sondern schreibe stattdessen Routinen, um dies im Formular selbst zu tun.