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?

È stato utile?

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.

Kennedy

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top