How can I provide an internal private non-visual window (handle) of a non-visual component of VCL?

This is the next question.

My previous questions:

My problem:

TComponent does not have a window handle such as TWinControl. I do not want to rely on external.

This is a snippet of my custom component

type TMyClipBoardListener = class(TComponent) private FInnerWindowHandle: HWnd; FNextHWnd: HWnd; //... protected procedure Loaded; override; procedure WndProc(var Msg: TMessage); // <<< This is my wouldbe Window to handle messages public constructor Create(AOwner: TComponent); override; destructor Destroy; override; // ... published // ... end; 

Excerpt from my custom component

 constructor TMyClipBoardListener .Create(AOwner: TComponent); begin inherited; // FInnerWindowHandle := ...; // <<< What to do here ? Should I pass it to a function/procedure I missed? end; destructor TMyClipBoardListener .Destroy; begin if not(csDesigning in ComponentState) then begin ChangeClipboardChain(FInnerWindowHandle, FNextHWnd); end; // // <<< Are there some cleaning code related to FInnerWindowHandle to implement here or elsewhereCreates a window that implements a specified window procedure. ? // inherited; end; procedure TMyClipBoardListener.Loaded; begin inherited; // if not(csDesigning in ComponentState) then begin FNextHWnd:= SetClipboardViewer(FInnerWindowHandle); end; end; procedure TMyClipBoardListener.WndProc(var Msg: TMessage); begin with Msg do begin // Message to handle : WM_CHANGECBCHAIN and WM_DRAWCLIPBOARD // ... else Result := DefWindowProc(FInnerWindowHandle, Msg, WParam, LParam); // <<< Is this the right way to do default handling properly? end; end; 

My question is:

How can I get an internal window for my custom component that implements the embedded window procedure?

+4
source share
1 answer

Call AllocateHwnd from the Classes module (not Forms).

 FInnerWindowHandle := AllocateHwnd(WndProc); 

When you are done, call DeallocateHwnd .

+12
source

Source: https://habr.com/ru/post/1390489/


All Articles