我写一个计算器程序,但是TEDIT组件只能从左向右显示!?

yypeng 2001-02-17 02:05:00
正如我们平时所用的计算器一样,它的数字显示是从右向左的,如何才能让TEDIT组
件的显示是从右向左的呢?
我是一只小菜鸟,望大虾帮助 !
先谢啦
...全文
215 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yypeng 2001-02-20
  • 打赏
  • 举报
回复
lwm 兄,还有各位大侠,多谢你们的指点,现在我已经解决了此问题。
请你们原谅我把分全给了LWM,因为,我觉得他敲这多么源码,这30分还不足以报答。
但我还是要多多感谢大家帮助我,以后,我会多多送分的!谢谢!
Kingron 2001-02-18
  • 打赏
  • 举报
回复
哎,高人啊!
lwm8246 2001-02-18
  • 打赏
  • 举报
回复
从右向左显示的小控件 已test ok

unit Edit_Ex;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TEdit_Ex = class(TEdit)
private
FTextOnRight:Boolean;
function GetTextOnRight:Boolean;
procedure SetTextOnRight(Value:Boolean);
protected
procedure CreateParams(var Params: TCreateParams);override;
published
property TextOnRight:Boolean read FTextOnRight write FTextOnRight default False;// write SetSelText;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TEdit_Ex]);
end;

function TEdit_Ex.GetTextOnRight:Boolean;
begin
Result:=Self.FTextOnRight;
end;

procedure TEdit_Ex.SetTextOnRight(Value:Boolean);
begin
if Self.FTextOnRight<>Value then Self.FTextOnRight:=Value;
end;

procedure TEdit_Ex.CreateParams(var Params: TCreateParams);
begin
inherited;
if self.FTextOnRight then Params.Style:=Params.Style or ES_RIGHT;
end;

end.
highnice 2001-02-18
  • 打赏
  • 举报
回复
me too!
lwm8246 2001-02-18
  • 打赏
  • 举报
回复
(更正 精简代码)
从右向左显示的小控件 已test ok


unit Edit_Ex;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TEdit_Ex = class(TEdit)
private
FTextOnRight:Boolean;
protected
procedure CreateParams(var Params: TCreateParams);override;
published
property TextOnRight:Boolean read FTextOnRight write FTextOnRight default False;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TEdit_Ex]);
end;

procedure TEdit_Ex.CreateParams(var Params: TCreateParams);
begin
inherited;
if self.FTextOnRight then Params.Style:=Params.Style or ES_RIGHT;
end;

end.
tombyron 2001-02-18
  • 打赏
  • 举报
回复
我编写计算器程序时本来也先用的是 TEdit,来当显示屏,但是发现不能从右向左的显示,于是我改用的TLabel来做显示屏。所以,我觉得你们的讨论很有价值~
lwm8246 2001-02-18
  • 打赏
  • 举报
回复
从右向左显示的小控件功能比TEDIT简化了一些(主要是一些不重要的属性一般不影响使用)
已测试 ok
如果有问题请联系 lwm8246@fm365.com



unit CustomEdit_R;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TCustomEdit_R = class(TCustomEdit)
protected
procedure CreateParams(var Params: TCreateParams);override;
published
property Anchors;
property AutoSelect;
property AutoSize;
property BiDiMode;
property BorderStyle;
property CharCase;
property Color;
property Constraints;
property Ctl3D;
property DragCursor;
property DragKind;
property DragMode;
property Enabled;
property Font;
property HideSelection;
property ImeMode;
property ImeName;
property MaxLength;
property OEMConvert;
property ParentBiDiMode;
property ParentColor;
property ParentCtl3D;
property ParentFont;
property ParentShowHint;
property PasswordChar;
property PopupMenu;
property ReadOnly;
property ShowHint;
property TabOrder;
property TabStop;
property Text;
property Visible;
property OnChange;
property OnClick;
property OnContextPopup;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDock;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnStartDock;
property OnStartDrag;
end;


procedure Register;

implementation
const
BorderStyles: array[TBorderStyle] of DWORD = (0, WS_BORDER);

procedure TCustomEdit_R.CreateParams(var Params: TCreateParams);
const
Passwords: array[Boolean] of DWORD = (0, ES_PASSWORD);
ReadOnlys: array[Boolean] of DWORD = (0, ES_READONLY);
CharCases: array[TEditCharCase] of DWORD = (0, ES_UPPERCASE, ES_LOWERCASE);
HideSelections: array[Boolean] of DWORD = (ES_NOHIDESEL, 0);
OEMConverts: array[Boolean] of DWORD = (0, ES_OEMCONVERT);
begin
inherited CreateParams(Params);
CreateSubClass(Params, 'EDIT');
with Params do
begin
Style := Style or (ES_AUTOHSCROLL or ES_AUTOVSCROLL or ES_RIGHT );// or
{ BorderStyles[FBorderStyle] or Passwords[FPasswordChar <> #0] or
ReadOnlys[FReadOnly] or CharCases[FCharCase] or
HideSelections[FHideSelection] or OEMConverts[FOEMConvert];
if NewStyleControls and Ctl3D and (FBorderStyle = bsSingle) then
begin
}
Style := Style and not WS_BORDER;
ExStyle := ExStyle or WS_EX_CLIENTEDGE;
// end;
end;
end;

procedure Register;
begin
RegisterComponents('Samples', [TCustomEdit_R]);
end;

end.
nisky 2001-02-17
  • 打赏
  • 举报
回复
继承一个控件,在createparams中设为ES_RIGHT
Kingron 2001-02-17
  • 打赏
  • 举报
回复
看看下面的代码,对你也许有启发!
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
i:word;
old:tfont;
begin
old:=canvas.Font;
canvas.Font:=edit1.Font;
i:=sendmessage(edit1.handle,EM_GETMARGINS,0,0);
wordrec(i).lo:=wordrec(i).lo-canvas.TextWidth(key);
sendmessage(edit1.Handle,EM_SETMARGINS,EC_LEFTMARGIN,i);
canvas.Font:=old;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i:word;
begin
wordrec(i).lo:=60;
wordrec(i).hi:=0;
sendmessage(edit1.Handle,EM_SETMARGINS,EC_LEFTMARGIN,i);
end;
hyper2k 2001-02-17
  • 打赏
  • 举报
回复
用一个string存放字符,然后截取位数显示在label里,我原来用vb做的一个计算器就是怎么做的。至于显示效果则是把label放到panel里。
yukuang 2001-02-17
  • 打赏
  • 举报
回复
用RXLIB组件包的TCurrencyEdit。我这里有
AllError 2001-02-17
  • 打赏
  • 举报
回复
用字符表示,‘0’+‘1’=‘01’

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧