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

Вызвать форму, сделать выбор и вернуть результат


x11

Вопрос

Т.к. у FMX/Android нет модальных форм, то я взял за пример работу с диалогами.

Есть работающий пример

TDialogService.InputQuery(cap, ['Введите имя: '], Val, InputDialogHandlerEditTelName);

....
....
....
procedure TfmEditObject.InputDialogHandlerEditTelName(const AResult: TModalResult; const AValues: array of string);
begin
...
...
end;

Я решил пойти по тому же пути. Есть некая главная форма с кнопкой, которую пользователь нажимает, выбирает на другой форме что-то и, по идее, должна выполниться какая процедура на первой форме.

Главных форм несколько, т.к. во многих местах приложения пользователь что-то выбирает. А форма выбора для всех одна.

 

Я добавил в проект модуль, где написал:
 

type
  TCallBackProcSelectRef = reference to procedure(idRegion: integer; constsFullRegion: string);

...

procedure CallBackProcSelect(idRegion: integer; const sFullRegion: string);

implementation

procedure CallBackProcSelect(idRegion: integer; const sFullRegion: string);
begin
  fmMain.lbSelRegion.Text := sFullRegion;
  fmMain.idRegion := idRegion;
end;

 

На форме выбора есть процедура
 

private

  procedure SelRegion2(CallBackProcSelectRef: TCallBackProcSelectRef);

...

...

procedure TfmTree.SelRegion2(CallBackProcSelectRef: TCallBackProcSelectRef);
begin
  CallBackProcSelectRef(TreeView1.Selected.Tag, TreeView1.Selected.Text);
end;

здесь же, на форме выбора, на кнопке выбора есть строка:

SelRegion2(CallBackProcSelect);

вроде бы всё так же, как и с диалогами, но компилятор ругается:

Incompatible types: 'TCallBackProcSelectRef' and 'Procedure'

что я не правильно понял в анонимных процедурах, что я делаю не так?

Ссылка на комментарий

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

  • 0

1. а зачем миксовать ООП и процедуры??

2. это не одно и то же

TCallBackProcSelectRef = reference to procedure(idRegion: integer; constsFullRegion: string);

TCallBackProcSelectRef = procedure(idRegion: integer; constsFullRegion: string);

procedure CallBackProcSelect(idRegion: integer; const sFullRegion: string); - это второе

 

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

1. Не знаю, как правильней и проще дать пользователю что-то выбирать с возможностью вернуть результат. Ведь форма выбора одна, а форм, где вызывается форма выбора несколько. При этом форма выбора не знает, куда именно возвращать результат.

2. Вижу, но не до конца я это всё понимаю, поэтому и возникла проблема.

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

Я понял ,что один из примеров реализован через события TNotifyEvent. Ок, тоже вариант. Я уже в VCL проектах в потоках использовал TNotifyEvent.

Но мне хотелось бы и этим моим конкретным вопрос разобраться. Почему с анонимными методами у разработчиков работает, а меня нет. Где я просчитался.

 

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

в чем проблема? это мой код с дополнениями равиля. 

в описании  InputQuery есть примеры использования. Пример с анонимной функцией и пример с методом класса. У вас простая процедура, а не метод класса. О чем я сказал в первом посте.

Если вопрос был в этом, то все и так должно было решиться.

Вопрос на самом деле в том, а как вы будете возвращать данные. для этого нужно придумывать более хитрую схему.

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

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

 

Ссылка на комментарий
  • 0
1 час назад, x11 сказал:

есть работающий пример


TDialogService.InputQuery(cap, ['Введите имя: '], Val, InputDialogHandlerEditTelName);

есть информация тут например

http://www.webdelphi.ru/2016/09/rabota-s-dialogami-inputquery-inputbox-v-delphi-10-1-berlin/

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

нуже блин
смотрим образец

TInputCloseQueryProc = reference to procedure(const AResult: TModalResult; const AValues: array of string);
TDialogService.InputQuery(cap, ['Введите имя: '], Val, InputDialogHandlerEditTelName);
procedure TfmEditObject.InputDialogHandlerEditTelName(const AResult: TModalResult; const AValues: array of string)

смотрим ваш вариант

TCallBackProcSelectRef = reference to procedure(idRegion: integer; constsFullRegion: string);
procedure CallBackProcSelect(idRegion: integer; const sFullRegion: string);

это просто процедура, а хочется метод класса как в оригинале

Ссылка на комментарий
  • 0
4 минуты назад, krapotkin сказал:

procedure CallBackProcSelect(idRegion: integer; const sFullRegion: string);

 

 

Ну так я это уже переделал и сделал CallBackProcSelect методом класса, т.е. вставил в секцию private формы и добавил реализацию в форме выбора
 

procedure TfmTree.CallBackProcSelect(idRegion: integer; const sFullRegion: string);
begin

...

...

 

[dcc32 Error] uTree.pas(99): E2010 Incompatible types: 'TProcSelectRegionRef' and 'Procedure of object'

Изменено пользователем x11
Ссылка на комментарий
  • 0

Ещё раз код приведу.

 

type
  TProcSelectRegionRef = reference to procedure(idRegion: integer; constsFullRegion: string);

type
  TfmTree = class(TForm)

...
...
  private
    procedure CallBackProcSelect(idRegion: integer; const sFullRegion: string);
    procedure SelRegion2(ProcSelectRegionRef: TProcSelectRegionRef);

...
...
implementation
...
...

procedure TfmTree.SelRegion2(ProcSelectRegionRef: TProcSelectRegionRef);
begin
  ProcSelectRegionRef(TreeView1.Selected.Tag, TreeView1.Selected.Text);
end;

procedure TfmTree.CallBackProcSelect(idRegion: integer; const sFullRegion: string);
begin
...
end;

procedure TfmTree.actSelectExecute(Sender: TObject);
begin
...
  SelRegion2(CallBackProcSelect);
...
end;

 

Ссылка на комментарий
  • 0
4 часа назад, x11 сказал:

Ещё раз код приведу.

в объявлении reference to procedure забыт пробел между const и названием переменной. Синтаксис отличается и компилятор ругается.

Ссылка на комментарий

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

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

Гость
Ответить на вопрос...

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

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

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

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

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

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

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