• 0
Rusland

Числовая клавиатура в InputQuery

Вопросы

Мне нужно вводить числа.

В Edit можно указать тип клавиатуры KeyboardType = PhonePad. 
 
Как сделать появляющуюся при InputQuery клавиатуру типа PhonePad?

procedure TForm1.Label1Tap(Sender: TObject; const [Ref] Point: TPointF);
begin
  InputQuery('Введите число', [''], [''],
    procedure(const AResult: TModalResult; const AValues: array of string)
    begin
      if (AResult=mrOk) and (AValues[0].Trim<>'') then
        Label1.Text:=AValues[0].Trim;
    end
  ); 
end;
Изменено пользователем Rusland

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 ответов на этот вопрос

  • 0

я просто сделал свой аналог inputquery

это не просто, а очень просто...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Основная проблема, что я решал - приподнять окно над клавиатурой

Ну и некая анимация

пример использования

procedure TUserProfile.InputPassOKHandler(Sender:TObject);
var
  t: string;
  d:TMyInputQuery;
begin
  d := Sender as TMyInputQuery;
  t:=apiObject.token;
  apiObject.OpenSessionPass(.........);
  if (ApiObject.lastError.code<>ERR_NO_ERROR)and(ApiObject.lastError.code<>ERR_SESSION_ALREADY_OPEN) then
  begin
    apiObject.token := t;
    ShowMessage('Неверный пароль');
    exit;
  end;

  PersData[dfPassword] := d.Values[0];
  SavePersData;
  reloadPersData;
  init;
end;


procedure TUserProfile.UpdateExistingUser;
var d:TMyInputQuery;
begin
  if PersData[dfPassword]='' then
  begin
    d:=TMyInputQuery.Create(['Для изменения данных введите пароль'],[''],self, InputPassOKHandler);
    try
      // тут можно все что угодно делать с Edit'ами на форме перед показом
      d.ShowModal(procedure (AResult:TModalResult) begin end );
    finally
      freeandNil(d);
    end;
  end
  else
  begin
    SavePersData;
    reloadPersData;
    init;
  end;
end;

MyDialogs.7z

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Отдельная форма - это конечно тоже вариант, но в данном случае хотелось бы использовать стандартный вариант. 

Знать бы только как заменить клавиатуру )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

стандартный вариант по сути ничем не отличается от этого ))

полный контроль над созданной формой тоже чего-то стоит...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

 

Основная проблема, что я решал - приподнять окно над клавиатурой

Ну и некая анимация

пример использования

procedure TUserProfile.InputPassOKHandler(Sender:TObject);
var
  t: string;
  d:TMyInputQuery;
begin
  d := Sender as TMyInputQuery;
  t:=apiObject.token;
  apiObject.OpenSessionPass(.........);
  if (ApiObject.lastError.code<>ERR_NO_ERROR)and(ApiObject.lastError.code<>ERR_SESSION_ALREADY_OPEN) then
  begin
    apiObject.token := t;
    ShowMessage('Неверный пароль');
    exit;
  end;

  PersData[dfPassword] := d.Values[0];
  SavePersData;
  reloadPersData;
  init;
end;


procedure TUserProfile.UpdateExistingUser;
var d:TMyInputQuery;
begin
  if PersData[dfPassword]='' then
  begin
    d:=TMyInputQuery.Create(['Для изменения данных введите пароль'],[''],self, InputPassOKHandler);
    try
      // тут можно все что угодно делать с Edit'ами на форме перед показом
      d.ShowModal(procedure (AResult:TModalResult) begin end );
    finally
      freeandNil(d);
    end;
  end
  else
  begin
    SavePersData;
    reloadPersData;
    init;
  end;
end;

модуль UGlobal отсутствует, точней функция GetParentForm. Можете её выложить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
function GetParentForm(o:TFmxObject):TForm;
var p:TFmxObject;
begin
  result := nil;
  p:=o.parent;
  while (p<>NIL)and(not (p is tform)) do
    p:=p.parent;
  if p<>NIL then
    result := P as TForm;
end;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От x11
      Мультиплатформенное приложение. Delphi Tokyo.
      указываю 2 параметра для VAL и передаю это в TDialogService.InputQuery
       
      procedure TfmMain.Send(id: integer); Var val: array of string; cap: string; begin // запускаем диалог ввода имени SetLength(val, 2); val[0] := VarToStr(qCalls.Lookup('ID', id, 'name')); val[1] := id.ToString; cap := 'Введите имя'; TDialogService.InputQuery(cap, ['Имя клиента: '], Val, InputDialogHandlerGetShotName); end;  
      В итоге, в недрах TDialogService.InputQuery получаю исключение:
       
      На андроиде ошибки нет.
       

    • От Rusland
      Если нажимаю Отмена в InputQuery,
      InputQuery('Укажите свой ответ', ['Ответ'], [''], procedure(const AResult: TModalResult; const AValues: array of string) begin if (AResult=mrOk) and (AValues[0].Trim<>'') then begin // делаем что-то с AValues[0] end; end ); то получаю Segmentation Fault в FMX.Dialogs.Android (которого в Seattle не существовало)
      procedure TFMXDialogListener.onDialogClosed(modalResult: Integer; values: TJavaObjectArray<JString>); var I: Integer; begin FModalResult := modalResult; if values <> nil then begin SetLength(FValues, values.Length); for I := 0 to values.Length - 1 do begin if FModalResult = mrOk then FValues[I] := JStringToString(values.Items[I]) else FValues[I] := FDefaultValues[I]; // тут end end; TThread.Queue(FCallerThread, DoDialogClosed); end; Где у меня ошибка?
      PS. Delphi 10.1 Berlin
      PPS. в справке сказано Warning: InputQuery is deprecated. Please use Platform.IFMXDialogServiceAsync.MessageDialogAsync.  InputQuery вышел из моды? )
       
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу