Existe alguma maneira de usar inputbox delphi com vários valores?
-
18-09-2019 - |
Pergunta
Eu quero ficar vários valores diferentes tipos (tempo, pressão, nome, ...) de usuário. e quero personalizar o meu inputbox. Mas é preciso apenas um valor.
Há alguma maneira de resolver esta situação, ou qualquer componente de usar?
Solução
François é certo. Você já atingiu o limite da ferramenta que você foi dado. InputBox
simplesmente não é projetado para entrada complexa, e não é projetado para ser estendido para lidar com vários valores, tampouco.
A página que você ligado a em seu comentário tem um exemplo , mas ele é apresentado bastante mal, então eu não culpo você por mal-entendido. Levei alguns lê para obter também. Na sua essência, é a função MyAsk
na parte inferior. (Ignore a declaração de classe TAppendThread
no topo. É inútil.) MyAsk
aceita uma lista de registros com com prompts e valores, e para cada registro, ele chama InputBox
ao pedido de um valor do usuário. Pode ser mais fácil de entender sem o registro. Pode ser reescrito assim:
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;
chamá-lo assim:
TempTime := TimeToStr(DefaultTime);
TempPressure := IntToStr(DefaultPressure);
TempName := DefaultName;
MultiInputBox(['Time', 'Pressure', 'Name'], [TempTime, TempPressure, TempName]);
TimeToUse := StrToTime(TempTime);
PressureToUse := StrToInt(TempPressure);
NameToUse := TempName;
Isso é uma interface terrível para o usuário, no entanto. Não há nenhuma maneira de voltar, não há nenhuma maneira de cancelar, não há nenhuma indicação de quanto tempo o interrogatório vai durar, e não há nenhuma maneira de impor formatos para certos tipos de dados. Você realmente vai ser muito melhor se você criar um formulário personalizado que recebe exatamente a informação que você precisa. Você está usando uma ferramenta que faz projetar um formulário sobre a coisa mais fácil do mundo. Não resista a isso.
Se você precisa para obter o tempo, a pressão, eo nome, em seguida, fazer um formulário com três controles de entrada. Use a TDateTimePicker
para a época, considerar um TSpinEdit
para a entrada numérica, e usar um TEdit
para o nome. Coloque controles TLabel
ao lado de cada entrada para que o usuário saiba o que cada um é para. Coloque botões OK e Cancelar no formulário. Define várias outras propriedades de formulário, tal como o estilo de borda e a legenda. Não há quase nenhum código para escrever dessa forma. Você é livre para adicionar código para validar os valores de entrada, no entanto, para se certificar de que eles fazem sentido.
Para usá-lo, basta criá-lo, preencher seus valores iniciais, mostre-modal, e ler os novos valores para fora quando ela se fecha.
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;
Observe também como eu verificar o resultado do método ShowModal
. Isso permite que você saiba se o usuário pressionou OK ou Cancelar para fechar o formulário. Você não pode fazer isso com InputBox
, que retorna sempre uma string. ( InputQuery
posso dizer-lhe que a informação, que é a principal diferença entre os dois funções, mas que por si só não faz realmente quer pena função usando na sua situação.)
Não se preocupe com esta nova classe de formulário pesando seu projeto. As duas coisas que têm o maior impacto no tamanho do projeto são os SysUtils e Formas unidades. Você já incluiu os, de modo que o pior já passou. Adicionando um formulário para um projeto que já tem pelo menos uma forma não afeta o tamanho do projeto muito em tudo, especialmente não a forma que eu descrevi acima, que só tem oito controles.
Outras dicas
O que exatamente você quer dizer com "inputbox" - uma TEdit? Há muitos tipos diferentes de componentes para a entrada, o que pode fazer muitas coisas diferentes. Para um nome, TEdit é muito bom -. Mas para o tempo, você pode querer um controle de calendário, e para a pressão que você pode querer usar um controle que parece ótimo para números
Sim, criar um formulário!
Dialogs.InputBox é projetado para obter 1 string do usuário, rápido e simples.
Se você quer mais, você tem que projetar um formulário de inscrição.
Se você quer um diálogo básico, você pode olhar o código em Dialogs.InputQuery, e usá-lo como um ponto de partida para codificar seu próprio procedimento.
Se você quiser o negócio real, você tem que cavar e código de um formulário real.
O Rob Kennedy é certo .. Uma caixa de entrada não é uma boa opção ... O que exatamente você está tentando salvar? Exe Espaço, ressources ou código-fonte? Ou você só quer salvar o meio ambiente com o seu código "verde"?
Se você der uma olhada na função InputQuery você verá que o que ele faz é criar um TForm e criar somes TButtons / TLabels / TEdit, posição e mostrar modal do formulário.
Exatamente o que você faria com um novo formulário que você gostaria de acrescentar ao seu projeto .. ao lado você pode validar, personalizar os controles e posicioná-los e até mesmo adicionar dicas ...
Vá com a nova forma ...
Você não tem que definir todas as formas para criar automaticamente, depois de criar seu formulário de ir em opções de projeto, selecione a opção formulários e mover todas as formas que você não quer para a direita criado automaticamente.
O padrão que eu mais geralmente usam para estas formas não-auto criado é algo como o seguinte:
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;
GetValues ??/ SetValues ??métodos preencher o diálogo de um registro ou classe que contém os valores que são utilizados na rotina. Eu nunca tentar manipular controles em um formulário de fora da forma, mas em vez escrever rotinas de fazê-lo no próprio formulário.