If you need to implement global character overwriting among all the
application forms and switching between Insert/Overwrite mode when typing
in edit controls then you can try my OvrChars unit. It handles all sorts
of typing-aware controls that are descendants from TCustomComboBox,
TCustomGrid or TCustomEdit.

Hopefully it's bug free but who knows. :)
OvrChars is freeware so that use it on you own risk.
I will appreciate any suggestions and improvements to the code.

The unit contains two functions:

* function IsInsMode: boolean;
* function ProcessKbdMessages(var Msg: TMsg): boolean;

First of them, IsInsMode is used to check insert/overwrite state
of keyboard. You can inform the user about current state on
status bar or wherever you want.  
Function ProcessKbdMessages let you implement global character overwriting
and switching between Insert/Overwrite state with <Ins> key by including the
call to it into Application.OnMessage event as follows:

{ <<< Sample >>> }

unit Unit1;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
    Forms, Dialogs, OvrChars;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure AppMessage(var Msg: TMsg; var Handled: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := AppMessage;
end;

procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
  Handled := ProcessKbdMessages(Msg);
  if Handled then
    if IsInsMode then
      Label1.Caption := 'Ins'
    else
      Label1.Caption := 'Ovr';
end;

end.

{ <<< End of sample >>> }

Enjoy!

------------------------------------------------------------------------------
Vitaly Monastirsky
vitaly@vdl.t.u-tokyo.ac.jp
