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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2021, 18:18   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 624
По умолчанию Где ошибка (переменная-процедура)

Код:
procedure qqq(SL: TStrings);
  type
   TPr1 = Procedure(const s:string);
var
  Pr:TPr1;
begin
  Pr:=Sl.Add;
  {что-то там}
end;
Выдает ошибку на строке присвоения. В чем проблема?
Kronos913 вне форума Ответить с цитированием
Старый 03.06.2021, 18:23   #2
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 624
По умолчанию

Собственно мне нужно чтобы переменная-процедура могла принимать значения двух процедур:
1. Sl.Add
2. Внутренней под-процедуры
Kronos913 вне форума Ответить с цитированием
Старый 03.06.2021, 21:47   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 624
По умолчанию

Ок, нашел что add - это функция, подправил в type значение, все равно выдает ошибку
Kronos913 вне форума Ответить с цитированием
Старый 03.06.2021, 21:55   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Код:
type
   TPr1 = function(const s:string): Integer of object;
Но ваша функция тоже должна быть методом какого-нибудь класса.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 03.06.2021, 22:54   #5
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 624
По умолчанию

А теперь внутренняя функция процедуры не хочет ей присваиваться
Kronos913 вне форума Ответить с цитированием
Старый 03.06.2021, 22:59   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Потому что "Procedure pointer types are always incompatible with method pointer types." (Procedural Types).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 04.06.2021, 00:07   #7
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 624
По умолчанию

Получается, нужно создавать процедуру, которая состоит из одного вызова функции add ?
Чтобы реализовать это таким способом
Kronos913 вне форума Ответить с цитированием
Старый 04.06.2021, 00:16   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Или создать свой класс с нужным методом-функцией, тогда тип совпадет. А вообще Сага о X, Y и Z...
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 04.06.2021, 00:48   #9
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 624
По умолчанию

Код:
Или создать свой класс с нужным методом-функцией, тогда тип совпадет
И как тогда это сделать?

Последний раз редактировалось Kronos913; 04.06.2021 в 00:59.
Kronos913 вне форума Ответить с цитированием
Старый 04.06.2021, 01:01   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Вы прочли заметку о X, Y, Z?
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TSimpleClass = class
    function some_work(const S: string): Integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TSimpleClass.some_work(const S: string): Integer;
begin
  ShowMessage('IN simpleclass:' + sLineBreak + S);
  Result := 0;
end;

procedure proc(sl: TStrings; sc: TSimpleClass);
type
   Tf = function(const s: string): Integer of object;
var
  f: Tf;
begin
  if Random(2) = 0 then
    f := sl.Add
  else
    f := sc.some_work;
  f('check');
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  sl: TStringList;
  sc: TSimpleClass;
begin
  sl := TStringList.Create;
  sc := TSimpleClass.Create;
  proc(sl, sc);
  ShowMessage('IN stringlist:' + sLineBreak + sl.Text);
  sl.Free;
  sc.Free;
end;

end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить где объявлена переменная werter0001 PHP 4 02.01.2020 01:00
Процедура и переменная. patrickj SQL, базы данных 0 20.12.2012 13:56
Где процедура?? E-Novikov Общие вопросы Delphi 19 16.12.2010 11:04
Процедура, как переменная russian-stalker Общие вопросы Delphi 2 03.10.2009 18:01
Общая переменная и процедура для двух форм? Polotenchik Общие вопросы Delphi 2 19.07.2009 12:20