Unit MarketPriceInputs; Interface Uses StdCtrls, Graphics, Messages, Classes; { This is just like a TEdit, with one exception. When the field is empty, we display "MRKT". } Type TMktPrice = Class(TEdit) Private FCanvas : TCanvas; Property Canvas : TCanvas Read FCanvas; Procedure WMPaint(var Message: TWMPaint); message WM_PAINT; Procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS; Protected procedure Change; Override; Procedure AfterPaint; Public Constructor Create(AOwner: TComponent); Override; Destructor Destroy; Override; { This is a little bit silly. You put an edit control on the form in the designer, then you call Usurp at run time to replace te edit control with one of these. Really this class should be added to the form designer. } Class Procedure Usurp(Var E : TEdit); End; Implementation Uses Controls; Class Procedure TMktPrice.Usurp(Var E : TEdit); Var Old : TEdit; New : TEdit; Begin Old := E; New := TMktPrice.Create(Old.Owner); New.Top := Old.Top; New.Left := Old.Left; New.Width := Old.Width; New.TabOrder := Old.TabOrder; New.OnChange := Old.OnChange; New.Parent := Old.Parent; Old.Free; E := New End; Procedure TMktPrice.AfterPaint; Const Msg = 'MRKT'; Var MsgHeight, MsgWidth, MsgTop, MsgLeft : Integer; Begin If Text = '' Then Begin Canvas.Font := Font; Canvas.Font.Color := clBlue; Canvas.Font.Style := Canvas.Font.Style + [fsBold]; // The position algorithm is far from robust. MsgHeight := Canvas.TextHeight(Msg); MsgWidth := Canvas.TextWidth(Msg); MsgTop := (ClientHeight - MsgHeight) Div 2; MsgLeft := (ClientWidth - MsgWidth) Div 2; Canvas.TextOut(MsgLeft, MsgTop, Msg) End End; Procedure TMktPrice.WMPaint(var Message: TWMPaint); Begin Inherited; AfterPaint End; Procedure TMktPrice.WMSetFocus(var Message: TWMSetFocus); Begin Inherited; AfterPaint End; Constructor TMktPrice.Create(AOwner: TComponent); Begin Inherited; FCanvas := TControlCanvas.Create; TControlCanvas(FCanvas).Control := Self End; Destructor TMktPrice.Destroy; Begin FCanvas.Free; Inherited End; Procedure TMktPrice.Change; Begin Inherited; AfterPaint End; End.