Текущий архив: 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.52 MB
Время: 0.035 c