Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.59 MB
Время: 0.042 c
1-99160
Кокандокало
2002-12-18 15:41
2002.12.30
проблемы с OnClick на Splash форме


1-99137
Berg
2002-12-18 14:21
2002.12.30
Глупый вопрос, наверно......


4-99391
Dark Hunter
2002-11-13 12:34
2002.12.30
Как повесить глобальный хук?


4-99400
dwax
2002-11-14 13:12
2002.12.30
иконки


8-99209
Карелин Артем
2002-09-06 10:51
2002.12.30
Работа с обьектом 3D Max





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