Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / reference to procedure / 12 сообщений из 12, страница 1 из 1
30.12.2017, 22:38:45
    #39578315
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure
Всех с Наступающим, всех благ :)


Помогите разобраться с reference to procedure. Не доходит до меня.
Нужно реализовать что-то вроде CallBack.
Delphi Berlin, мультиформенное приложение.
На Андроиде нет модальных форм поэтому нужно передать процедуру как параметр из главной формы в форму выбора. Но главных форм несколько, а форма выбора одна, т.е. нет нужды плодить несколько форм выбора.
Пользователь из главной формы вызывает форму выбора, что-то там вводит или выбирает и нужно выполнить процедуру и передать в главную форму данные, т.е. то, что было введено/выбрано. Другими словами, нужно получить то, что ввел пользователь.
Не доходит до меня, где правильно объявлять и как.

В форме выбора объявляю
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
type
  TProcSelectRef = reference to procedure(const sText: string);

  TfmSel = class(TForm)
    btnOK: TButton;
    btnCacel: TButton;
    Edit1: TEdit;
    procedure btnCacelClick(Sender: TObject);
    procedure btnOKClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure proc(ProcSelectRef: TProcSelectRef);
  end;

var
  fmSel: TfmSel;

implementation
...
...

procedure TfmSel.proc(ProcSelectRef: TProcSelectRef);
begin
//пользователь ввел что-то в Edit1 и это нужно вернуть в главную форму
  ProcSelectRef(Edit1.Text);
end;

procedure TfmSel.btnOKClick(Sender: TObject);
begin
  proc(что здесь?);
end;

procedure TfmSel.btnCacelClick(Sender: TObject);
begin
  close;
end;




у главной формы:
Код: pascal
1.
2.
3.
4.
5.
procedure TForm1.btnSelClick(Sender: TObject);
begin
  fmSel := TfmSel.Create(self);
  fmSel.Show;
end;



что дальше?
...
Рейтинг: 0 / 0
30.12.2017, 22:51:38
    #39578319
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure
в главной форме

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  public
    { Public declarations }
    procMain: TProcSelectRef;
...
implementation
...


procedure TForm1.btnSelClick(Sender: TObject);
begin
  fmSel := TfmSel.Create(self);

  procMain := procedure(s: string)
  begin
    Label1.Text := s;
  end; // ошибка здесь

  fmSel.proc(procMain);
  fmSel.Show;
end;



но при компиляции получаю ошибку
[dcc32 Error] Unit1.pas(50): E2010 Incompatible types: 'TProcSelectRef' and 'Procedure'
...
Рейтинг: 0 / 0
30.12.2017, 23:03:18
    #39578320
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
procedure TForm1.Button1Click(Sender: TObject);
var
  F2: TForm2;
begin
  F2 := TForm2.Create(
    Self,
    procedure(aValue: string)
    begin
      Label1.Caption := aValue;
    end
  );
  F2.ShowModal();
  F2.Free();
end;

type
  TCallback = reference to procedure(aValue: string);

  TForm2 = class(TForm)
    btnOK: TButton;
    Edit1: TEdit;
    procedure btnOKClick(Sender: TObject);
  private
    FCallback: TCallback;
  public
    constructor Create(aOwner: TComponent; aCallback: TCallback); reintroduce;
  end;

procedure TForm2.btnOKClick(Sender: TObject);
begin
  FCallback(Edit1.Text);
  Close;
end;

constructor TForm2.Create(aOwner: TComponent; aCallback: TCallback);
begin
  inherited Create(aOwner);
  FCallback := aCallback;
end;
...
Рейтинг: 0 / 0
30.12.2017, 23:03:57
    #39578321
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure
Код: pascal
1.
F2.ShowModal();



так ShowModal нельзя
...
Рейтинг: 0 / 0
30.12.2017, 23:05:58
    #39578322
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure
X11
Код: pascal
1.
F2.ShowModal();



так ShowModal нельзя
замените на Show... вопрос же был по использованию замыканий?
...
Рейтинг: 0 / 0
30.12.2017, 23:09:55
    #39578323
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure
Так, а если без конструктора?
Сложнее будет?
...
Рейтинг: 0 / 0
30.12.2017, 23:13:31
    #39578324
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure
сделал по Вашему примеру, всё равно та же ошибка:

[dcc32 Error] Unit1.pas(50): E2010 Incompatible types: 'TProcSelectRef' and 'Procedure'
...
Рейтинг: 0 / 0
30.12.2017, 23:15:59
    #39578325
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure
в главной форме
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure TForm1.btnSelClick(Sender: TObject);
begin
  fmSel := TfmSel.Create(self,

   procedure(aValue: string)
    begin
      Label1.Text := aValue;
    end
  );

  fmSel.Show;
end;



в форме выбора:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
unit Unit3;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, FMX.Edit;

type
  TProcSelectRef = reference to procedure(const sText: string);

  TfmSel = class(TForm)
    btnOK: TButton;
    btnCacel: TButton;
    Edit1: TEdit;
    procedure btnCacelClick(Sender: TObject);
    procedure btnOKClick(Sender: TObject);
  private
    fProcSelectRef: TProcSelectRef;
  public
    { Public declarations }

    constructor Create(aOwner: TComponent; AProcSelectRef: TProcSelectRef); reintroduce;
  end;

var
  fmSel: TfmSel;

implementation

{$R *.fmx}

uses Unit1;

procedure TfmSel.btnOKClick(Sender: TObject);
begin
  fProcSelectRef(Edit1.Text);
  Close;
end;

constructor TfmSel.Create(aOwner: TComponent; AProcSelectRef: TProcSelectRef);
begin
  inherited Create(aOwner);
  fProcSelectRef := AProcSelectRef;
end;

procedure TfmSel.btnCacelClick(Sender: TObject);
begin
  close;
end;


end.
...
Рейтинг: 0 / 0
30.12.2017, 23:36:05
    #39578327
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure
X11,

У вас сигнатуры не совпадают
Код: pascal
1.
2.
3.
4.
5.
TProcSelectRef = reference to procedure(const sText: string);
и
fmSel := TfmSel.Create(self,

   procedure(aValue: string)



надо или там и там const или без
...
Рейтинг: 0 / 0
30.12.2017, 23:37:02
    #39578328
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure
блиииин, вот спасибо!!!!!!!!!!!!!!!
спасибище
...
Рейтинг: 0 / 0
30.12.2017, 23:59:19
    #39578330
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure
Если без конструктора, то нужно добавлять проперть в форму выбора, правильно?
...
Рейтинг: 0 / 0
31.12.2017, 00:07:49
    #39578332
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure
да, всё получилось
Код: pascal
1.
property ProcSelectRegionRef: TProcSelectRegionRef read fProcSelectRegionRef write fProcSelectRegionRef;




в главной форме

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
 
fmTree := TfmTree.Create(self);
fmTree.ProcSelectRegionRef := procedure(AidRegion: integer; const sFullRegion: string)
    begin
      idRegion := AidRegion;
      lbSelRegion.Text := sFullRegion
    end;

  fmTree.Show;
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / reference to procedure / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]