Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.012 c
3-1145965808
Alpine
2006-04-25 15:50
2006.06.25
Проблемма с UPPER(FIELD) LIKE .... в IB 7.01


6-1139889800
Интересующийся
2006-02-14 07:03
2006.06.25
Как поставить и прочитать кук при помощи TServerSocket?


2-1149261261
ZV
2006-06-02 19:14
2006.06.25
COM port DRIVER


15-1149012642
Bogdan1024
2006-05-30 22:10
2006.06.25
агенства недвижимости - поделитесь опытом


3-1146128504
Shlomo
2006-04-27 13:01
2006.06.25
Поле uniqueidentifier запоздало генерирует своё значение?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский