線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2384
推到 Plurk!
推到 Facebook!

如何在程序中让datetimepicker弹开来,而不用去点击弹开?

答題得分者是:JustinShen
greally
一般會員


發表:5
回覆:6
積分:2
註冊:2005-04-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-25 21:19:28 IP:61.241.xxx.xxx 未訂閱
如何在程序中让datetimepicker弹开来,而不用去点击弹开?
JustinShen
中階會員


發表:22
回覆:104
積分:80
註冊:2003-09-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-26 12:34:47 IP:61.155.xxx.xxx 未訂閱
方法1:重新封装TDatetimePicker,将Dropdown改为读写属性;别忘了在SetDropdown中调用FOnDropDown 方法2:获取FDateMode的指针, 1得到FDropdown的指针 方法3:发送内部消息DTN_DROPDOWN到Datetimepicker控件 我想这些方法都可行,方法1比较不容易出错.您试试吧 Justin Shen
------
====================
我为一切作努力!
Justin Shen

justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-05 21:40:14 IP:221.169.xxx.xxx 未訂閱
可以麻煩說明一下方法2跟3怎麼做嗎?
JustinShen
中階會員


發表:22
回覆:104
積分:80
註冊:2003-09-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-11 19:02:12 IP:61.155.xxx.xxx 未訂閱
引言: 可以麻煩說明一下方法2跟3怎麼做嗎?
抱歉,没有及时收Mail,没看到你的回复; 方法2的原理是利用指针运算,绕过对象访问的权限限制。例如:
TAClass = Class
private
  FIndex: Integer;
  FName: String;
public
  procedure SomeProc;
published
  property Index: integer read FIndex;
  property Name: String read FName;
end;
在这个类里面Name,Index两个属性都是只读的,如果要写入值使用正常的对象访问方法是不行的 var AObj: TAClass; begin AObj.Name:=1; end; 这样的代码会编译出错,因为Index属性是只读的。 而使用下面的代码就可以 Var AObj: TAclass; p: Pointer; begin p:=@(AObj.SomeProc); p:=p-1; String(p^):='Test'; end; 当然这种方法使用的前提是有一个可以确定地址的方法或者属性,所以不是任何类都可以这样做,而且由于绕过了对象的访问规则所以虽然可以写却不一定能够触发事件。所以除非可以手动触发所需事件一般不这么做。 方法3,是在分析过TDatatimePicker之后找到的办法,DTN_DROPDOWN消息是自定义的,您可以在Delphi提供的源代码中找到,发送消息的办法就是使用windows的SendMessage或者PostMessage这两个API函数,具体的用法您查查参考书记吧。 Justin Shen
------
====================
我为一切作努力!
Justin Shen

justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-11 20:51:00 IP:221.169.xxx.xxx 未訂閱
你好    第二種方法違反了封裝性,我想就算了~   忘了說我之前有追過 class="code"> procedure TDateTimePicker.CNNotify(var Message: TWMNotify); var DT: TDateTime; AllowChange: Boolean; begin with Message, NMHdr^ do begin Result := 0; case code of DTN_DROPDOWN: begin DateTimeToSystemTime(Date, FLastChange); FDroppedDown := True; if Assigned(FOnDropDown) then FOnDropDown(Self); end; ... 看起來像是CNNotify收到一個type為TWMNotify的Message 而TWMNotify內部有個成員NMHdr會著明這次的命令為何 因此直接送DTN_DROPDOWN應該是不行的(我測試也是不行) 又該函式的定義如下: procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY; 因此推斷應該是送出CN_NOTIFY才能喚醒該函式 問題是Send CN_NOTIFY怎麼同時送出DTN_DROPDOWN (或者說TWMNotify這個struct怎麼送出)
JustinShen
中階會員


發表:22
回覆:104
積分:80
註冊:2003-09-20

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-12 14:59:00 IP:61.155.xxx.xxx 未訂閱
引言: 看起來像是CNNotify收到一個type為TWMNotify的Message 而TWMNotify內部有個成員NMHdr會著明這次的命令為何 因此直接送DTN_DROPDOWN應該是不行的(我測試也是不行) 又該函式的定義如下: procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY; 因此推斷應該是送出CN_NOTIFY才能喚醒該函式 問題是Send CN_NOTIFY怎麼同時送出DTN_DROPDOWN (或者說TWMNotify這個struct怎麼送出)
送出CN_NOTIFY的同时送出DTN_DROPDOWN的方法我知道一点点,不过好像确实有问题,我做了测试。 使用SendMessage没有反映,也许是需要确定WM_NOTIFY是ANSI还是UNICODE形式; 使用PostMessage有反应,但是所传出的pnmhdr^.code发生了改变,我也没有找到原因 最后用 href="http://delphi.ktop.com.tw/topic.php?TOPIC_ID=74802">http://delphi.ktop.com.tw/topic.php?TOPIC_ID=74802 请您看看,给点意见 Justin Shen ======================= 如果能帮到您,我会很开心 =======================
------
====================
我为一切作努力!
Justin Shen

justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-13 07:26:28 IP:221.169.xxx.xxx 未訂閱
點選上述link會說我「無權進入」!? 然後用SendInput似乎也有問題 我以Timer來測試發送滑鼠事件給Form void __fastcall TForm1::Timer1Timer(TObject *Sender) { INPUT t[2]; MOUSEINPUT m; m.dx = 50; m.dy = 50; m.mouseData = 0; m.dwFlags = MOUSEEVENTF_LEFTDOWN; m.time = 0; m.dwExtraInfo = 0; t[0].type = INPUT_MOUSE; t[0].mi = m; MOUSEINPUT m2; m2.dx = 50; m2.dy = 50; m2.mouseData = 0; m2.dwFlags = MOUSEEVENTF_LEFTUP; m2.time = 0; m2.dwExtraInfo = 0; t[1].type = INPUT_MOUSE; t[1].mi = m2; SendInput(2, t, sizeof(t)); } 然而Form的Click事件都沒有被喚醒,這裡用法有錯嗎? 發表人 - justdo 於 2005/07/13 07:32:08
JustinShen
中階會員


發表:22
回覆:104
積分:80
註冊:2003-09-20

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-13 16:53:53 IP:222.93.xxx.xxx 未訂閱
引言: 點選上述link會說我「無權進入」!? 然後用SendInput似乎也有問題 我以Timer來測試發送滑鼠事件給Form void __fastcall TForm1::Timer1Timer(TObject *Sender) { INPUT t[2]; MOUSEINPUT m; m.dx = 50; m.dy = 50; m.mouseData = 0; m.dwFlags = MOUSEEVENTF_LEFTDOWN; m.time = 0; m.dwExtraInfo = 0; t[0].type = INPUT_MOUSE; t[0].mi = m; MOUSEINPUT m2; m2.dx = 50; m2.dy = 50; m2.mouseData = 0; m2.dwFlags = MOUSEEVENTF_LEFTUP; m2.time = 0; m2.dwExtraInfo = 0; t[1].type = INPUT_MOUSE; t[1].mi = m2; SendInput(2, t, sizeof(t)); } 然而Form的Click事件都沒有被喚醒,這裡用法有錯嗎? 發表人 - justdo 於 2005/07/13 07:32:08
我另开了一个模拟输入的主题,请到: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=74893 Justin Shen ================================= 如果能帮到您,我会很开心;如果能得到您的帮助,是我的荣幸 =================================
------
====================
我为一切作努力!
Justin Shen

mike0518
一般會員


發表:1
回覆:12
積分:7
註冊:2002-07-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-07-20 17:30:33 IP:60.28.xxx.xxx 訂閱
try below code ..... 
DateTimePicker1.Perform(WM_SYSKEYDOWN, VK_DOWN, 0);
系統時間:2024-04-30 0:29:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!