2010-11-19 11 views
1

Delphi7 kullanıyorum ve TDateTimePicker kontrolünün bazı günlerini cesurca çıkarmak istiyorum.BoldDays?

Bunu okudum, aslında, TMonthCalendar soyundan geliyor, bu yüzden mümkün olmalıdır.

Ayrıca bazı örnek kod buldum ama C# var: http://social.msdn.microsoft.com/Forums/en/winforms/thread/03527023-694d-41ab-bffb-18c59fca1fda

Ben standart biriyle kalmak istiyorum, herhangi bir üçüncü tarafa DateTimePicker denetimleri kullanmak istemiyorsanız lütfen unutmayın .

cevap

3

Sen doğru ve yanlış :-) hem

Bkz: http://www.experts-exchange.com/Programming/System/Windows__Programming/MFC/Q_23927552.html

Sen XP altında BoldDays set edemez doğru. Ama yanılıyorsunuz çünkü Vista/Win7 altında yapabilirsiniz!

İşte değiştirilmiş kodudur:

procedure TForm1.DateTimePicker1DropDown(Sender: TObject); 
const 
    DTM_GETMCSTYLE = (DTM_FIRST + 12); 
    DTM_SETMCSTYLE = (DTM_FIRST + 11); 
    MCS_NOTRAILINGDATES = $0040; 
    MCS_SHORTDAYSOFWEEK = $0080; 
    MCS_NOSELCHANGEONNAV = $0100; 
var 
    monthCalHandle: THandle; 
    boldDates: array[0..2] of integer; 
    style, prevstyle: LResult; 
begin 
    style := SendMessage(DateTimePicker1.Handle, DTM_GETMCSTYLE, 0, 0); 
    style := style or MCS_DAYSTATE; //or MCS_NOSELCHANGEONNAV or MCS_WEEKNUMBERS; 
    prevstyle := SendMessage(DateTimePicker1.Handle, DTM_SETMCSTYLE, 0, style); 

    monthCalHandle := SendMessage(dateTimePicker1.Handle, DTM_GETMONTHCAL, 0, 0); 

    boldDates[0]:=$5a5a5a; 
    boldDates[1]:=$5a5a5a; 
    boldDates[2]:=$5a5a5a; 
    SendMessage(monthCalHandle, MCM_SETDAYSTATE, 3, integer(@boldDates)); 
end; 

Not: aksi takdirde çalışmaz çünkü dosyaya tezahür bir vista eklemeyi unutmayın!

sabitleri güncelleştirilmiş commctrl.h dosyasından vardır, burada bulunan: Yardım için http://www.koders.com/cpp/fid6A6537D52B537D0920D7A760D2073F7B65ADE310.aspx?s=WM_CAP_DRIVER_CONNECT

sayesinde, beni çözüme ulaşılması! :-)

+0

+1, thx. –

2

İstediğiniz şeyi yapamazsınız, çünkü DateTimePicker'da dropDown düğmesine basıldığında çıkan MonthCalendar, MCS_DAYSTATE stil kümesine sahip olmayan bir MonthCalendar'dur. Bu bir Microsoft karardır. Bu bir VCL sınırlaması değildir, bu yüzden hiçbir şeyim yoktur, benim bilgime göre bunu değiştirmek için yapabilirsiniz. Tek şey, onu kullanmamak ve açılan düğmenin kullanıcı tuşuna yanıt olarak gerçek bir MonthCalendar'unuzu kendi başınıza oluşturmak değildir; veya mevcut olan özel bileşenlerden bazılarını kullanın.

Bunu kanıtlamak için, burada yüklediğiniz aynı C# kodunun Pascal sürümüdür. İşe yaramıyor ve asla bilmeyeceğim. Test etmek isterseniz, DateTimePicker'ın DropDown olayına bağlayın.

procedure TForm1.DateTimePicker1DropDown(Sender: TObject); 
var 
    monthCalHandle: THandle; 
    boldDates: array[0..2] of integer; 

begin 
    { obtain the MonthCalendar handle using the DTM_GETMONTHCAL message 
    note that the handle returned changes for every time the 
    drop down calendar is displayed. } 
    monthCalHandle := SendMessage(dateTimePicker1.Handle, DTM_GETMONTHCAL, 0, 0); 

    { Send the MCM_SETDAYSTATE message. This message takes an array of 
    3 MONTHDAYSTATEs. Every MONTHDAYSTATE is a bit set that represents a month. 
    Each bit (0 through 30) represents the state of a day. Whan a bit is on, 
    its corresponding day is emphasized in the MonthCalendar } 
    boldDates[0]:=$5a5a5a; 
    boldDates[1]:=$5a5a5a; 
    boldDates[2]:=$5a5a5a; 
    SendMessage(monthCalHandle, MCM_SETDAYSTATE, 3, integer(@boldDates)); 
end; 
+0

+1 onunla bir süre oynadıktan sonra, doğru olduğuna inanıyorum. Güncelleme için –