解决方案 »
- 关于TWebBrowser
- 再有一个SCPOMM的问题,为什么我的接收缓存器Buffer的数据,不会自动清除呢?
- 如何控制Hint显示的持续时间?
- 对源码有兴趣者请入
- fastreport如何作出象excel那样的表格来?在线等!解决马上揭贴!
- 关于rave打印问题?(打印页码范围)
- 大家帮一下忙吧
- 拨号语音控制
- 如何使用自己的图象资源文件?我想在TreeView显示的图片使用我的资源文件,怎么装载? 主要是TreeView.Node.ImageIndex使用ImageList的索引,救救我吧!!!!!!
- 急!如何使用Delphi调用执行DOS批处理文件!
- 提成!----钱
- SQL Explorer和 BDE Administrator 都是做什么用的?有什么区别?
我已经研究累一段时间了
虽然并没有写自己的什么组件
但我觉的DELPHI的代码还是比较有难度
有没有朋友写的发些来看
可以使用继承
给你一个{ TOvrEdit
--------
An improved TEdit component which reflect keyboard
insert/overwrite mode, Special desiged for Windows
Traditional Chinese Version. by Wolfgang Chien <[email protected]>
}
unit OEdit;interface{$ifdef Windows}
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;
{$endif}{$ifdef Win32}
uses
SysUtils, Windows, Messages, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;
{$endif}type
TInsertKeyStates = (iksInsert, iksOverWrite); TOvrEdit = class(TEdit)
private
FTabOnEnter: boolean;
FInsertKeyState: boolean;
procedure WMChar(var Msg: TWMKey); message WM_Char;
protected
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure KeyPress(var Key: Char); override;
function GetInsertKeyState: TInsertKeyStates;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property InsertKeyState: TInsertKeyStates read GetInsertKeyState;
published
property TabOnEnter: boolean
read FTabOnEnter write FTabOnEnter default True;
end;procedure Register;implementationprocedure Register;
begin
RegisterComponents('Samples', [TOvrEdit]);
end;constructor TOvrEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
TabOnEnter := True;
end;(* -------------------------------------------------- *)
destructor TOvrEdit.Destroy;
begin
inherited Destroy;
end;(* -------------------------------------------------- *)
procedure TOvrEdit.KeyDown(var Key: Word;
Shift: TShiftState);
begin
if TabOnEnter then
begin
case Key of
vk_Down: { Dn-Arrow Key }
begin
SendMessage(GetParentForm(Self).Handle, wm_NextDlgCtl, 0, 0);
Key := 0;
end;
vk_Up: { Up-Arrow Key }
begin
SendMessage(GetParentForm(Self).Handle, wm_NextDlgCtl, 1, 0);
Key := 0;
end;
end;
end;
if Key <> 0 then inherited KeyDown(Key, Shift);
end;(* -------------------------------------------------- *)
procedure TOvrEdit.KeyPress(var Key: Char);
begin
if TabOnEnter and (Key = #13) then { Enter Key }
begin
SendMessage(GetParentForm(Self).Handle, wm_NextDlgCtl, 0, 0);
Key := #0;
end;
if Key <> #0 then inherited KeyPress(Key);
end;(* -------------------------------------------------- *)
function TOvrEdit.GetInsertKeyState: TInsertKeyStates;
begin
if GetKeyState(VK_INSERT) = 0 then
Result := iksInsert
else
Result := iksOverWrite;
end;(* -------------------------------------------------- *)
procedure TOvrEdit.WMChar(var Msg: TWMKey);
begin
{ if Overwrite state and user select nothing }
if (InsertKeyState = iksOverWrite) and (SelLength = 0)
and (SelStart < GetTextLen) then
begin
{ ASCII Extend code > 127 ==> Chinese word Lead-byte, BIG-5 }
if Msg.CharCode > 127 then
SelLength := 2
else
begin
SelLength := 2;
{ if char on current Caret positon is a Chinese word }
if Ord(SelText[1]) > 127 then
SelLength := 2
else
SelLength := 1;
end;
end; inherited;
end;end.