powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / reference to procedure
12 сообщений из 12, страница 1 из 1
reference to procedure
    #39578315
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всех с Наступающим, всех благ :)


Помогите разобраться с 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
reference to procedure
    #39578319
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в главной форме

Код: 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
reference to procedure
    #39578320
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
reference to procedure
    #39578321
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
F2.ShowModal();



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



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

[dcc32 Error] Unit1.pas(50): E2010 Incompatible types: 'TProcSelectRef' and 'Procedure'
...
Рейтинг: 0 / 0
reference to procedure
    #39578325
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в главной форме
Код: 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
reference to procedure
    #39578327
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

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

   procedure(aValue: string)



надо или там и там const или без
...
Рейтинг: 0 / 0
reference to procedure
    #39578328
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блиииин, вот спасибо!!!!!!!!!!!!!!!
спасибище
...
Рейтинг: 0 / 0
reference to procedure
    #39578330
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если без конструктора, то нужно добавлять проперть в форму выбора, правильно?
...
Рейтинг: 0 / 0
reference to procedure
    #39578332
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, всё получилось
Код: 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
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / reference to procedure
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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