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

Вниз

Класс и метод или Как работать с указателем на процедуру   Найти похожие ветки 

 
Comp ©   (2004-10-06 14:59) [0]

Здравствуйте, уважаемые мастера.
Разрешите задать вам небольшой вопрос
Я создал класс,и есть процедура, вне этого класса.

К примеру:

A=class;
procedure Crate;
procedure MyProc_In_Class;
end;

...

procedure MyProc;
begin

...

end;

Как сделать так, чтобы процедура MyProc стала методом класса?
На первый взгляд вопрос глупый.
Но все дело в том, что процедура MyProc является функцией CALLBACK. И не хочет она быть внутри класса. Нужно как-то указать на неё, пусть она будет и не внутри класса, но класс её должен считать своим методом.
Помогите пожалуйста.

Из конференции WinAPI...


 
имя   (2004-10-06 15:03) [1]

Удалено модератором
Примечание: Не надо так делать, здесь не цирк.


 
Digitman ©   (2004-10-06 15:05) [2]


> На первый взгляд вопрос глупый


и на все последующие - не менее


> Как сделать так, чтобы процедура MyProc стала методом класса?


в соответствии с приведенной в кач-ве примера декларацией класса реализовать ее так и никак не иначе :

procedure А.MyProc_In_Class;
begin
..
end;


 
Comp ©   (2004-10-06 15:18) [3]

Digitman ©, ты меня за дурака считаешь?
Это не орешник, я вполне серьёзно задаю вопрос.
Процедура MyProc_In_Class и без того является методом класса.
А мне надо сделать чтоб тело процедуры MyProc тоже использовалось как метод класса. Только использовать напрямую, т.е.
A=class;
procedure Crate;
procedure MyProc_In_Class;
procedure MyProc;
end;

procedure А.MyProc;
begin
..
end;

НЕЛЬЗЯ. Так просто нельзя. Надо как-то указать на неё с помощью указателя.


 
Суслик ©   (2004-10-06 15:18) [4]


>  Comp ©   (06.10.04 14:59)

копай сюды
function MakeObjectInstance(Method: TWndMethod): Pointer;
procedure FreeObjectInstance(ObjectInstance: Pointer);


 
Суслик ©   (2004-10-06 15:21) [5]


> [3] Comp ©   (06.10.04 15:18)

Что за callback?
Приведи его описание.
Обычно callback из winapi имеют 4 байтовый параметр, в который ты можешь передавать указатель на объект и в этом коллбэке вызывать метод объекта.

Т.е. сам callback не метод, но вызывает метод объекта, указатель на который получает в параметре.

Если я не ошибаюсь именно так сделан класс TThread.


 
Comp ©   (2004-10-06 15:23) [6]

Суслик ©,
спасибо.

Но что-то я не нашел этих ф-й в спавке Delphi и WinAPI.
Где искать, подскажи пожалуйста.

Или их там и не будет?


 
Суслик ©   (2004-10-06 15:25) [7]


>  [6] Comp ©   (06.10.04 15:23)

давай так - ты сначала приведешь описание callback и словесное описание что ты вообще делаешь. А?

эти процедуры из модуля classes.
только они похоже (не помню точно) именно для оконных функций.


 
Digitman ©   (2004-10-06 15:28) [8]


> Comp ©   (06.10.04 15:18) [3]
> Digitman ©, ты меня за дурака считаешь?


а ты меня за кого считаешь, а ?

в приведенной тобой изначально декларации класса и в помине нет никакой MyProc ! с какого же перепугу класс будет "знать" о какой-то там MyProc, которая даже не фигурирует в описании классового типа ?


> процедура MyProc является функцией CALLBACK


да хоть самим господом богом пусть является она !
но до тех пор пока она не будет как положено (в соответствии с правилами ObjectPascal) тобой декларирована и реализована, говорить о некоей ф-ции MyProc как о методе класса бессмысленно

к тому же колбэк колбэку - рознь... ты вот даже не соизволил уточнить, что под колбэк-ф-цией ты подразумеваешь оконную ф-цию


 
Суслик ©   (2004-10-06 15:30) [9]


> к тому же колбэк колбэку - рознь... ты вот даже не соизволил
> уточнить, что под колбэк-ф-цией ты подразумеваешь оконную
> ф-цию

Почему так думаете? Медиум? :))


 
Digitman ©   (2004-10-06 15:33) [10]


> Суслик ©   (06.10.04 15:30) [9]


по кочану думаю
изволь не язвить)
колбэк - не более чем "функция обратного вызова", и механика/технология эта имеет отношение далеко не только к  технологии/механизму окон


 
Суслик ©   (2004-10-06 15:34) [11]


>  [10] Digitman ©   (06.10.04 15:33)


> изволь не язвить)

и в мыслях не было.

вы сказали

> к тому же колбэк колбэку - рознь... ты вот даже не соизволил
> уточнить, что под колбэк-ф-цией ты подразумеваешь оконную
> ф-цию



вот я спросил, откуда такая информация.


 
Comp ©   (2004-10-06 15:37) [12]

Суслик © ,
хорошо.

Ты наверно помнишь.

type
 TWindowClass = class
  WndClassName:TWndClass;
  HandleWindow:HWND;
  Caption:PAnsiChar;
  MenuWindow:HMENU;
  function WindowProcQ(hWnd,Msg,wParam,lParam:Longint):LongInt; stdcall;
  constructor Create (ClassName:TWndClass;Caption:PAnsiChar;Rect:Trect;
                     StyleWnd:Cardinal;ParentWnd:HWND;MenuWnd:HMENU;MenuName:PAnsiChar;
                     HandleAppl:Cardinal;lpParam:Pointer);

  end;

implementation

constructor TWindowClass.Create(ClassName: TWndClass; Caption: PAnsiChar;
Rect: Trect; StyleWnd: Cardinal; ParentWnd: HWND; MenuWnd: HMENU;
MenuName: PAnsiChar; HandleAppl: Cardinal; lpParam: Pointer);

begin

   RegisterClass(ClassName);
   HandleWindow:=CreateWindow(
   ClassName.lpszClassName,Caption,StyleWnd,Rect.Left,Rect.Top,Rect.Right,Rect.Bottom,ParentWnd,MenuWnd,HandleAppl,lpParam)  ;

end;

и само использование(тоже к примеру):

type

TForm1 = Class(TWindowClass)
WndClassName: TWndClass;
Menu:HMENU;
constructor Create;
end;

var
Form1:TForm1;
RectBorder:Trect;

function TForm1.WindowProcQ(hWnd,Msg,wParam,lParam:Longint):LongInt; stdcall;
begin
 Result:=DefWindowProc(hWnd,Msg,wParam,lParam);
 case Msg of
 WM_COMMAND: ...  ;
 WM_DESTROY: ...  ;
 WM_CREATE:  ...  ;
 WM_CONTEXTMENU: ...  ;
   end;
end;

constructor TForm1.Create;
begin
   RectBorder.Left:=10;
   RectBorder.Top:= 10;
   RectBorder.Right:= 700;
   RectBorder.Bottom:= 500;
with WndClassName do
   begin
        Style:=         CS_PARENTDC;
        hIcon:=         LoadIcon(hApplication,"MAINICON");
        lpfnWndProc:=   @WindowProcQ;//<--- ОШИБКА ТУТ  - "Требуется переменная"
        hInstance:=     hApplication;
        hbrBackground:= COLOR_BTNFACE+1;
        lpszClassName:= "Window";
        hCursor:=       LoadCursor(0,IDC_ARROW);
        lpszMenuName   :="LB_FILE_MENU"
   end;
inherited Create(WndClassName,"Заголовок моего окна",RectBorder,WS_TILEDWINDOW or WS_VISIBLE,
                   0,0,"LB_FILE_MENU",happlication,nil);
end;

begin
Form1:=TForm1.create;

...

и так далее, это не важно сейчас.

...
end.


 
Суслик ©   (2004-10-06 15:39) [13]


> [12] Comp ©   (06.10.04 15:37)

помню, я уже тебе давал ответ.
причем, ровно такой же как дал сейчас в [4].
в чем проблема?


 
Digitman ©   (2004-10-06 15:40) [14]


> Суслик ©   (06.10.04 15:34) [11]


просто краем глаза наблюдал, как этот вопрос, родившись некое время раньше в "ВинАПИ" и благополучно перекочевав в "Потрепаться", реинкарнировал ныне ... причем - с той же точки понимания, хотя в "Потрепаться" автору дали достаточно четкие рекомендации, где и что копать в плане самостоятельного изучения деталей сабжа


 
Comp ©   (2004-10-06 15:42) [15]

Суслик ©, в том, что я не нашел описания этих ф-й.


 
Comp ©   (2004-10-06 15:45) [16]

Digitman ©   (06.10.04 15:40) [14]

просто краем глаза наблюдал, как этот вопрос, родившись некое время раньше в "ВинАПИ" и благополучно перекочевав в "Потрепаться", реинкарнировал ныне ... причем - с той же точки понимания, хотя в "Потрепаться" автору дали достаточно четкие рекомендации, где и что копать в плане самостоятельного изучения деталей сабжа


Прекрасно. Ток вот выход из любой ситуации всегда есть не один.


 
Суслик ©   (2004-10-06 15:48) [17]


> Прекрасно. Ток вот выход из любой ситуации всегда есть не
> один.

А-а-аа.
Вспоминию...
Ты это же и раньше говорил, только вот ни одного решения так и не нашел.

Совет на будущее - если не знаешь, что тебе посоветовали заходишь в директорию sources и делаешь поиск по файлам. То, что я тебе посоветовал сразу бы нашел.

Это модуль classes.


 
Суслик ©   (2004-10-06 15:49) [18]


> [14] Digitman ©   (06.10.04 15:40)
>
> просто краем глаза наблюдал, как этот вопрос, родившись
> некое время раньше в "ВинАПИ" и благополучно перекочевав
> в "Потрепаться"

Согласен, не сразу заметил.


 
Comp ©   (2004-10-06 15:51) [19]

Суслик ©   (01.10.04 18:13) [65]

есть только ощущение, что автору вопроса наши зрелые и взвешанные высказываения до лампочки.


Не стоило так утверждать.


 
Суслик ©   (2004-10-06 15:54) [20]


>  [19] Comp ©   (06.10.04 15:51)

Ты нам мстишь?:))))
Задавая тот же самый вопрос второй раз?

Не обижайся.

Просто посмотри как сама ненавистная тобой vcl делает из метода оконную процедуру... Где искать я тебе сказал.


 
Digitman ©   (2004-10-06 15:55) [21]


> Comp ©   (06.10.04 15:51) [19]
> Не стоило так утверждать.


а вот приходится делать такое предположение !
ибо непонятно, почему ты до сих пор не сделал сквозной поиск по исходникам VCL модулей, содержащих  ключ.слово "MAKEOBJECTINSTANCE"


 
Comp ©   (2004-10-06 16:01) [22]

Суслик ©   (06.10.04 15:54) [20]

>  [19] Comp ©   (06.10.04 15:51)

Ты нам мстишь?:))))
Задавая тот же самый вопрос второй раз?

Не обижайся.

Просто посмотри как сама ненавистная тобой vcl делает из метода оконную процедуру... Где искать я тебе сказал.


Я никому не мщу.

Спасибо, функции я нашел.


 
Comp ©   (2004-10-07 01:59) [23]

Удалено модератором


 
Суслик ©   (2004-10-07 09:20) [24]


> Comp ©   (07.10.04 01:59) [23]


> А я и не делал ничего, просто объяснил, почему сообщение
> дублировалось.

Ты правила читал? Что там сказано о том, как выяснять отношения с модератором? Правильно, почтой... ТОгда в чем же дело?



Страницы: 1 вся ветка

Текущий архив: 2004.10.24;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.06 c
1-1097223524
Chuk45
2004-10-08 12:18
2004.10.24
А если Excel закрыт????


8-1091104234
Vadik
2004-07-29 16:30
2004.10.24
Работа с видео камерой из Delphi


1-1097351371
Алексей
2004-10-09 23:49
2004.10.24
Узнать какой объект создал событие


3-1096054177
tormoz
2004-09-24 23:29
2004.10.24
Проверка таблицы на соответствие структуры


14-1096876667
Доброжелатель
2004-10-04 11:57
2004.10.24
Зарплата