Перейти к содержанию
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
  • Модераторы
14 минут назад, x11 сказал:

Да, винда

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

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

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

Ссылка на комментарий
  • 0
  • Модераторы

положи в папку с проектом этот файл и подключи его в проект

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

FMX.DialogHelper.zip

Ссылка на комментарий
  • 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 пользователей онлайн

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