如何在程序中让datetimepicker弹开来,而不用去点击弹开? |
答題得分者是:JustinShen
|
greally
一般會員 發表:5 回覆:6 積分:2 註冊:2005-04-10 發送簡訊給我 |
|
JustinShen
中階會員 發表:22 回覆:104 積分:80 註冊:2003-09-20 發送簡訊給我 |
|
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
|
JustinShen
中階會員 發表:22 回覆:104 積分:80 註冊:2003-09-20 發送簡訊給我 |
引言: 可以麻煩說明一下方法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 發送簡訊給我 |
你好 第二種方法違反了封裝性,我想就算了~ 忘了說我之前有追過 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 發送簡訊給我 |
引言: 看起來像是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 發送簡訊給我 |
點選上述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 發送簡訊給我 |
引言: 點選上述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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |