• 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'

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

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


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

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

  • 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

чтобы не плодить текстов, найдите  MyDialogs http://fire-monkey.ru/topic/3791-два-вопроса-по-модальным-окнам/#comment-23880

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


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

Спасибо, конечно. Но вместо какой-то небольшой подсказки, Вы предлагает изучить кучу чужого кода?

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


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

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

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

 

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


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

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

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

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

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

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

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

 

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


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

Уточните, что такое "описание InputQuery"?

Боюсь, что я не так пойму.

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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 и названием переменной. Синтаксис отличается и компилятор ругается.

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


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

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

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

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

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

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

Войти

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

Войти


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

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