Solved

change character Insert / Overwrite in richedit?

Posted on 1997-05-04
7
1,325 Views
Last Modified: 2013-11-22
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.
0
Comment
Question by:dufus050497
  • 3
  • 2
  • 2
7 Comments
 
LVL 4

Expert Comment

by:StevenB
ID: 1335901
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
 

Author Comment

by:dufus050497
ID: 1335902
Edited text of question
0
 

Author Comment

by:dufus050497
ID: 1335903
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
Find Ransomware Secrets With All-Source Analysis

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

 
LVL 4

Expert Comment

by:StevenB
ID: 1335904
 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
 
LVL 3

Accepted Solution

by:
sperling earned 200 total points
ID: 1335905
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
 

Author Comment

by:dufus050497
ID: 1335906
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
 
LVL 3

Expert Comment

by:sperling
ID: 1335907
> 1: Your SetInsertMode was infact a toggle, Ive fixed that.

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

Regards,

Erik.
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Suggested Solutions

Have you ever had your Delphi form/application just hanging while waiting for data to load? This is the article to read if you want to learn some things about adding threads for data loading in the background. First, I'll setup a general applica…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
Sending a Secure fax is easy with eFax Corporate (http://www.enterprise.efax.com). First, Just open a new email message.  In the To field, type your recipient's fax number @efaxsend.com. You can even send a secure international fax — just include t…
Polish reports in Access so they look terrific. Take yourself to another level. Equations, Back Color, Alternate Back Color. Write easy VBA Code. Tighten space to use less pages. Launch report from a menu, considering criteria only when it is filled…

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

26 Experts available now in Live!

Get 1:1 Help Now