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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top