DateTimePicker - barwienie pól przy pomocy funkcji

0

mam pewne zadanie i nie wiem jak się do niego zabrać, a mianowicie:
w trakcie produkcji odbywają się pewne procesy. Procesy te wykonywane są o stałych dniach (czyli np. pierwszy proces po 7 dniach, drugi po kolejnych 4 dniach itd).
W jaki sposób mogę nanieść zmiany (np. innym zabarwieniem poszczególnych dni) na komponent DateTimePicker, żeby można było wybrać z tego komponentu taki dzień zakończenia produkcji, żeby procesy te nie pokrywały się ze świętami????
Innymi słowy, chce z tego komponentu wybrać na przykład dzień zakończenia produkcji, a zmiany w DateTimePicker mają mi pokazać który dzień rozpoczęcia mogę wybrać, a którego nie mogę (lub w drugą stronę... który dzień zakończenia produkcji mogę wybrać a którego nie, żeby w czasie produkcji daty poszczególnych procesów nie pokrywały się ze świętami, czyli z dniami wolnymi) . Pomoże ktoś?

Mógłby mi ktoś ewentualnie pomoc z samą obsługą DateTimePicker... w jaki sposób koloruje się wybrane dni tego komponentu... np. Niedziele

0

Ja napisałem własną obsługę kalendarza, użyłem do tego StringGrida w wierszach mam poukładane Miesiąc a w kolumnach dni tygodnia. Cały miesiąc mieści się w jednym wierszu. Kolorowanie zapisane jest w łańcuchu o długości ilości dni 365 lub 366 i każdy znak ma odpowiednią interpretację i koloruję StringGrida w zależności od tego kodu. Z takim kalendarzem możesz robić co tylko zapragniesz.

0
JacobTheLiar napisał(a)

Ja napisałem własną obsługę kalendarza, użyłem do tego StringGrida w wierszach mam poukładane Miesiąc a w kolumnach dni tygodnia. Cały miesiąc mieści się w jednym wierszu. Kolorowanie zapisane jest w łańcuchu o długości ilości dni 365 lub 366 i każdy znak ma odpowiednią interpretację i koloruję StringGrida w zależności od tego kodu. Z takim kalendarzem możesz robić co tylko zapragniesz.

super, ale jak ten kalendarz podłączyć potem pod DateTimePicker? bo potrafię stworzyć coś na kształt MonthCalendar (własny kalendarz) z zabarwionymi świętami... ale jak tego używać w DateTimePicker to już nie wiem :/
za wszelką pomoc z góry dziękuje :)

Aha, tylko że w tym kalendarzu muszę używać formy miesiąc-dzień... i nie wiem jak tam zaznaczyć niedziele i święta... :/

uzupełnianie o święta (polskie) odbywa się w skrócie za pomocą tej stałej:

const
RDays: array[1..10] of record m, d: word;
end = (
(m: 1; d: 1), {Nowy Rok}
(m: 0; d: 0), {Poniedziałek Wielkanocny}
(m: 5; d: 1), {1 Maja}
(m: 5; d: 3), {3 Maja}
(m: 0; d: 0), {Boże Ciało}
(m: 8; d: 15), {Wniebowstąpienie NMP}
(m: 11; d: 1), {Wszystkich Świętych}
(m: 11; d: 11), {Święto Niepodległości}
(m: 12; d: 25), {Boże Narodzenie - 1}
(m: 12; d: 26)); {Boże Narodzenie – 2}

nie chce się zagłębiać co i jak... chciałbym się jedynie dowiedzieć jak uzupełnić tą stałą o soboty i niedziele lub czego jeszcze użyć, żeby właśnie wydobyć soboty i niedziele... i najważniejsze dla mnie w tej chwili... jak własny kalendarz, zrobiony choćby w StringGridzie podpiąć pod DateTimePicker... żeby właśnie z niego korzystał.

0

Po 1)

Data Wielkanocy w roku nYear:

function GetEasterDate(nYear: word): TDate; 
var
  century, g, i, j, k, l: integer;
  EasterMonth, EasterDay: byte;
begin
  century := nYear div 100;
  g := nYear mod 19;
  k := (century - 17) div 25;
  i := (century - century div 4 - (century - k) div 3 + 19 * g + 15) mod 30;
  i := i - (i div 28) * (1 - (i div 28) * (29 div (i + 1)) * ((21 - g) div 11));
  j := (nYear + (nYear div 4) + i + 2 - century + (century div 4)) mod 7;
  l := i - j;
  EasterMonth := 3 + (l + 40) div 44;
  EasterDay := l + 28 - 31 * (EasterMonth div 4);
  result := EncodeDate(nYear, EasterMonth, EasterDay);
end;

Po 2)

BozeCialo := IncDay(GetEasterDate(Year(now)), 60);

Po 3)
Jeśli chcesz używać TMonthCalendar - wykorzystaj TMonthCalendar.OnGetMonthInfo oraz TMonthCalendar.BoldDays.

MonthCalendar.BoldDays([1, 8], MonthBoldInfo);

(zauważ, że podaje się numery dni w miesiącu. Możesz je wyciągnąć za pomocą DayOfTheMonth.

Jeśli to samo chcesz zrobić za pomocą TDateTimePicker - musisz pokombinować, gdyż OnGetMonthInfo jest właściwością protected klasy macierzystej TCommonCalendar. Można ją wyciągnąć przez proste napisanie własnego komponentu i opublikowanie właściwości OnGetMonthInfo albo przez sztuczkę taką samą jak w TLabeledEdit :)

0

mam szczerze mówiąc troszkę inny algorytm na wyznaczanie Wielkanocy i Bożego Ciała... ale nie w tym rzecz... za odpowiedź bardzo dziękuje, na pewno dużo z niej wyciągnę... a o co chodzi ze sztuczką TLabelEdit? na czym ona polega?

0

Spróbuj się normalnie dostać do właściwości TLabel.FocusControl.

var
  MyLabel: TLabel;
begin
{...}
  MyLabel.FocusControl := Self;
{...}
end;

Otrzymasz komunikat 'cannot access protected symbol...', zgodnie z prawdą.
A teraz zadeklaruj w tym samym module

 type
  TMyNewLabel = class(TLabel);

i spróbuj sztuczki:

  TMyNewLabel(MyLabel).FocusControl := Self;

Zadziała :)

0
milosz28 napisał(a)

mam szczerze mówiąc troszkę inny algorytm na wyznaczanie Wielkanocy i Bożego Ciała...

Ke? A jaki może być inny, PROSTSZY algorytm? Przecież Boże Ciało zawsze przypada w stałym odstępie od Wielkanocy, więc wyznaczenie jednej daty pociąga proste wyznaczenie drugiej :]

0

Ja mam taki algorytm (mam nadzieję, że również jest dobry):

  1. zmiennej a przypisz resztę z dzielenia roku przez 19;
   2. zmiennej b przypisz resztę z dzielenia roku przez 4;
   3. zmiennej c przypisz resztę z dzielenia roku przez 7;
   4. w zależności od wieku przypisz zmiennym m i n wartości:
          * rok jest z przedziału od 1 do 1582 to m=15, n=6;
          * lata od 1583 do 1699 to m=22, n=2;
          * lata od 1700 do 1799 to m=23, n=3;
          * lata od 1800 do 1899 to m=23, n=4;
          * lata od 1900 do 2099 to m=24, n=5; //tylko tutaj wydaje mi się, że powinno być 1999 a wtedy
          * lata od 2100 do 2199 to m=24, n=6; //tutaj od 2000 do 2099
   5. zmiennej d przypisz resztę z dzielenia wartości
      (19*a + m) przez 30;
   6. zmiennej e przypisz resztę z dzielenia wartości
      (2*b + 4*c + 6*d + n) przez 7;
   7. jeżeli (22 + d + e)<=31 to dniem Wielkiej Nocy będzie
      (22 + d + e) marca
      - inaczej jeżeli
      (d + e - 9)=25 lub (d + e - 9)=26 oraz a<=11
      to Wielkanoc będzie 19 kwietnia
      - inaczej (d + e - 9) kwietnia;

czy może ktoś skomentować ten algorytm?

0

Chyba się niezrozumiale wyraziłem. Algorytmów do wyznaczania daty Wielkanocy jest jak mrówków, nie jest istotne, którego używasz, nie różnią się specjalnie czasochłonnością obliczeń. Chciałem powiedzieć tylko, że algorytm wyznaczania daty Bożego Ciała jest najprostszy na świecie - dodaje się do daty W 60 dni, i tyle :)
Zastosowałeś już patent z właściwościami protected? :)

0

BTW - w tym który Ci podałem nie ma ani jednego ifa, więc jest znacznie prostszy :)

0
TBSO napisał(a)

Po 1)

var
century, g, i, j, k, l: integer;
EasterMonth, EasterDay: byte;
begin
century := nYear div 100;
g := nYear mod 19;
k := (century - 17) div 25;
i := (century - century div 4 - (century - k) div 3 + 19 * g + 15) mod 30;
i := i - (i div 28) * (1 - (i div 28) * (29 div (i + 1)) * ((21 - g) div 11));
j := (nYear + (nYear div 4) + i + 2 - century + (century div 4)) mod 7;
l := i - j;
EasterMonth := 3 + (l + 40) div 44;
EasterDay := l + 28 - 31 * (EasterMonth div 4);
result := EncodeDate(nYear, EasterMonth, EasterDay);

program zgłasza mi problem, a mianowicie, że zmienna EasterDay nie może być ujemna. Integer może być ujemny, byte nie... i jak to rozwiązać? zmienić zmienną byte na integer? (ja u siebie używam word, ale problem występuje taki sam).

0

Wkleiłem Ci działającą wersję funkcji (używam jej w kalendarzu dla naszych handlowców). Nigdy nie miałem z nią problemów. Dla jakich danych masz ten komunikat?

1 użytkowników online, w tym zalogowanych: 0, gości: 1