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

Вниз

Создание класса   Найти похожие ветки 

 
drin ©   (2002-12-18 00:54) [0]

Если создавать новый класс и за базовый брать объект TObject, может ли он иметь дескриптор (Handle), например чтобы ему послать сообщение?


 
DVM ©   (2002-12-18 01:01) [1]

нет


 
PVOzerski ©   (2002-12-18 01:36) [2]

Ваш класс может иметь свой Handle, но только как Вы собираетесь с ним работать? Если, скажем, класс - инкапсуляция окна, а его handle представляет handle этого окна, то все очевидно (только вот с точки зрения наследования этот handle никак не будет соотноситься с одноименными свойствами в стандартных классах VCL).
2drin © (18.12.02 00:54): а как же сама VCL написана (равно как и KOL)? :^)


 
drin ©   (2002-12-18 02:12) [3]

Ну если я создаю такой класс, что мен ещё нужно зделать, что-бы у TMyClass был свой Handle, и если я пошлю ему WM_USER выполнилвсь процедура TMyClass.WMUser:

TMyClass = class
private
procedure WMUser(var Message: TMessage); message WM_USER;
end;



 
PVOzerski ©   (2002-12-18 02:39) [4]

Как минимум, в конструкторе создавать или отлавливать окно и использовать значение его handle. Обработку сообщений упихивать в WndProc этого окна.


 
А   (2002-12-18 03:25) [5]

чем Вам плох в качестве предка TWinControl?


 
drin ©   (2002-12-18 03:35) [6]

Тоесть в контрукторе вызывать CreateWindow, и использовать его handle, а что делать с WndProc?


 
drin ©   (2002-12-18 03:39) [7]

>A

uses
clasess;


После чего мин. размер программы 350кб.


 
А   (2002-12-18 04:01) [8]

ну так тогда Вам прямая дорога на API, где есть "Окна", но нет "объектов"! Зачем Вам тогда "убогий" TObject?


 
PVOzerski ©   (2002-12-18 05:04) [9]

А вот несколько извратный "шедевр", который я сотворил специально по заказу drin:

Форма:

object Form1: TForm1
Left = 200
Top = 108
Width = 544
Height = 375
Caption = "Form1"
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = "MS Sans Serif"
Font.Style = []
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 88
Top = 160
Width = 75
Height = 25
Caption = "Button1"
TabOrder = 0
OnClick = Button1Click
end
end

Модуль:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
tMyClass=class
private
wc:tWndClass;
h:tHandle;
public
constructor create;
procedure WmUser(var Msg:tMessage);message WM_USER;
destructor Destroy;
property Handle:tHandle read h;
end;

TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
mc:tMyClass;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

function CommonWndProc(hWnd:tHandle;uMsg:cardinal;wParam,lParam:longint):longint;stdcall;
var
C:tMyClass;
s:shortstring;
code:integer;
m:tMessage;
begin
byte(s[0]):=GetClassName(hWnd,@s[1],255);
s[1]:="$";
val(s,longint(C),code);
m.Msg:=uMsg;
m.WParam:=WParam;
m.LParam:=Lparam;
m.Result:=1;
if code=0 then
C.Dispatch(m);
Result:=m.Result;
end;

constructor tMyClass.create;
var
s:string;
begin
s:="W"+inttohex(longint(self),8);
wc.style:=0;
wc.lpfnWndProc:=@CommonWndProc;
wc.cbClsExtra:=0;
wc.cbWndExtra:=0;
wc.hInstance:=hInstance;
wc.hIcon:=0;
wc.hCursor:=0;
wc.hbrBackground:=0;
wc.lpszMenuName:=nil;
wc.lpszClassName:=@s[1];
Windows.RegisterClass(wc);
h:=CreateWindow(wc.lpszClassName,"",0,0,0,10,10,0,0,hInstance,nil);
end;
procedure tMyClass.WmUser(var Msg:tMessage);
begin
ShowMessage(pChar(Msg.Wparam));
end;
destructor tMyClass.Destroy;
begin
DestroyWindow(h);
Windows.UnregisterClass(wc.lpszClassName,hInstance);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
mc:=tMyClass.create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
mc.Destroy;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(mc.Handle,WM_USER,longint(pChar("!!!")),0);
end;

end.

После компиляции (D3) сие творение у меня приветствует тремя восклицательными знаками каждое нажатие кнопки Button1.


 
MBo ©   (2002-12-18 06:35) [10]

AllocateHWnd
Реализация TTimer


 
drin ©   (2002-12-18 19:12) [11]

>PVOzerski
Огромнейшее спасибо за помощь, если я зделаю так, то работать будет, но корректно ли?:


Форма:

object Form1: TForm1
Left = 200
Top = 108
Width = 544
Height = 375
Caption = "Form1"
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = "MS Sans Serif"
Font.Style = []
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 88
Top = 160
Width = 75
Height = 25
Caption = "Button1"
TabOrder = 0
OnClick = Button1Click
end
end

Модуль:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
tMyClass=class
private
wc:tWndClass;
h:tHandle;
public
constructor create;
destructor Destroy;
property Handle:tHandle read h;
end;

TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
mc:tMyClass;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

function CommonWndProc(hWnd:tHandle;uMsg:cardinal;wParam,lParam:longint):longint;stdcall;
begin
case uMSG of
WM_USER: ShowMessage(pChar(wparam));
..........
end;
Result:=1;
end;

constructor tMyClass.create;
begin
wc.style:=0;
wc.lpfnWndProc:=@CommonWndProc;
wc.cbClsExtra:=0;
wc.cbWndExtra:=0;
wc.hInstance:=hInstance;
wc.hIcon:=0;
wc.hCursor:=0;
wc.hbrBackground:=0;
wc.lpszMenuName:=nil;
wc.lpszClassName:="MyClass";
Windows.RegisterClass(wc);
h:=CreateWindow(wc.lpszClassName,"",0,0,0,10,10,0,0,hInstance,nil);
end;

destructor tMyClass.Destroy;
begin
DestroyWindow(h);
Windows.UnregisterClass(wc.lpszClassName,hInstance);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
mc:=tMyClass.create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
mc.Destroy;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(mc.Handle,WM_USER,longint(pChar("!!!")),0);
end;

end.


 
drin ©   (2002-12-18 19:15) [12]

>MBo
Можно поподробнее про AllocateHWnd?



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

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

Наверх




Память: 0.5 MB
Время: 0.016 c
4-99415
shu_3d
2002-11-13 12:21
2002.12.30
Неправильные размеры при рисовании через winAPI


3-98971
BSD
2002-12-09 17:01
2002.12.30
Использование плана в тригере


14-99292
pikimon
2002-12-09 17:10
2002.12.30
Установка под WinXP


1-99057
}|{ozik
2002-12-19 13:25
2002.12.30
Запись CDR


8-99204
UsBall
2002-08-28 22:59
2002.12.30
Захват видео.