续:有关EDIT的一问题 |
答題得分者是:wameng
|
like
一般會員 發表:30 回覆:35 積分:18 註冊:2005-03-10 發送簡訊給我 |
<textarea cols="60" rows="10" class="delphi" name="code"> unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, StyleEdit; type
TMyEdit=class(TEdit)
private
FAlignment:TAlignment;
procedure WriteAlignment(Value : TAlignment);
protected
procedure CreateParams(var Params: TCreateParams); Override;
publish
property Alignment:TAlignment read FAlignment write WriteAlignment;
end;
TForm1 = class(TForm)
procedure EditEnter(Sender: TObject);
procedure EditExit(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
myedit:TMyEdit;
Form1:Tform1;
implementation procedure TMyEdit.CreateParams(var Params: TCreateParams);
const
Alignments: array[TAlignment] of WORD = (ES_LEFT, ES_RIGHT, ES_CENTER);
begin
inherited CreateParams(Params);
Params.Style := Params.Style or Alignments[FAlignment];
end; procedure TStyleEdit.WriteAlignment(Value : TAlignment);
begin
if Value <> FAlignment then
begin
FAlignment := Value;
RecreateWnd;
end;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
myEdit:=TMyEdit.create(self);
myEdit.parent:=self;
myEdit.width:=100;
myedit.top:=100;
myedit.left:=100;
myedit.onenter:=editenter;
myedit.onexit:=editexit;
myedit.visible:=True;
end; procedure TForm1.EditEnter(Sender: TObject);
begin
MyEdit.Alignment:=taLeftJustify;
end; procedure TForm1.EditExit(Sender: TObject);
begin
MyEdit.Alignment:=taRightJustify;
end; </textarea>
以上代码运行后,虽然可以实现当焦点在myedit对象上时里面的内容左对齐,离开时右对齐,但myedit这个控件对象为何没有光标在里面?我试着用过showcaret函数也没用. |
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
<textarea cols="60" rows="10" class="delphi" name="code">
Const
CM_ChangeAlign = WM_USER 2007; type
TEdit=class(StdCtrls.TEdit)
private
FAlignment:TAlignment;
procedure WriteAlignment(Value : TAlignment);
procedure CMChangeAlign(Var MSg:Tmessage);Message CM_CHANGEALIGN;
protected
procedure CreateParams(var Params: TCreateParams); Override; procedure DoEnter; override;
procedure DoExit; override;
published
property Alignment:TAlignment read FAlignment write WriteAlignment;
end; type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.DFM} procedure TEdit.CreateParams(var Params: TCreateParams);
const
Alignments: array[TAlignment] of WORD = (ES_LEFT, ES_RIGHT, ES_CENTER);
begin
inherited CreateParams(Params);
Params.Style := Params.Style or Alignments[FAlignment];
end; procedure TEdit.WriteAlignment(Value : TAlignment);
begin
if Value <> FAlignment then
begin
FAlignment := Value;
RecreateWnd;
end;
end; procedure TEdit.DoEnter;
begin
inherited;
PostMessage(Handle,CM_CHANGEALIGN,ORD(taLeftJustify),0);
end; procedure TEdit.DoExit;
begin
inherited;
PostMessage(Handle,CM_CHANGEALIGN,ORD(taRightJustify),0);
end; procedure TEdit.CMChangeAlign(Var MSg:Tmessage);
begin
Alignment := TAlignment(Msg.wParam);
end; </textarea>
|
like
一般會員 發表:30 回覆:35 積分:18 註冊:2005-03-10 發送簡訊給我 |
to wameng大大,您好!我运行了一下您给我的代码,的确可以。但是奇怪的是,我试着不用postmessage,而还是直接采用赋值的方式,
结果就不一样了,采用赋值的方式,光标就不会出来了。代码如下: <textarea cols="60" rows="10" class="delphi" name="code"> unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMyEdit=class(TEdit) private FAlignment:TAlignment; procedure WriteAlignment(Value : TAlignment); protected procedure CreateParams(var Params: TCreateParams); Override; procedure doEnter;override; procedure doExit;override; published property Alignment:TAlignment read FAlignment write WriteAlignment; end; TForm1 = class(TForm) Edit1: TEdit; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; myedit:TMyEdit; implementation {$R *.dfm} { TMyEdit } procedure TMyEdit.CreateParams(var Params: TCreateParams); const Alignments: array[TAlignment] of WORD = (ES_LEFT, ES_RIGHT, ES_CENTER); begin inherited CreateParams(Params); Params.Style := Params.Style or Alignments[FAlignment]; end; procedure TMyEdit.doEnter; begin inherited; Alignment:=taLeftJustify; end; procedure TMyEdit.doExit; begin inherited; Alignment:=taRightJustify; end; procedure TMyEdit.WriteAlignment(Value: TAlignment); begin if Value <> FAlignment then begin FAlignment := Value; RecreateWnd; end; end; procedure TForm1.FormCreate(Sender: TObject); begin myEdit:=TMyEdit.create(self); myEdit.parent:=self; myEdit.width:=100; myedit.top:=100; myedit.left:=100; end; end. </textarea> 很是奇怪,为何这样光标就不能显示出来呢?您给的消息也是自定义的消息,为何就可以显示出光标? 还请大大指点,谢谢! |
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
like
一般會員 發表:30 回覆:35 積分:18 註冊:2005-03-10 發送簡訊給我 |
to wameng大大,呵,首先十分感谢您的回复!看了您的回贴和其他论坛上一些网友的回贴后,你们的方法都能将光标显示出来
我就越是感到奇怪,为何会这样?呵。。没办法,只好厚着脸皮,打破沙锅问到底了。 这几天我反复看了几遍您和其他网友的回贴后,感觉似乎明白了一点点。 当ReCreatewnd将控件destroy了,而这时是在onEnter事件中执行对Alignment属性赋值时调用了recreatewnd, 由于控件已被destroy,并且重建了,而事件OnEnter还处在重建前的控件的事件,所以就出现了控件没有光标的现象。 呵,不知这样是否理解正确。先暂且这样! 再次谢谢您的热心指点! ===================引 用 wameng 文 章=================== 毫無疑問的,問題出在 RecreateWnd。 基於在焦點轉移觸發之時,又做了RecreateWnd 可能是 Delphi 誤判或者因 DestoryHandle後又CreateHandle 所導致畫面沒有刷新。 我不想深入了解。每件事情都要強調來龍去脈,是很累又沒有太大意義的事。 總之,使用PostMessage 目的是讓轉移焦點的動作真正告一段落後,再處理對齊。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |