dufus050497
asked on
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@netau 1.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.
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@netau
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.
ASKER
Edited text of question
ASKER
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.
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.
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.
Steven.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
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(KeyBoardS tate);
if FInsertMode then
KeyBoardState[VK_INSERT] := 1
else
KeyBoardState[VK_INSERT] := 0;
SetKeyboardState(KeyBoardS tate);
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;
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(KeyBoardS
if FInsertMode then
KeyBoardState[VK_INSERT] := 1
else
KeyBoardState[VK_INSERT] := 0;
SetKeyboardState(KeyBoardS
if (InsertNotifier<>0) and (message.lParam <> GeneratedVK_INSERT) then
SendMessage(InsertNotifier
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;
> 1: Your SetInsertMode was infact a toggle, Ive fixed that.
Ooops. That's what I get for not testing my code....
Regards,
Erik.
Ooops. That's what I get for not testing my code....
Regards,
Erik.
if getkeystate(VK_INSERT) = 1 then ...
Use SetKeyboardState to set the virtual keys.