Hi all

I have this beaten now  !!!!

The required message is CM_CANCELMODE ....

procedure   CMCancelMode(var Message: TCMCancelMode); message CM_CANCELMODE;


I found this using my expert skills (or looking at some third party components we use and putting breakpoints in) ;-)

I had tried this earlier but my component actually creates a child component when expanded and I needed to better provide communication between them. I am not an expert component creator (far from it) but what I have is both components checking for this event and using the ScreenToClient code provided by Todd to ensure the mouse isn't within either component. If not it closes the 'component'.

CM_CANCELMODE and its friend WM_CANCELMODE are really strangely described my MS and others as 'providing special functionality in certain circumstances' or some such. But essentially it seems to be when a non focusable control or window is selected.

Will test further but it seems this has hit the nail on the head. A big thanks to all who have contributed.



Rob Martin
Software Engineer

phone +64 03 377 0495
fax   +64 03 377 0496
web www.chreos.com

Wild Software Ltd



Robert martin wrote:
Hi

Haven't tried it yet but the help (D6) says MouseCapture is about handling drag and drop actions.
Rob Martin
Software Engineer

phone +64 03 377 0495
fax   +64 03 377 0496
web www.chreos.com

Wild Software Ltd



Todd Martin wrote:
Hi Robert

Try using MouseCapture.

Todd.

----- Original Message ----- From: "Robert martin" <[EMAIL PROTECTED]>
To: "NZ Borland Developers Group - Delphi List" <[email protected]>
Sent: Tuesday, September 05, 2006 1:17 PM
Subject: Re: [DUG] Component creation


Hi Todd

I would love to do this but the WM_LBUTTONDOWN message only triggers when clicking in my component (not outside) so It is pretty useless. I know I could override the forms events and do something but as this is a component (to be used in many forms / applications) that isn't feasible.

The frustrating thing is that TComboBox (and lots of other combos) already do this. If the combo is dropped down, clicking on the form closes the drop down list. I just cant see code that does it !


Rob Martin
Software Engineer

phone +64 03 377 0495
fax   +64 03 377 0496
web www.chreos.com

Wild Software Ltd



Todd Martin wrote:
Hi Wayne

The general idea is to trap the MouseDown event on your own component and check the position of the mouse,
Control.ScreenToClient(Mouse.CursorPos),
when you do. If the cursor is outside the boundary of your control, perform the clean up operation.

If the user clicks on a focusable component, the focus shifts to that object and the MouseDown event is not fired, so instead you perform your clean up in your component's OnExit event.

Todd.

----- Original Message ----- From: "Wayne Roser" <[EMAIL PROTECTED]>
To: "NZ Borland Developers Group - Delphi List" <[email protected]>
Cc: <[email protected]>
Sent: Tuesday, September 05, 2006 12:05 PM
Subject: Re: Re: [DUG] Component creation


Hi Gary
1. Am I correct in thinking that I would need to trap mousedown on every non-focusable object and
call MyMouseDown for each TEdit1 that might have focus?
2. Is this the usual way to pass on the message. (I called the component a TFocusEdit)

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y:
Integer);
var
 AMessage: TWMLButtonDown;
begin
 FocusEdit1.MyMousedown(AMessage);
//All other FocusEdits and FocusCombos etc get a MyMousedown here; recursion?
end;

Wayne

NZ Borland Developers Group - Delphi List <[email protected]> on Tuesday, 5 September 2006 at
11:37 a.m. +0000 wrote:
[Reply]

HI Rob et all,

Here's a mod to the previous code that makes the change when you click on the form.

Note that when you click off the component on to a non-focusable object, the original component still has focus, so you can trap the mousedown event and go from there.

If you click on a focusable component then focus leaves and you can trap the onexit event.

HTH

cheers

Gary

unit Edit1;

interface

uses

Messages,SysUtils, Classes, Controls, StdCtrls, Graphics;

type

TEdit1 = class(TEdit)

private

{ Private declarations }

procedure MyExit(var Message: TCMExit); message CM_EXIT;

procedure MyEnter(var Message: TCMEnter); message CM_ENTER;

procedure MyMousedown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;

protected

{ Protected declarations }

public

{ Public declarations }

published

{ Published declarations }

end;

procedure Register;

implementation

procedure Register;

begin

RegisterComponents('GCS', [TEdit1]);

end;

{ TEdit1 }

procedure TEdit1.MyEnter(var Message: TCMEnter);

begin

color:=clYellow;

end;

procedure TEdit1.MyExit(var Message: TCMExit);

begin

//

color:=clWindow;

end;

procedure TEdit1.MyMousedown(var Message: TWMLButtonDown);

begin

color:=clWindow;

inherited;

end;

end.

At 10:55 on 5/09/2006 you wrote

To : [email protected]

CC :

From: Robert martin, [EMAIL PROTECTED]

Content Type: text/plain

Attached:



Thought I had tried it but my implementation mat have been wrong, will

have another crack :)



Rob Martin

Software Engineer



phone +64 03 377 0495

fax +64 03 377 0496

web www.chreos.com



Wild Software Ltd







James Sugrue wrote:

WM_KILLFOCUS?



Never used it, but apparently it can be a bit dodgy.



-----Original Message-----

From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On

Behalf Of Robert martin

Sent: Tuesday, September 05, 2006 10:11 AM

To: NZ Borland Developers Group - Delphi List

Subject: [DUG] Component creation



Hi



I have a custom component that expands to show data. When focus changes

it reverts back to its shrunken state. However I also want it to revert

to small if the user clicks the mouse anywhere outside of the component

(the way that TComboBox does if it is dropped down).



I assume I need to trap a windows message to handle this but I just cant

see which.



Any suggestions ?





_______________________________________________

Delphi mailing list

[email protected]

http://ns3.123.co.nz/mailman/listinfo/delphi





----------------------------------------------------------------------------------------------------


Gary Benner
e-Engineer, Lecturer, and Software Developer

[ http://www.123.co.nz ]123 Internet Limited
[ http://www.waiariki.ac.nz ]Waiariki Institute of Technology
[ http://www.sunshinebags.co.nz ]Sunshine Garden Bag Co.
[ http://www.sommnet.com ]Sommnet.com Limited
Mob: 021 966 992
Email: [ mailto:[EMAIL PROTECTED] [EMAIL PROTECTED]



Ref#: 41006

_______________________________________________
Delphi mailing list
[email protected]
http://ns3.123.co.nz/mailman/listinfo/delphi


_______________________________________________
Delphi mailing list
[email protected]
http://ns3.123.co.nz/mailman/listinfo/delphi



--
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.1.405 / Virus Database: 268.11.7/432 - Release Date: 29/08/2006





_______________________________________________
Delphi mailing list
[email protected]
http://ns3.123.co.nz/mailman/listinfo/delphi



--
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.1.405 / Virus Database: 268.11.7/432 - Release Date: 29/08/2006




_______________________________________________
Delphi mailing list
[email protected]
http://ns3.123.co.nz/mailman/listinfo/delphi

_______________________________________________
Delphi mailing list
[email protected]
http://ns3.123.co.nz/mailman/listinfo/delphi

Reply via email to