Esiste un modo per utilizzare la casella di input Delphi con più valori?
-
18-09-2019 - |
Domanda
Desidero ottenere più valori di tipi diversi (tempo, pressione, nome, ...) dall'utente.e voglio personalizzare la mia casella di input.Ma richiede un solo valore.
Esiste un modo per risolvere questa situazione o qualche componente da utilizzare?
Soluzione
François è giusto. Hai raggiunto il limite dello strumento che hai dato. InputBox
semplicemente non è progettato per l'input complessa, e non è progettato per essere esteso per gestire più valori, sia.
la pagina si è collegato al nel tuo commento è un esempio , ma è presentato piuttosto male, quindi non ti biasimo per malinteso. Mi ci sono voluti un paio di legge per ottenere, anche. Al suo centro è la funzione MyAsk
in basso. (Ignorare la dichiarazione della classe TAppendThread
in alto. E 'inutile.) MyAsk
accetta un elenco di record con con i richiami ed i valori, e per ogni record, chiama InputBox
per richiedere un valore da parte dell'utente. Potrebbe essere più facile da capire senza il record. Si potrebbe essere riscritto in questo modo:
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;
chiamare in questo modo:
TempTime := TimeToStr(DefaultTime);
TempPressure := IntToStr(DefaultPressure);
TempName := DefaultName;
MultiInputBox(['Time', 'Pressure', 'Name'], [TempTime, TempPressure, TempName]);
TimeToUse := StrToTime(TempTime);
PressureToUse := StrToInt(TempPressure);
NameToUse := TempName;
Questo è un terribile interfaccia per l'utente, però. Non c'è modo di tornare indietro, non c'è modo di annullare, non c'è alcuna indicazione di quanto tempo l'interrogatorio è destinato a durare, e non c'è modo di far rispettare formati per alcuni tipi di dati. Realmente sarete molto meglio se si progetta un modulo personalizzato che ottiene esattamente le informazioni necessarie. Si sta utilizzando uno strumento che rende la progettazione di un modulo di circa la cosa più facile del mondo. Non resistere così.
Se avete bisogno di ottenere il tempo, la pressione, e il nome, quindi fare un modulo con tre controlli di input. Utilizzare un TDateTimePicker
per il momento, prendere in considerazione un TSpinEdit
per l'input numerico, e utilizzare un TEdit
per il nome. Mettere controlli TLabel
accanto ad ogni ingresso in modo che l'utente sa che cosa ognuno è per. Mettere OK e Annulla pulsanti sul modulo. Impostare le varie altre proprietà del modulo, come ad esempio lo stile del bordo e la didascalia. Non c'è quasi senza codice per scrivere in quella forma. Sei libero di aggiungere il codice per convalidare i valori di input, anche se, per assicurarsi che essi hanno senso.
Per utilizzarlo, è sufficiente creare esso, riempire i suoi valori iniziali, mostrarlo modale, e leggere i nuovi valori fuori quando si chiude.
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;
Si noti inoltre come si controlla il risultato del metodo ShowModal
. Che consente di sapere se l'utente ha premuto OK o Annulla per chiudere il modulo. Non si può farlo con InputBox
, che restituisce sempre una stringa. ( InputQuery
posso dire che le informazioni, che è la differenza principale tra i due funzioni, ma che da solo non ha realmente sia la funzione vale la pena utilizzare nella vostra situazione.)
Non preoccupatevi di questa nuova classe di form appesantire il vostro progetto. Le due cose che hanno il maggiore impatto sul dimensioni del progetto sono le SysUtils e Moduli Unità. Hai già incluso quelli, in modo che il peggio è già passato. Aggiunta di un modulo a un progetto che ha già almeno una forma non influenza la dimensione progetto molto a tutti, soprattutto non la forma ho descritto sopra, che ha solo otto controlli.
Altri suggerimenti
Che cosa si intende per "InputBox" - una TEdit? Ci sono molti diversi tipi di componenti per l'ingresso, che possono fare molte cose diverse. Per un nome, TEdit è molto buono - ma per il tempo, può essere utile un controllo calendario, e per la pressione si consiglia di utilizzare un controllo che sembra grande per i numeri
.Sì, la progettazione di un modulo!
Dialogs.InputBox è stato progettato per ottenere 1 stringa dall'utente, semplice e veloce.
Se si vuole di più, è necessario progettare un modulo di iscrizione.
Se si desidera una finestra di dialogo di base, si può guardare il codice Dialogs.InputQuery, e usarlo come punto di partenza per codificare la propria procedura.
Se si desidera che il vero affare, è necessario scavare in e il codice di una vera e propria forma.
di Rob è giusto .. Una casella di input non è una buona opzione ... Che cosa stai cercando di salvare? Exe spazio, le risorse o il codice sorgente? O si vuole solo salvare l'ambiente con il codice "verde"?
Se si dà un'occhiata alla funzione InputQuery vedrai che quello che fa è creare un TForm e creare Somes TButtons / TLabels / TEdit, la posizione e spettacolo modale la forma.
Esattamente quello che si potrebbe fare con una nuova forma che si desidera aggiungere al progetto .. accanto è possibile convalidare, personalizzare i controlli e posizionarle e persino aggiungere suggerimenti ...
Vai con la nuova forma ...
Non è necessario impostare ogni modulo per la creazione automatica, dopo aver creato il modulo vai nelle opzioni del progetto, seleziona l'opzione moduli e sposta a destra tutti i moduli che non desideri vengano creati automaticamente.
Il modello che utilizzo più generalmente per questi moduli non creati automaticamente è simile al seguente:
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;
i metodi GetValues/SetValues popolano la finestra di dialogo da un record o una classe che contiene i valori utilizzati nella routine.Non provo mai a manipolare i controlli su un modulo dall'esterno del modulo, ma scrivo invece routine per farlo nel modulo stesso.