![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сравнение переменных процедурного типа [D7, XP]
RWolf © (2010-04-22 15:41:00)
type
TProc=procedure of object;
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
procedure p;
procedure p1;
end;
var
a,b:TProc;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
a:=p;
b:=p1;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if a=b then //!!!
ShowMessage('eq');
end;
Строчка, помеченная восклицательными знаками, не компилируется.
Предположим, что правильный синтаксис - if @a=@b then ...
Смотрим, во что компилируется эта строчка:
Unit1.pas.49: if @a=@b then
004529B0 A1005C4500 mov eax,[a]
004529B5 3B05085C4500 cmp eax,[b]
004529BB 750A jnz +$0a
Unit1.pas.50: ShowMessage('eq');
004529BD B8D0294500 mov eax,$004529d0
004529C2 E86150FDFF call ShowMessage
Unit1.pas.51: end;
004529C7 C3 ret
Как видим, сравниваются только 4 младших байта процедурной переменной.
Вопрос: это баг Delphi 7, или есть другой синтаксис сравнения переменных процедурного типа, более правильный?
RWolf (2010-04-22 16:00:00) [1]> Ega23
ясно :)
Ega23 (2010-04-22 15:57:00) [2]
if (TMethod(...).Code = TMethod(...).Code) and (TMethod(...).Data = TMethod(...).Data) then ...
RWolf (2010-04-22 15:47:00) [3]> turbouser
В данном случае - 8 байт: адрес метода и адрес объекта.
turbouser (2010-04-22 15:45:00) [4]
> RWolf © (22.04.10 15:41)
А что, по твоему, представляют из себя
> переменных процедурного типа
?