全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1764
推到 Plurk!
推到 Facebook!

续:有关EDIT的一问题

答題得分者是:wameng
like
一般會員


發表:30
回覆:35
積分:18
註冊:2005-03-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-07-05 08:39:25 IP:61.242.xxx.xxx 訂閱
<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函数也没用.
編輯記錄
like 重新編輯於 2007-07-05 08:41:30, 註解 無‧
like 重新編輯於 2007-07-05 08:43:00, 註解 無‧
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-07-06 10:23:06 IP:61.222.xxx.xxx 訂閱
<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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-07-06 13:26:18 IP:61.242.xxx.xxx 訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-07-09 17:49:30 IP:61.222.xxx.xxx 訂閱
毫無疑問的,問題出在 RecreateWnd。
基於在焦點轉移觸發之時,又做了RecreateWnd 可能是
Delphi 誤判或者因 DestoryHandle後又CreateHandle 所導致畫面沒有刷新。
我不想深入了解。每件事情都要強調來龍去脈,是很累又沒有太大意義的事。

總之,使用PostMessage 目的是讓轉移焦點的動作真正告一段落後,再處理對齊。
like
一般會員


發表:30
回覆:35
積分:18
註冊:2005-03-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-07-09 20:22:11 IP:59.55.xxx.xxx 訂閱
to wameng大大,呵,首先十分感谢您的回复!看了您的回贴和其他论坛上一些网友的回贴后,你们的方法都能将光标显示出来
我就越是感到奇怪,为何会这样?呵。。没办法,只好厚着脸皮,打破沙锅问到底了。
这几天我反复看了几遍您和其他网友的回贴后,感觉似乎明白了一点点。
当ReCreatewnd将控件destroy了,而这时是在onEnter事件中执行对Alignment属性赋值时调用了recreatewnd,
由于控件已被destroy,并且重建了,而事件OnEnter还处在重建前的控件的事件,所以就出现了控件没有光标的现象。
呵,不知这样是否理解正确。先暂且这样!
再次谢谢您的热心指点!

===================引 用 wameng 文 章===================
毫無疑問的,問題出在 RecreateWnd。
基於在焦點轉移觸發之時,又做了RecreateWnd 可能是
Delphi 誤判或者因 DestoryHandle後又CreateHandle 所導致畫面沒有刷新。
我不想深入了解。每件事情都要強調來龍去脈,是很累又沒有太大意義的事。

總之,使用PostMessage 目的是讓轉移焦點的動作真正告一段落後,再處理對齊。
系統時間:2024-05-03 3:09:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!