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

Вниз

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

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

Наверх





Память: 0.56 MB
Время: 0.043 c
11-1081879198
hammer
2004-04-13 21:59
2004.10.24
Фреймы в kol e


4-1095753422
Дима
2004-09-21 11:57
2004.10.24
Выключение питания


14-1096613025
Григорьев Антон
2004-10-01 10:43
2004.10.24
Куда бы съездить в выходные?


3-1096030520
panov
2004-09-24 16:55
2004.10.24
ADO. Типы полей в DDL


1-1097249438
greenrul
2004-10-08 19:30
2004.10.24
ActionToolbar и ActionMainMenu - иконки разных размеров





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