Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2024, 01:32   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 686
По умолчанию Передать локальную процедуру (под-процедуру) через переменную

Код:
type
  pr1=procedure;
Код:
Procedure aaa(b:pr1);
begin
  b;
end;

procedure TForm1.Button1Click(Sender: TObject);
  procedure cc;
  begin
    Button1.Caption:='1';
  end;
begin
  aaa(cc);
end;
Компилятор выдаёт ошибку.
Вопрос: возможно ли как-то передать именно локальную процедуру/функцию (под-процедуру)?
Kronos913 вне форума Ответить с цитированием
Старый 16.10.2024, 01:39   #2
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 178
По умолчанию

Возможно, но зачем?
Код:
Procedure aaa(b:pr1);
begin
  b;
end;

procedure TForm1.Button1Click(Sender: TObject);
  procedure cc;
  begin
    form1.Button1.Caption:='1'; //не забываем про form1
  end;
begin
  aaa(@cc); //
end;
DIONISKA вне форума Ответить с цитированием
Старый 16.10.2024, 02:46   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 686
По умолчанию

Следующий тест, который выдал ошибку
Мне нужно чтобы внутренняя процедура пользовалась переменной внешней
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  s:string;

  procedure cc;
  begin
    form1.Button1.Caption:=s; //íå çàáûâàåì ïðî form1
  end;
begin
  s:='123456789';
  aaa(@cc); //
end;
Kronos913 вне форума Ответить с цитированием
Старый 16.10.2024, 03:41   #4
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 178
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
чтобы внутренняя процедура пользовалась переменной внешней
Посыл то понятен, не понятен практический смысл. Максимально усложнить код для запутывания декомпиляторов? Усложнить жизнь тому, кто будет делать рефакторинг? Просто исследование возможностей delphi?
В целом можно передать так:
Код:
  pr1 = procedure (value:string);
Procedure aaa(b:pr1; value:string);
begin
  b(value);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s:string;
  procedure cc(value:string);
  begin
    form1.Button1.Caption:=value;
  end;
begin
  s:='123456789';
  aaa(@cc,s);
end;
Можно извращаться по-разному, можно так:
Код:
 type
  pr1 = procedure (value:string);
  TMyproc=record
   public
   proc:pr1;
   value:string;
   class function Create(aproc:pr1; val:string):TMyproc; static;
  end;

Procedure aaa(b:TMyproc);
begin
  b.proc(b.value);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  s:string;
  procedure cc(value:string);
  begin
    form1.Button1.Caption:=value;
  end;
begin
  s:='123456789';
  aaa(TMyproc.Create(@cc, s));
end;

{ TMyproc }


class function TMyproc.Create(aproc: pr1; val: string): TMyproc;
begin
   Result.proc:=aproc;
   Result.value:=val;
end;
или даже так:
Код:
type
 TmyFunc = reference to procedure(value:string);

  TForm1 = class(TForm)
//...
    myfunc:TmyFunc;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s:string;
begin
  s:='123456789';
 myfunc(s);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 myfunc:=(procedure(value:string)
 begin
   form1.Button1.Caption:=value;
 end);
end;
Другой вопрос что практического смысла в этом особого нет
DIONISKA вне форума Ответить с цитированием
Старый 16.10.2024, 22:59   #5
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 686
По умолчанию

Практический смысл - просто я на простом чем-то тестирую идею которая нужна в более сложном коде.

А практическая задача: есть одна единая процедура которая проверяет наличие в папке файла соответствующего каким-то параметрам. А собственно параметры поиска - их определяет функция которая передаётся внутрь процедуры через параметры
Kronos913 вне форума Ответить с цитированием
Старый 17.10.2024, 01:15   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Практический смысл - просто я на простом чем-то тестирую идею которая нужна в более сложном коде.

А практическая задача: есть одна единая процедура которая проверяет наличие в папке файла соответствующего каким-то параметрам. А собственно параметры поиска - их определяет функция которая передаётся внутрь процедуры через параметры
Поздравляю! Вы придумали идею callback процедуры. Правда её уже придумали раньше, в прошлом веке.
northener вне форума Ответить с цитированием
Старый 17.10.2024, 01:51   #7
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 686
По умолчанию

Если честно, впервые про такое услышал
Пытался погуглить. Но всё написано слишком заумно

Где можно почитать простыми словами объяснение что это такой и как это работает?
Kronos913 вне форума Ответить с цитированием
Старый 17.10.2024, 02:03   #8
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 686
По умолчанию

Код:
             case byte(Optionen) of
                {Код других вариантов}
                253: begin
                       If PFuncS(SL)^.F(@SearchRec) then begin
                         PFuncS(SL)^.R:=true;
                         FindClose(SearchRec);
                         exit;
                       end;
                     end;
             end;
И PFuncS(SL)^.F - и есть ссылка на функцию которая является каким-то условием

Последний раз редактировалось Kronos913; 17.10.2024 в 02:08.
Kronos913 вне форума Ответить с цитированием
Старый 18.10.2024, 10:42   #9
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,987
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
возможно ли как-то передать именно локальную процедуру/функцию (под-процедуру)?
Нет. Надо делать глобальную процедуру.
Код:
type
  pr1=procedure;

Procedure aaa(b:pr1);
begin
  b;
end;

procedure cc;
begin
  Form1.Button1.Caption:='1';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  aaa(cc);
end;
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый Вчера, 20:05   #10
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 686
По умолчанию

Чтобы не создавать новую тему, у меня такой вопрос: как через переменную вызвать локальную процедуру?
Код:
Procedure aaa;
var
  p:procedure;

  procedure p1;
  begin
    {код}
  end;

  procedure p2;
  begin
    {код}
  end;
begin
  if {условие} then p:=p1 else p:=p2;
  {код}
  p;
Как что-то такое вот реализовать?
Kronos913 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передать переменную в процедуру-реакцию Kronos913 Общие вопросы Delphi 9 16.02.2021 02:49
Описать процедуру Minmax(X, Y), записывает в переменную X минимальное из значений X и Y, а в переменную Y - максимальное kinash96 Помощь студентам 3 12.10.2013 19:49
как передать параметры в процедуру через общую область памяти idShura Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 13.07.2012 20:00
Передать параметр в процедуру VistaSV30 Microsoft Office Access 2 18.12.2009 20:45
Как передать указатель в процедуру??? kate4ka Общие вопросы Delphi 1 17.03.2008 12:49