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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top