Форум: "Основная";
Текущий архив: 2002.12.30;
Скачать: [xml.tar.bz2];
ВнизСоздание класса Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.013 c