Форум: "Прочее";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
ВнизКак запихнуть такую процедуру в класс, чтобы небыло ошибки? Найти похожие ветки
← →
TODE (2006-05-28 05:25) [0]
procedure nearCallback(Data : Pointer; O1, O2 : PdxGeom); cdecl;
Это вопрос по ODE.
Там эта функция вызывается таким образом :dSpaceCollide(Space, nil, nearCallback);
Я хочу поместить её в класс, для удобства, а она ругается на cdecl;. Как мне правильно это сделать ?
← →
TODE (2006-05-29 06:21) [1]Люди ?
← →
vidiv © (2006-05-29 06:50) [2]х3...
я себе в качестве пробы в первый попавшийся класс впихнул:type TServerObject = class (TIdTCPServer)
public
constructor Create(Own:TComponent); override;
procedure HndlExecute(AThread: TIdPeerThread); cdecl;
end;
работает.. наверное по другой причине ругается
← →
MBo © (2006-05-29 08:25) [3]модификатор cdecl здесь ни при чем, однако callback-функция должна быть простой (регулярной) функцией, а не методом класса!
← →
evvcom © (2006-05-29 08:46) [4]
> Я хочу поместить её в класс
Каковы аргументы сего желания?
← →
TODE (2006-05-30 05:44) [5]
> MBo © (29.05.06 08:25) [3]
>
> модификатор cdecl здесь ни при чем, однако callback-функция
> должна быть простой (регулярной) функцией, а не методом
> класса!
А если мне надо в ней использовать переменные определённого класса, то как быть? Чтобы не создавать его экземпляр или кучу глобальных переменных для обмена. Может всё таки можно как то?
← →
atruhin © (2006-05-30 05:50) [6]Обычно в функции, которая использует CallBack есть спец поле pinter, cardinal.
Значение которого передается в функцию обратного вызова.
Передаешь в это поле указатель на объект, а в CallBack функции приводишь к нужному типу. MyObject(Param2)...
← →
TODE (2006-05-30 06:43) [7]
> atruhin © (30.05.06 05:50) [6]
>
> Обычно в функции, которая использует CallBack есть спец
> поле pinter, cardinal.
> Значение которого передается в функцию обратного вызова.
>
> Передаешь в это поле указатель на объект, а в CallBack функции
> приводишь к нужному типу. MyObject(Param2)...
Можно пример кода, а то я чего то не пойму как именно сделать ?
← →
MBo © (2006-05-30 06:58) [8]
type
TCallBack = procedure (Data : Pointer); cdecl;
TMy = class
A: array[0..1] of Integer;
procedure Traverse(CallbackProc: TCallBack);
end;
...
procedure DoIt(Data : Pointer); cdecl;
var
i: Integer;
begin
for i := 0 to 1 do
Form1.Memo1.Lines.Add(IntToStr(TMy(Data).A[i]));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
with TMy.Create do begin
Traverse(DoIt);
Free;
end;
end;
{ TMy }
procedure TMy.Traverse(CallbackProc: TCallBack);
var
i: Integer;
begin
for i := 0 to 1 do
A[i] := i;
CallbackProc(Self);
end;
← →
TODE (2006-05-31 03:38) [9]
> MBo © (30.05.06 06:58) [8]
Немного не то.
Мы не вызываем nearCallback, а передаём её библиотечке ode.dll через функцию :
dSpaceCollide(Space, nil, nearCallback); И уже она её вызывает со своими параметрами.
Вот если бы из procedure DoIt(Data : Pointer); cdecl; можно было обращаться к данным TMy напрямую. Так как Data нами не контролируется.
← →
atruhin © (2006-05-31 05:22) [10]
> а передаём её библиотечке ode.dll
Давай описание параметров этого метора OLE сервера. Похоже ты не до конца понял о чем мы пишем.
← →
han_malign © (2006-05-31 10:39) [11]
> MBo © (30.05.06 06:58) [8]
- если параметр контекста первый, можно извращаться с неявным параметром метода класса:
........
TMy = class
A: array[0..1] of Integer;
procedure DoIt; cdecl;
procedure Traverse(CallbackProc: TCallBack);
end;
...
procedure TMy.DoIt{(Data : Pointer)}; cdecl;
var
i: Integer;
begin
for i := 0 to 1 do
Form1.Memo1.Lines.Add(IntToStr({TMy(Data).}A[i]));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
with TMy.Create do begin
Traverse(TCallBack(@TMy.</y>DoIt));
Free;
end;
end;
- естественно, до тех пор пока не изменят способ передачи self, но он вроде документирован и измениться не должен... С stdcall работает, с cdecl тоже должен.
← →
han_malign © (2006-05-31 10:59) [12]судя по
http://www.ode.org/doc/russian/#func_dSpaceCollide
будет работать так:
TMy = class
..............
procedure _dNearCallback(O1, O2 : PdxGeom);cdecl;
procedure SpaceCollide(Space: PdxSpase);
end;
.................
procedure TMy.SpaceCollide(Space: PdxSpase);
begin
dSpaceCollide(Space, self, TdNearCallback(@TMy._dNearCallback));
end;
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c