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

Вниз

Указатель   Найти похожие ветки 

 
Comp ©   (2004-10-01 01:36) [0]

Всем привет. Ребята, я решил программирование на API свести к объектно-ориентированному, т.е. с помощью классов. И тут столкнулся с одной неприятной проблемой.
В общем,дело так. Я думаю, все знают алгоритм создания окна на API. Решил же этот алгоритм разбить на методы. Вот например:

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.


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

Может, кто знает, подскажите пожалуйста.


 
KSergey ©   (2004-10-01 06:49) [1]

А в VCL посмотерть?
Ну нельзя в качетсве CallBack указать метод класса. Т.к. у любого метода есть неявный аргумент -указатель на экземпляр.
Вот и думай откуда его взять. Методов много. Почитай на королевтсве Hello, World про семь чудес, да и много где эта тема пережевывалась. В любом случае надо делать некую общую обычную (не член класса) ф-цию - а уже в ней все разруливать. Как - придумай сам.
А главное: вот нахрена такое нужно, вот кто мне объяснит? Заняться нечем??


 
Alekc   (2004-10-01 08:49) [2]

Хинт: Посмотри как это в КОЛ реализовано ;o)


 
Nil_NULL   (2004-10-01 09:51) [3]

А если в классе сделать св-во:

....
 pWndProc:TpWndProc;
....

А перед этим определяем тип:
TpWndProc=function (<параметры>):<result>
Далее описвываем функцию и присваеваем в pWndProc, и т.д. Так не будет пахать?


 
KSergey ©   (2004-10-01 10:02) [4]

> Так не будет пахать?

Смотря как сделать.
Вот ведь только незадача: оконная процедура задается на весь класс окна (не путать с ООП классами), создаваемый же экземпляр объекта будет будет разный на все создаваемые окна... А класс окна регистрируется ДО создания окна...

А вообще вариаций, понятно, немеряно.


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

а есть еще такие фукнции

function MakeObjectInstance(Method: TWndMethod): Pointer;
procedure FreeObjectInstance(ObjectInstance: Pointer);
function AllocateHWnd(Method: TWndMethod): HWND;
procedure DeallocateHWnd(Wnd: HWND);

из подуля classes.pas

посмотри как их использует сама vcl


 
Comp ©   (2004-10-01 10:18) [6]

KSergey
>А главное: вот нахрена такое нужно, вот кто мне объяснит? Заняться нечем??

 Методом ООП программы (ЛЮБЫЕ) писать проще, да и текст потом нагляднее. Вот я и хочу так сделать.

> А класс окна регистрируется ДО создания окна...

Че-то я не пойму. Я собираюсь класс окна (тот, который не ООП), точнее переменную типа этот класс втиснуть в другой класс, например TForm1, а в процессе выполнения программы...

begin

...создать этот класс (TForm1), который и создаст сначала переменную типа класс окна, потом зарегистрирует её.

end.


 
Игорь Шевченко ©   (2004-10-01 10:20) [7]


>  Методом ООП программы (ЛЮБЫЕ) писать проще, да и текст
> потом нагляднее. Вот я и хочу так сделать.


Borland тоже так считает. Написал VCL для этого.


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

>Суслик ©
Спасибо, домой попаду - перерою весь модуль.

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


 
Nil_NULL   (2004-10-01 10:25) [9]

>>Вот ведь только незадача: оконная процедура задается на весь класс окна (не путать с ООП классами), создаваемый же экземпляр объекта будет будет разный на все создаваемые окна... А класс окна регистрируется ДО создания окна...
Св-во можно пихнуть в класс TWindowClass а процедуру сделать виртуальной/абстрактной и описывать её в TForm(от TWindowClass)


 
суслик ©   (2004-10-01 10:25) [10]

Автору.

Ты такое сочетине VCL знаешь?
Нафиг это все?

Имхо такой подход оправдан только в целях изучения. Но в данном случае сложно тебя понять - ты очевидно не изучил модуль controls,forms и пр. Иначе ты точно получил бы ответ не ворпос.


 
Comp ©   (2004-10-01 10:29) [11]

Игорь Шевченко , да, только готовым  пользоваться не очень приятно...(в смысле до такой степени, что ручками почти ничего не надо писать - взял кнопочку, да тискаешь её с места на место, например). Это не программирование.
У API больше (НАМНОГО) возможностей.

А вообще кто нибудь увлекается программированием целиком на API?
Если да, то наверняка эту проблему решили уже давно. Помогите пожалуйста решить её сейчас :((


 
Суслик ©   (2004-10-01 10:32) [12]


>
> А вообще кто нибудь увлекается программированием целиком
> на API?
> Если да, то наверняка эту проблему решили уже давно. Помогите
> пожалуйста решить её сейчас :((

Братец, ты читать умеешь?
Я тебе дал ответ.


 
Comp ©   (2004-10-01 10:33) [13]

суслик ©, да, внутри них я не лазил - да и зачем было? (как я уже сказал).

А теперь VCL будто не существует  - есть тока API, Pascal,C++, и справка всякая.


 
Суслик ©   (2004-10-01 10:33) [14]


> да, внутри них я не лазил - да и зачем было? (как я уже
> сказал).

Зачем? Хотя  бы для того, чтобы не задавать этот вопрос, а найти ответ там.:))


 
Comp ©   (2004-10-01 10:36) [15]

> Суслик,
Я тебе дал ответ.

например?


 
Суслик ©   (2004-10-01 10:38) [16]


>  [15] Comp ©   (01.10.04 10:36)

Ты эттта, того, тупишь что ли?

Моих ответов тут несколько штук. И только в одном есть упоминание неких фукнци. Неужели сложно найти?


 
Игорь Шевченко ©   (2004-10-01 10:38) [17]

Comp ©   (01.10.04 10:29) [11]


> готовым  пользоваться не очень
> приятно...(в смысле до такой степени, что ручками почти
> ничего не надо писать - взял кнопочку, да тискаешь её с
> места на место, например). Это не программирование.
> У API больше (НАМНОГО) возможностей.


Велосипед изобретать полезно только с точки зрения самообразования. Не больше.

Я к чему это говорю - если у тебя возникли проблемы, посмотри, как они решены в готовом велосипеде, в данном случае, в VCL.


 
Nil_NULL   (2004-10-01 10:42) [18]

Чесно говоря я не могу понять смысл(т.е. для чего автор это делает) вопроса. Например для написания маленькой программки я беру API. Если много работы с пользовательским интерфейсом то проще не тратить время на API, а покидать элементы на форму/формы


 
Суслик ©   (2004-10-01 10:47) [19]


> Nil_NULL   (01.10.04 10:42) [18]
> Чесно говоря я не могу понять смысл

Судя по всему он занимается самообразованием. Только вот полностью игнорирует существующие примеры реализации. Хочет усе придумать сам.


 
Comp ©   (2004-10-01 10:49) [20]

Суслик ©

Я уже сказал, что твои функции (в смысле,которые ты упомянул) я рассмотрю позже.

Во-вторых мнения одного человека всегда мало.

В третьих, ты хороший теоретик, а насчет практики пока себя не проявил (в этой ветке)


 
Comp ©   (2004-10-01 10:52) [21]

Суслик ©

Давай не будем устраивать  ругань
Но ты здесь не один, и пожалуйста не считай, что твоего ответа достаточно.
Это самопереоценка.


 
Суслик ©   (2004-10-01 10:54) [22]


> В третьих, ты хороший теоретик, а насчет практики пока себя
> не проявил (в этой ветке)

при чем тут теория?
я тебе дал конкретную функцию: MakeObjectInstance.

lpfnWndProc:=   @WindowProcQ;
замени на
lpfnWndProc:=   MakeObjectInstance(WindowProcQ);

не забудь соответсвующим образом заменить описание твоей оконной функции.


 
Nil_NULL   (2004-10-01 10:55) [23]

2Суслик
Насчёт самообразованию я придерживаюсь следущего:
- Читать другие коды/программы/компоненты (умение анализировать)
- Читать Статьи/крниги ;)
- Читать примеры Borland"a & VCL
- Элсперементировать... 8)
З.Ы.
ну это в кратце...


 
Comp ©   (2004-10-01 10:56) [24]

Nil_NULL  , ты прав, иногда без VCL туго, очень туго.
Но как глянешь на размер конечного файла - аж лихорадить начинает.
Лучше попотеть, но остаться довольным.


 
Суслик ©   (2004-10-01 10:56) [25]


>  [21] Comp ©   (01.10.04 10:52)
> Суслик ©
>
> Давай не будем устраивать  ругань
> Но ты здесь не один, и пожалуйста не считай, что твоего
> ответа достаточно.
> Это самопереоценка.

Братец.
Ты сказал
"Помогите пожалуйста решить её сейчас :((".
Я тебе сказал, что решить ее сейчас можно так-то и так-то.
Где ты тут углядел самопереоценку? :)) Может в том, что решил наставить тебя не путь истинный. Пожалуй да - переоценил себя :)))


 
Суслик ©   (2004-10-01 10:57) [26]


> Лучше попотеть, но остаться довольным.

и бедным...


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

Люди, всем спасибо, но давайте не будем разговаривать, иначе перекинут туда, где тока трёпом и занимаются.
 
Суслик ©   (01.10.04 10:54) [22]

Спасибо, я приду домой рассмотрю.


 
Nil_NULL   (2004-10-01 11:00) [28]

Ну тык я и писал что если необходима маленькая - API.
Ну или вот пример: Одна из форм проекта отображает данные - визуальных компонентов >=20 (Edit"ы, MaskEdit"ы, StringGrid"ы) а теперь представь сколько времени и кода у тебя уйюдет на реализацию хотябы двух методов : заполнение данными и получение данных? (а проект не из одно формы)


 
Nil_NULL   (2004-10-01 11:00) [29]

Ну тык я и писал что если необходима маленькая - API.
Ну или вот пример: Одна из форм проекта отображает данные - визуальных компонентов >=20 (Edit"ы, MaskEdit"ы, StringGrid"ы) а теперь представь сколько времени и кода у тебя уйюдет на реализацию хотябы двух методов : заполнение данными и получение данных? (а проект не из одно формы)


 
Comp ©   (2004-10-01 11:01) [30]

Суслик © , вот ты чел.
Да, можно и бедным. Но потом приятно смотреть и довольствоваться собственной победой над своим же незнанием...


 
Nil_NULL   (2004-10-01 11:01) [31]

Удачи !!!


 
Суслик ©   (2004-10-01 11:03) [32]


>  [30] Comp ©   (01.10.04 11:01)
> Суслик © , вот ты чел.
> Да, можно и бедным. Но потом приятно смотреть и довольствоваться
> собственной победой над своим же незнанием...

Ты бы возрат в анкете указал - есть ощущение, что ты в 8 классе.


 
Comp ©   (2004-10-01 11:04) [33]

Суслик ©

Братец.
Ты сказал
"Помогите пожалуйста решить её сейчас :((".
Я тебе сказал, что решить ее сейчас можно так-то и так-то.
Где ты тут углядел самопереоценку? :)) Может в том, что решил наставить тебя не путь истинный. Пожалуй да - переоценил себя :)))


Нет, то, что ты настырно настаиваешь на том, что твоего ответа хватит.

Извини, я уже сказал, что это как вариант остается.


 
Игорь Шевченко ©   (2004-10-01 11:06) [34]


> В третьих, ты хороший теоретик, а насчет практики пока себя
> не проявил (в этой ветке)


А с чего ты решил, что тебе тут кто-то обязан ? :)

Занимаешься изобретением велосипедов, так и наступай на грабли самостоятельно :)


 
Comp ©   (2004-10-01 11:08) [35]

Суслик ©

Извини, я не знаю, наскока ты образован.

Во вторых, программированием я занимаюсь только год.

В третьих, это только моё хобби. Ради собственного интереса.


 
Comp ©   (2004-10-01 11:09) [36]

Игорь Шевченко ©  

А я и не говорил , что мне кто-то ОБЯЗАН.

Я хочу узнать мнение других, а не тока одного человека.

Ты что-то перепутал.


 
Comp ©   (2004-10-01 11:11) [37]

Игорь Шевченко ©,

 Когда человек делится примером, эффект больше, и вопросов меньше.


 
Суслик ©   (2004-10-01 11:14) [38]


>  [35] Comp ©   (01.10.04 11:08)
> Извини, я не знаю, наскока ты образован.

Причем здесь мое образование?


>  Когда человек делится примером, эффект больше, и вопросов
> меньше.

Зачем тебе примеры? Ты же сам изобретаешь велосипед.
У тебя пример под боком - vcl называется. Изучай. Точку входа я тебе дал.


 
KSergey ©   (2004-10-01 11:17) [39]

> [37] Comp ©   (01.10.04 11:11)
>  Когда человек делится примером, эффект больше, и вопросов
> меньше.

Ага, и copy/paste проще...


 
KSergey ©   (2004-10-01 11:17) [40]

Короче, ответов надавали кучу. Угомонись, а то добром это не кончится



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

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

Наверх




Память: 0.58 MB
Время: 0.027 c
6-1092435813
KILLMAN
2004-08-14 02:23
2004.10.24
Дескриптор сокета


4-1095093283
ipnet
2004-09-13 20:34
2004.10.24
Как поменять цвет текста у метки ?


1-1097262217
Sulimxar
2004-10-08 23:03
2004.10.24
Иконки


3-1096381802
LamLam
2004-09-28 18:30
2004.10.24
FireBird embedded - ну никак не хочет...


4-1095408289
gs
2004-09-17 12:04
2004.10.24
Данные системы