Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.036 c
14-1096626273
Незнакомка
2004-10-01 14:24
2004.10.24
Рост мужчины и женщины. И если он ниже ростоом, чем она?


3-1096469759
Ivan_
2004-09-29 18:55
2004.10.24
Обновление информации у всех пользователей


14-1096750207
Поручик
2004-10-03 00:50
2004.10.24
Помогите найти


1-1097579697
DesWind
2004-10-12 15:14
2004.10.24
Аппроксимация


6-1092399409
Blick
2004-08-13 16:16
2004.10.24
Изменение програмно IP адреса





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский