Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизСравнение переменных процедурного типа Найти похожие ветки
← →
RWolf © (2010-04-22 15:41) [0]
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, или есть другой синтаксис сравнения переменных процедурного типа, более правильный?
← →
turbouser © (2010-04-22 15:45) [1]
> RWolf © (22.04.10 15:41)
А что, по твоему, представляют из себя
> переменных процедурного типа
?
← →
RWolf © (2010-04-22 15:47) [2]> turbouser
В данном случае - 8 байт: адрес метода и адрес объекта.
← →
Ega23 © (2010-04-22 15:57) [3]
if (TMethod(...).Code = TMethod(...).Code) and (TMethod(...).Data = TMethod(...).Data) then ...
← →
RWolf © (2010-04-22 16:00) [4]> Ega23
ясно :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.068 c