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