change character Insert / Overwrite in richedit?

Unlike memo's, richedit components handle switching between Insert and Overwrite modes. I would like to know how to progamaticaly detect which mode it is in and also set the mode.

I took a pot shot and tried using
SendMessage( form.Handle, WM_CHAR, VK_INSERT, 24 );
to toggle Insert/Overwrite but no joy.

Thanks in advance
--------------
Jeremy Thomas
mailto:Jeremy.Thomas@netau1.alcatel.com.au

To clarify my situation, I have a made a tabbed multipage editor similar to the one found in the Delphi IDE, along the bottom is a panel which show various things like cursor position, caplocks state etc.. I recently added an Insert / Overwrite status using getkeystate(VK_INSERT) = 1 and SetKeyboardState to set the virtual keys. This works fine except the state it shows bears no relation to the state inside a particular richedit. Furthermore if I press insert while a particular richedit has focus the Insert/Overwrite state for that richedit changes but none of the other ones do. You can imagine how this might piss the users off. In Delphi editor I notice all the windows stay in sync.

My guess is that the richedits each have there own variable which dictates their Insert / Overwrite state and that Borland decided not to wrap this variable in the Trichedit component.
dufus050497Asked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

StevenBCommented:
Use GetKeyState to read the virtual keys, i.e. for Insert button:

  if getkeystate(VK_INSERT) = 1 then ...

Use SetKeyboardState to set the virtual keys.

0
dufus050497Author Commented:
Edited text of question
0
dufus050497Author Commented:
You have been succesful at getting a Richedit to change its Insert / Overwrite state? I had already tried that and it didnt work.

To clarify my situation, I have a made a tabbed multipage editor similar to the one found in the Delphi IDE, along the bottom is a panel which show various things like cursor position, caplocks state etc.. I recently added an Insert / Overwrite status using getkeystate(VK_INSERT) = 1 and SetKeyboardState to set the virtual keys. This works fine except the state it shows bears no relation to the state inside a particular richedit. Furthermore if I press insert while a particular richedit has focus the Insert/Overwrite state for that richedit changes but none of the other ones do. You can imagine how this might piss the users off. In Delphi editor I notice all the windows stay in sync.

My guess is that the richedits each have there own variable which dictates their Insert / Overwrite state and that Borland decided not to wrap this variable in the Trichedit component.
0
Cloud Class® Course: Certified Penetration Testing

This CPTE Certified Penetration Testing Engineer course covers everything you need to know about becoming a Certified Penetration Testing Engineer. Career Path: Professional roles include Ethical Hackers, Security Consultants, System Administrators, and Chief Security Officers.

StevenBCommented:
 Sorry my answer was not what you were looking for. I misunderstood your question, thinking you were having difficulty detecting key presses. I've played with the Rich Edit and run into the same problems that you have. The TRichEdit component is in my opinion not very good. There are many problems with it and this is another on to add to the list. My recomendation is that you search out a better rich edit component on the web, or write your own. I wish you success.
 
  Steven.
0
sperlingCommented:
type
  TInsRichEdit = class (TRichEdit)
  protected
    FInsertMode : BOOLEAN;
    procedure WMKeyDown (var message : TMessage); message WM_KEYDOWN;
    procedure SetInsertMode (value : BOOLEAN);
  public
    constructor Create (AOwner : TComponent); override;
    property  InsertMode : BOOLEAN read FInsertMode write SetInsertMode;
  end;

implementation

procedure TInsRichEdit.WMKeyDown (var message : TMessage);
begin
  if (message.wParam = VK_INSERT)
    then FInsertMode := not FInsertMode;
  inherited;
end;

procedure TInsRichEdit.SetInsertMode (value : BOOLEAN);
begin
  SendMessage(Handle, WM_KEYDOWN, VK_INSERT, 0);
  SendMessage(Handle, WM_KEYUP, VK_INSERT, 0);
end;

constructor TInsRichEdit.Create (AOwner : TComponent);
begin
  inherited Create(AOwner);
  FInsertMode := TRUE;
end;

Try using this class instead of TRichEdit.

TRichEdit is just an wrapper around the RichEdit windows class. Therefore, there's not even an internal variable in TRichEdit which knows what state it is in. The TInsRichEdit class will fix this, assuming RichEdits always are in Insert mode when created. (I'm not sure, but I do believe so).

Apart from that, I'll agree with Steven, the TRichEdit is not a very good implementation of richedits. Good enough for simple text formatting, but for your purpose I'll suggest you buy a better one. I know there exist a few shareware/commercial full-blown richedit's for Delphi, but I don't remember which and where...


Regards,

Erik.

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
dufus050497Author Commented:
Thanks Erik, that did the trick.

I needed to make a few mods for my purposes
1: Your SetInsertMode was infact a toggle, Ive fixed that.
2 :Ive set the KeyBoardState to reflect the state of the RichEdit
3: My form needs to know when ins is pressed to keep all the editior windows in synch so Ive added a kludge or two to do that.


public
     InsertNotifier:HWND;

const
  GeneratedVK_INSERT=32;

procedure TSRichEdit.WMKeyDown (var message : TMessage);
 var
   KeyBoardState: TKeyBoardState;
begin
  if (message.wParam = VK_INSERT) then begin
    FInsertMode := not FInsertMode;
    GetKeyboardState(KeyBoardState);
    if FInsertMode then
      KeyBoardState[VK_INSERT] := 1
    else
      KeyBoardState[VK_INSERT] := 0;
    SetKeyboardState(KeyBoardState);
    if (InsertNotifier<>0) and (message.lParam <> GeneratedVK_INSERT) then
     SendMessage(InsertNotifier, WM_KEYUP, VK_INSERT, 0);
  end;
  inherited;
end;

procedure TSRichEdit.SetInsertMode (value : BOOLEAN);
begin
  if FInsertMode <> value then begin
    SendMessage(Handle, WM_KEYDOWN, VK_INSERT, GeneratedVK_INSERT);
    SendMessage(Handle, WM_KEYUP, VK_INSERT, GeneratedVK_INSERT);
  end;
end;
0
sperlingCommented:
> 1: Your SetInsertMode was infact a toggle, Ive fixed that.

Ooops. That's what I get for not testing my code....

Regards,

Erik.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Delphi

From novice to tech pro — start learning today.