Перейти к содержанию
Fire Monkey от А до Я
  • 0

InputQuerySync реагирует только на OK


x11

Вопрос

Опубликовано (изменено)

Процедура редактирования одной записи в базе выглядит так:

uses uDM, CRAccess, DASQLGenerator, FMX.Platform, FMX.DialogService, FMX.Utils;

...
...

procedure TfmReference.actEditExecute(Sender: TObject);
Var
  val: array of string;
  sTableName, cap: string;
  SyncService : IFMXDialogServiceSync;
  id: integer;
begin
  SetLength(val, 1);
  val[0] := ListView1.Items[ListView1.Selected.Index].Objects.FindObjectT<TListItemText>('name').Text;
  id := StrToIntDef(ListView1.Items[ListView1.Selected.Index].Objects.FindObjectT<TListItemText>('id').Text, -1);

  cap := comboRefType.Items[comboRefType.ItemIndex];
  sTableName := GetTableName;


  if TPlatformServices.Current.SupportsPlatformService(IFMXDialogServiceSync, IInterface(SyncService)) then
    if SyncService.InputQuerySync(cap, ['Изменить: '], val) then
    begin
      sqlInsert.sql.Text := Format('update %s set name = ' + QuotedStr(val[0]) + 'where id = ' + IntToStr(ID), [sTableName]);
      sqlInsert.Execute;
    end;

end;

Т.е. на форме ListView в режиме DynamicAppearance.

Щёлкаем по строке, нажимает кнопку редактировать (actEditExecute).

на Windows появляется окно ввода, но нет реакции на кнопку Отмена или Закрыть. При вводе значения и нажатии на OK, запись меняется.

 

На Android 5 вообще не появляется диалоговое окно. Но actEditExecute выполняется. Например, если не выбрать строку списка и нажать Изменить, то появляется AV.

Я так понимаю, что на Android SupportsPlatformService возвращает False.

Тогда как реализовать InputBox или InputQuery на всех платформах или хотя бы на Windows и Android? Свое окно создавать и самому воспроизводить функционал InputBox или InputQuery?

 

Изменено пользователем x11

Рекомендуемые сообщения

  • 0
  • Модераторы
Опубликовано

 

12 часов назад, x11 сказал:

Я так понимаю, что на Android SupportsPlatformService возвращает False.

нет, тут все верно, просто Android не поддерживает blocking dialogs (модальные окна)

почитайте эту тему

 

  • 0
Опубликовано
procedure GoToWithInputBox;
begin
  TDialogServiceAsync.InputQuery('Введите номер страницы', ['№ страницы:'], [''],
    procedure(const AResult: TModalResult; const AValues: array of string)
      begin
        case AResult of
          mrOk:
            begin
              if AValues[0] <> '' then
                begin
					// делаем что надо с полученным значением по кнопке ОК, введенное значение в AValues[0]
                end;
            end;
          mrCancel:
            begin
              Exit;  // тут выполняем действия по кнопке Отмена
            end;
        end;
      end
    );
end;

 

  • 0
Опубликовано (изменено)

Всё равно нет реакции на Отмена или Закрыть.

На OK есть реакция.

 

 

procedure TfmReference.actEditExecute(Sender: TObject);
Var
  val: array of string;
  sTableName, cap: string;
  id: integer;
begin
  SetLength(val, 1);
  val[0] := ListView1.Items[ListView1.Selected.Index].Objects.FindObjectT<TListItemText>('name').Text;
  id := StrToIntDef(ListView1.Items[ListView1.Selected.Index].Objects.FindObjectT<TListItemText>('id').Text, -1);

  cap := comboRefType.Items[comboRefType.ItemIndex];
  sTableName := GetTableName;

  TDialogServiceAsync.InputQuery(cap, ['Изменить: '], Val,
      procedure(const AResult: TModalResult; const AValues: array of string)
        begin
          case AResult of
            mrOk:
              begin
                if not AValues[0].IsEmpty then
                  begin
                    sqlInsert.sql.Text := Format('update %s set name = ' + QuotedStr(val[0]) + 'where id = ' + IntToStr(ID), [sTableName]);
                    sqlInsert.Execute;
                  end;
              end;
            mrCancel:
              begin
                Exit;  // тут выполняем действия по кнопке Отмена
              end;
          end;
        end
      );



//  if TPlatformServices.Current.SupportsPlatformService(IFMXDialogServiceSync, IInterface(SyncService)) then
//    if SyncService.InputQuerySync(cap, ['Изменить: '], val) then
//    begin
//      sqlInsert.sql.Text := Format('update %s set name = ' + QuotedStr(val[0]) + 'where id = ' + IntToStr(ID), [sTableName]);
//      sqlInsert.Execute;
//    end;

end;

 

Ставлю бряку на case или на Exit; и нажимаю Отмена - ничего не происходит.

Перепроверил, Debug включен.

Изменено пользователем x11
  • 0
Опубликовано

Да, винда

и ShowMessage() не помогает

т.е. я правильно понимаю, что на данный момент у Delphi мульти-платформенного приложения нет работающего InputBox?

  • 0
  • Модераторы
Опубликовано
14 минут назад, x11 сказал:

Да, винда

и ShowMessage() не помогает

т.е. я правильно понимаю, что на данный момент у Delphi мульти-платформенного приложения нет работающего InputBox?

 Сейчас не за компом, но решение есть

  • 0
Опубликовано
27 минут назад, Равиль Зарипов (ZuBy) сказал:

это решение для Windows

 

ок, спасибо, посмотрю

ну т.е. получается, что одного простого универсального нет?

нужно отдельно для каждой платформы пились, судя по тому, что Вы написали "для Windows"?

  • 0
  • Модераторы
Опубликовано
5 минут назад, x11 сказал:

ок, спасибо, посмотрю

ну т.е. получается, что одного простого универсального нет?

нужно отдельно для каждой платформы пились, судя по тому, что Вы написали "для Windows"?

а что на других платформах также? проблема была только в Windows на сколько я помню

  • 0
Опубликовано
11 минут назад, Равиль Зарипов (ZuBy) сказал:

а что на других платформах также?

 

При чем здесь так же или не так же?

Я о том, что на данный момент нет такого лаконичного решения, как старый InputBox/InputQuery. Гарантированно рабочего в мульти-платформенном приложении.

 

  • 0
  • Модераторы
Опубликовано
8 минут назад, x11 сказал:

При чем здесь так же или не так же?

При том, что ошибка такая была только под Windows, на других платформах её не было.

и фикс соответственно для Windows

8 минут назад, x11 сказал:

Я о том, что на данный момент нет такого лаконичного решения, как старый InputBox/InputQuery. Гарантированно рабочего в мульти-платформенном приложении.

Вы хоть поняли для чего этот файл нужен?

видимо нет, я распишу тогда

  • Используете код который дал @HyperZen
  • Кладете файлик рядом с проектом и подключаете в uses с директивой
    {$IFDEF MSWINDOWS} FMX.DialogHelper.pas {$ENDIF}

     

  • Готово, бага больше не будет, и остается кросс-платформенное решение

  • 0
Опубликовано
В 23.03.2017 в 16:33, Равиль Зарипов (ZuBy) сказал:

Вы хоть поняли для чего этот файл нужен?

 

Да, это костыль, т.к. у FMX до сих пор нет работающего Inputbox для мульти-платформенного приложения.

  • 0
Опубликовано

Тут ещё вопрос. Почему ShowMessage(val[0]) показывает старое значение?

 

 

procedure TfmReference.actEditExecute(Sender: TObject);
Var
  val: array of string;
  sTableName, cap: string;
  id: integer;
begin
  SetLength(val, 1);
  val[0] := ListView1.Items[ListView1.Selected.Index].Objects.FindObjectT<TListItemText>('name').Text;
  id := StrToIntDef(ListView1.Items[ListView1.Selected.Index].Objects.FindObjectT<TListItemText>('id').Text, -1);

  cap := comboRefType.Items[comboRefType.ItemIndex];
  sTableName := GetTableName;

  TDialogService.InputQuery(cap, ['Изменить: '], Val,
      procedure(const AResult: TModalResult; const AValues: array of string)
        begin
          case AResult of
            mrOk:
              begin
                if not AValues[0].IsEmpty then
                  begin
                    ShowMessage(val[0]);
                  end;
              end;
            mrCancel:
              begin
                Exit;  // тут выполняем действия по кнопке Отмена
              end;

          end;
        end
      );
end;

 

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

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