|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Указатель на метод класса. Помогите исправить
Код:
type TPositionProc = procedure (const i: Integer); TForm1 = class(TForm) BitBtn1: TBitBtn; procedure BitBtn1Click(Sender: TObject); private { Private declarations } procedure Func3(const i: Integer); public { Public declarations } Position: TPositionProc; procedure SetRange(minVal, maxVal: Integer); end; var Form1: TForm1; implementation {$R *.dfm} procedure Func1(const i: Integer); begin ShowMessage('В процедуру 1 передан параметр: ' + IntToStr(i)); end; procedure Func2(const i: Integer); begin ShowMessage('В процедуру 2 передан параметр: ' + IntToStr(i)); end; procedure TForm1.Func3(const i: Integer); begin ShowMessage('В процедуру класса передан параметр: ' + IntToStr(i)); end; procedure TForm1.SetRange(minVal, maxVal: Integer); begin if maxVal - minVal < 100 then Position:= Func1 else if maxVal - minVal > 100 then Position:= Func2 else Position:= @TForm1.Func3; end; procedure TForm1.BitBtn1Click(Sender: TObject); begin SetRange(1, 10); Position(5); SetRange(1, 105); Position(5); SetRange(1, 101); Position(5); //тут ошибка выводит не 5, а адрес процедуры Func3 end; |
#2
|
||||
|
||||
Потому что Func1 и Func2 - это процедуры, а Func3 - это метод объекта (TMethod).
Процедуру в метод превратить можно: Код:
type TTestProc = procedure of Object; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public TestProc: TTestProc; procedure TestProc1; end; var Form1: TForm1; implementation {$R *.dfm} procedure TestProc2; begin ShowMessage('Method 2'); end; procedure TForm1.TestProc1; begin ShowMessage('Method 1'); end; procedure TForm1.Button1Click(Sender: TObject); var p: TMethod; begin TestProc := TestProc1; TestProc; p.Data := @Sender; p.Code := @TestProc2; TestProc := TTestProc(p); TestProc; end; Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. Последний раз редактировалось dr. F.I.N., 01.02.2021 в 18:01. |
Этот пользователь сказал Спасибо dr. F.I.N. за это полезное сообщение: | ||
User123 (02.02.2021)
|
#3
|
|||
|
|||
Спасибо. В моем варианте тоже все процедуры вызываются. Мне надо чтобы параметры передавались. Если в вашем варианте изменить тип на TTestProc = procedure (i: Integer) of Object;
и ниже по коду поправить объявления процедур, то вызов последнего TestProc(11) после нажатия на кнопку приведёт к вызову TestProc2(i), где i не будет равняться 11. |
#4
|
|||
|
|||
Нашёл вариант преобразования TMethod в процедуру тут http://delphi-hlp.ru/index.php/ob-ek...ie/metody.html. Буду тестить
|