Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.25;
Скачать: CL | DM;

Вниз

Как запихнуть такую процедуру в класс, чтобы небыло ошибки?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.05 c
3-1146076512
makvell
2006-04-26 22:35
2006.06.25
Исключения


6-1125580152
Gold
2005-09-01 17:09
2006.06.25
IdPOP31.Retrieve(i,IdMessage1) - coding table entry not found


11-1129044663
mdw
2005-10-11 19:31
2006.06.25
MCKfakeClasses, PActionList и KOLAdd


2-1149450252
ZV
2006-06-04 23:44
2006.06.25
???


6-1139919533
guitarist
2006-02-14 15:18
2006.06.25
При выходе в интернет, представляться IE