28
Ray Konopka Creating Custom Microsoft .NET Framework Controls in Delphi

Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

Embed Size (px)

Citation preview

Page 1: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

Ray KonopkaRay Konopka

Creating Custom Microsoft .NET Framework

Controls in Delphi

Creating Custom Microsoft .NET Framework

Controls in Delphi

Page 2: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

2

AgendaAgenda

.NET Component Model

Comparing the FCL to the VCL

Custom Events

Custom Painting

Component Related Attributes

Sample Control

.NET Component Model

Comparing the FCL to the VCL

Custom Events

Custom Painting

Component Related Attributes

Sample Control

Page 3: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

3

.NET Component Model.NET Component Model

Defined in the System.ComponentModel namespace

Includes System.ComponentModel.Component

declaration Common Delegates Component Related Attribute declarations Licensing Classes Design-time Support Classes

Defined in the System.ComponentModel namespace

Includes System.ComponentModel.Component

declaration Common Delegates Component Related Attribute declarations Licensing Classes Design-time Support Classes

Page 4: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

4

Component ClassComponent Class

System.ComponentModel.Component provides the base implementation of IComponent in the FCL

Defines the following properties DesignMode Container Site Events

Descend from System.ComponentModel.Component to create a nonvisual component

System.ComponentModel.Component provides the base implementation of IComponent in the FCL

Defines the following properties DesignMode Container Site Events

Descend from System.ComponentModel.Component to create a nonvisual component

Page 5: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

5

Two Control Classes in .NETTwo Control Classes in .NET

Most visual controls in .NET will descend from one of two classes:

System.Windows.Forms.Control Base WinForms Control class Most similar to existing component models (e.g.

VCL) Rendering handled through Graphics class (i.e.

GDI+)

System.Web.UI.Control Base ASP.NET Server Control class Renders markup text used by a client’s browser

or viewing device to display visual elements.

Most visual controls in .NET will descend from one of two classes:

System.Windows.Forms.Control Base WinForms Control class Most similar to existing component models (e.g.

VCL) Rendering handled through Graphics class (i.e.

GDI+)

System.Web.UI.Control Base ASP.NET Server Control class Renders markup text used by a client’s browser

or viewing device to display visual elements.

Page 6: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

6

System.Windows.Forms.Control

System.Windows.Forms.Control

Implements basic functionality for visualizationDefines the control’s bounds (i.e. its Position

and Size)Provides a window handle (Handle)Provides access to keyboard eventsProvides access to mouse eventsProvides access to paint eventsSupports ambient properties

Cursor, Font, BackColor, ForeColor, RightToLeft.

Implements basic functionality for visualizationDefines the control’s bounds (i.e. its Position

and Size)Provides a window handle (Handle)Provides access to keyboard eventsProvides access to mouse eventsProvides access to paint eventsSupports ambient properties

Cursor, Font, BackColor, ForeColor, RightToLeft.

Page 7: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

7

Comparing the FCL to the VCL

Comparing the FCL to the VCL

FCL is quite similar to the VCL, but there are significant differences

No equivalent to TGraphicControl

Actually, no TWinControl or TCustomControl classes either

System.Windows.Forms.Control is more like TCustomControl than TControl

Significantly fewer TCustomXxxx class called XxxxBase in FCL

FCL is quite similar to the VCL, but there are significant differences

No equivalent to TGraphicControl

Actually, no TWinControl or TCustomControl classes either

System.Windows.Forms.Control is more like TCustomControl than TControl

Significantly fewer TCustomXxxx class called XxxxBase in FCL

Page 8: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

8

Where is the Align property?

Where is the Align property?

Most of the functionality implemented in the VCL base classes is available in the base FCL classes

However, there are many property name changes Align Dock Caption Text Color BackColor Font.Color ForeColor PopupMenu ContextMenu ModalResult DialogResult etc.

Tag is an Object

ParentXxxx properties replaced with ambient properties

Most of the functionality implemented in the VCL base classes is available in the base FCL classes

However, there are many property name changes Align Dock Caption Text Color BackColor Font.Color ForeColor PopupMenu ContextMenu ModalResult DialogResult etc.

Tag is an Object

ParentXxxx properties replaced with ambient properties

Page 9: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

9

Control StylesControl Styles

TControl.ControlStyle replaced with GetStyle/SetStyle method pair

Some, but not all, styles have corresponding public properties ResizeRedraw

TControl.ControlStyle replaced with GetStyle/SetStyle method pair

Some, but not all, styles have corresponding public properties ResizeRedraw

SetStyle( ControlStyles.ResizeRedraw, True );SetStyle( ControlStyles.Opaque, True );

// Double BufferingSetStyle( ControlStyles.UserPaint, True );SetStyle( ControlStyles.AllPaintingInWmPaint, True );SetStyle( ControlStyles.DoubleBuffer, True );

SetStyle( ControlStyles.ResizeRedraw, True );SetStyle( ControlStyles.Opaque, True );

// Double BufferingSetStyle( ControlStyles.UserPaint, True );SetStyle( ControlStyles.AllPaintingInWmPaint, True );SetStyle( ControlStyles.DoubleBuffer, True );

Page 10: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

10

Component NotificationsComponent Notifications

Component notifications allow descendants to react to state changes implemented in an ancestor class

In the VCL, a component responds to notifications by handling special messages e.g. cm_EnabledChanged

In .NET, a component responds to notifications by overriding a method OnEnabledChanged Event Dispatch Method

.NET even surfaces component notifications as public events EnabledChanged Event

Component notifications allow descendants to react to state changes implemented in an ancestor class

In the VCL, a component responds to notifications by handling special messages e.g. cm_EnabledChanged

In .NET, a component responds to notifications by overriding a method OnEnabledChanged Event Dispatch Method

.NET even surfaces component notifications as public events EnabledChanged Event

Page 11: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

11

FCL and VCL EventsFCL and VCL Events

Unfortunately, the naming convention used for events in the FCL is opposite that used in the VCL

In the VCL… OnPaint is the event Paint is the event dispatch method

In the FCL… OnPaint is the event dispatch method Paint is the event

Unfortunately, the naming convention used for events in the FCL is opposite that used in the VCL

In the VCL… OnPaint is the event Paint is the event dispatch method

In the FCL… OnPaint is the event dispatch method Paint is the event

Page 12: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

12

FCL and VCL EventsFCL and VCL Events

Please Note: Unfortunately, it is common in .NET literature to

see statements like“…take a look at the OnPaint event handler…”

Problem is that base (ancestor) does not get called and thus the real event never gets raised

Please Note: Unfortunately, it is common in .NET literature to

see statements like“…take a look at the OnPaint event handler…”

Problem is that base (ancestor) does not get called and thus the real event never gets raised

Page 13: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

13

EventsEvents

Events allow customization through delegation

Events are properties

Implemented using Delegates

Events are optional

Events allow customization through delegation

Events are properties

Implemented using Delegates

Events are optional

Page 14: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

14

Creating a Custom EventCreating a Custom Event

Determine the action that triggers event

Define the event type (i.e. the Delegate) Specifies the parameters that will be sent to an

event handler

Declare the event property Singleton Event (read/write) Multicast Event (add/remove)

Dispatch the event when it occurs.

Determine the action that triggers event

Define the event type (i.e. the Delegate) Specifies the parameters that will be sent to an

event handler

Declare the event property Singleton Event (read/write) Multicast Event (add/remove)

Dispatch the event when it occurs.

Page 15: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

15

Determine Event TriggerDetermine Event Trigger

Events allow developers to “hook” into normal processing

Example Generate a ValueChanged event when data

represented by the component changes

Events allow developers to “hook” into normal processing

Example Generate a ValueChanged event when data

represented by the component changes

Page 16: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

16

DelegatesDelegates

The FCL utilizes Delegates to support events

A delegate is a class that encapsulates a linked-list of method pointers

With delegates an event can be sent to multiple subscribers

Specify the parameters that will be sent to event handlers.

The FCL utilizes Delegates to support events

A delegate is a class that encapsulates a linked-list of method pointers

With delegates an event can be sent to multiple subscribers

Specify the parameters that will be sent to event handlers.

Page 17: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

17

Define the DelegateDefine the Delegate

May be possible to use predefined delegate e.g. EventHandler

First parameter always “object sender”

Second parameter always EventArgs or descendant

If you require passing additional parameters, you’ll need to create a new EventArgs descendant

May be possible to use predefined delegate e.g. EventHandler

First parameter always “object sender”

Second parameter always EventArgs or descendant

If you require passing additional parameters, you’ll need to create a new EventArgs descendantValueChangingEventHandler =

procedure ( sender: System.Object; e: ValueChangingEventArgs ) of object;

ValueChangingEventHandler = procedure ( sender: System.Object; e: ValueChangingEventArgs ) of object;

Page 18: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

18

Declare the Event PropertyDeclare the Event Property

Unlike the VCL, by convention event names in the FCL do not start with “On”

Unlike the VCL, by convention event names in the FCL do not start with “On”

// Multicast Eventproperty ValueChanged: EventHandler add FValueChanged remove FValueChanged;

// Singleton Eventproperty ValueChanging: ValueChangingEventHandler read FValueChanging write FValueChanging;

// Multicast Eventproperty ValueChanged: EventHandler add FValueChanged remove FValueChanged;

// Singleton Eventproperty ValueChanging: ValueChangingEventHandler read FValueChanging write FValueChanging;

Page 19: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

19

Raise the EventRaise the Event

Use an Event Dispatch Method

In FCL, event dispatch methods start with “On”

Usually defined as strict protected and virtual

Calling the event (e.g. FValueChanged) causes all of the event handlers in the delegate’s list to be called

Use an Event Dispatch Method

In FCL, event dispatch methods start with “On”

Usually defined as strict protected and virtual

Calling the event (e.g. FValueChanged) causes all of the event handlers in the delegate’s list to be called

procedure RkSpinner.OnValueChanged( E: EventArgs );begin if Assigned( FValueChanged ) then FValueChanged( Self, E );end;

procedure RkSpinner.OnValueChanged( E: EventArgs );begin if Assigned( FValueChanged ) then FValueChanged( Self, E );end;

Page 20: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

20

Custom PaintingCustom Painting

Custom painting is supported by Graphics class (i.e. GDI+) System.Drawing System.Drawing.Drawing2D System.Drawing.Imaging System.Drawing.Text

GDI+ Features Alpha Blending & Anti-Aliased 2D Drawing Gradient Brushes Universal Transformations & Floating Point

coordinates Support for more Image formats

BMP, GIF, JPEG, PNG, TIFF, ICON, WMF, EMF.

Custom painting is supported by Graphics class (i.e. GDI+) System.Drawing System.Drawing.Drawing2D System.Drawing.Imaging System.Drawing.Text

GDI+ Features Alpha Blending & Anti-Aliased 2D Drawing Gradient Brushes Universal Transformations & Floating Point

coordinates Support for more Image formats

BMP, GIF, JPEG, PNG, TIFF, ICON, WMF, EMF.

Page 21: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

21

GDI+ Programming ModelGDI+ Programming Model

No more device contexts (DC) – Graphics Object

GDI+ is Stateless No more selecting pens and brushes into a DC Pens, Brushes, etc. are passed to each GDI+

drawing method

Graphic elements are no longer drawn with both Pen and Brush Draw methods use a Pen (eg. DrawRectangle) Fill methods use a Brush (eg. FillEllipse).

No more device contexts (DC) – Graphics Object

GDI+ is Stateless No more selecting pens and brushes into a DC Pens, Brushes, etc. are passed to each GDI+

drawing method

Graphic elements are no longer drawn with both Pen and Brush Draw methods use a Pen (eg. DrawRectangle) Fill methods use a Brush (eg. FillEllipse).

Page 22: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

22

GDI+ Programming ModelGDI+ Programming Model

Colors support Alpha Channels ARGB format

0x880000FF semi-transparent blue

A = 0x00 fully transparent A = 0xFF fully opaque

Rectangles, Points, etc. are classes r.Inflate( 5, 5 ); // Instead of InflateRect( r, 5,

5 );

Rectangles are defined differently! Left, Top, Width, Height.

Colors support Alpha Channels ARGB format

0x880000FF semi-transparent blue

A = 0x00 fully transparent A = 0xFF fully opaque

Rectangles, Points, etc. are classes r.Inflate( 5, 5 ); // Instead of InflateRect( r, 5,

5 );

Rectangles are defined differently! Left, Top, Width, Height.

Page 23: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

23

GDI+ Programming ModelGDI+ Programming Model

Obtaining a Graphics Object Passed to OnPaint methods in

PaintEventArgs Request one using

Graphics.FromHwnd( Handle ) If utilizing double-buffering, do not use

FromHwnd

Cleaning Up Dispose all GDI+ objects Dispose Graphics object if requested via

FromHwnd

Obtaining a Graphics Object Passed to OnPaint methods in

PaintEventArgs Request one using

Graphics.FromHwnd( Handle ) If utilizing double-buffering, do not use

FromHwnd

Cleaning Up Dispose all GDI+ objects Dispose Graphics object if requested via

FromHwnd

Page 24: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

24

AttributesAttributes

Attributes used to modify the behavior of properties, methods, events

Attributes used to modify the behavior of properties, methods, events

[ Category( 'Appearance' ), Description( 'The width of buttons, in pixels.' ), DefaultValue( 18 ) ]

property ButtonWidth: Integer read FButtonWidth write SetButtonWidth;

[ Category( 'Appearance' ), Description( 'The width of buttons, in pixels.' ), DefaultValue( 18 ) ]

property ButtonWidth: Integer read FButtonWidth write SetButtonWidth;

Page 25: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

25

AttributesAttributes

Category

Description

Browsable

DefaultValue

DefaultProperty & DefaultEvent

Localizable

ToolboxBitmap

Category

Description

Browsable

DefaultValue

DefaultProperty & DefaultEvent

Localizable

ToolboxBitmap

Page 26: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

26

ExampleExample

RayKonopka.Delphi.Controls Assembly RkSpinner Component

RayKonopka.Delphi.Controls Assembly RkSpinner Component

Page 27: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

27

ReferencesReferences

Microsoft Development Network (MSDN) Design Guidelines for Class Library Developers Developing Components Developing Windows Forms Controls

Applied .NET Framework Development Jeffrey Richter

Programming Microsoft .NET Jeff Prosise

Microsoft Development Network (MSDN) Design Guidelines for Class Library Developers Developing Components Developing Windows Forms Controls

Applied .NET Framework Development Jeffrey Richter

Programming Microsoft .NET Jeff Prosise

Page 28: Ray Konopka Creating Custom Microsoft.NET Framework Controls in Delphi

28

The Finish LineThe Finish Line

Contact Information

Evaluation Forms

Questions & Answers

Contact Information

Evaluation Forms

Questions & Answers

Ray [email protected]://www.raize.com

Ray [email protected]://www.raize.com