سؤال

أنا أستخدم Delphi7 وأود أن أجري بعض الأيام TDateTimePicker مراقبة.

لقد قرأت ذلك ، في الأصل ، إنه سليل من TMonthCalendar, ، وبالتالي يجب أن يكون ممكنا.

لقد وجدت أيضًا بعض رمز المثال ، لكنه في C#:http://social.msdn.microsoft.com/forums/en/winforms/thread/03527023-694d-41ab-bffb-18c59fca1fda

يرجى ملاحظة أنني لا أريد استخدام أي طرف ثالث DateTimePicker الضوابط ، أود أن أبقى مع المعيار.

هل كانت مفيدة؟

المحلول

أنت على حد سواء على صواب وخاطئ :-)

نرى:http://www.experts-exchange.com/programming/system/windows__programming/mfc/q_23927552.html

أنت محق في أنه لا يمكنك ضبط أيام Bolddays تحت XP. لكنك مخطئ لأنه تحت Vista/Win7 يمكنك!

هنا هو الكود المعدل:

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;

ملاحظة: تأكد من إضافة بيان Vista إلى الملف لأنه وإلا فلن يعمل!

الثوابت من ملف commCtrl.h محدث ، موجود هنا:http://www.koders.com/cpp/fid6a6537d52b537d0920d7a760d2073f7b65ade310.aspx؟s=wm_cap_driver_connect

شكرا للمساعدة ، أنت تقودني إلى الحل! :-)

نصائح أخرى

لا يمكنك فعل ما تريد ، لأن MonthCalendar يتم عرضه استجابةً لزر القائمة المنسدلة ، اضغط في DateTimePicker هو monthcalendar الذي لا يحتوي على مجموعة نمط MCS_DayState. هذا هو قرار Microsoft. إنه ليس قيودًا على VCL ، لذلك لا يوجد شيء ، على حد علمي ، يمكنك القيام به لتغييره. الشيء الوحيد هو عدم استخدامه وتثبيت شهر حقيقي خاص بك استجابةً لضغط المستخدم على زر القائمة المنسدلة ؛ أو استخدم بعض المكونات المخصصة المتاحة بالفعل.

لإثبات ذلك ، إليك نسخة Pascal من نفس رمز C# الذي نشرته. إنه لا يعمل على حد علمي أنه لن ينجح أبدًا. إذا كنت ترغب في اختباره ، قم بربطه في حدث القائمة المنسدلة لـ DateTimePicker.

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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top