Witam!
Dostałem jako projekt zrobienie kalendarza rolnika. Z tego co zauważyłem notatka w kalendarzu (czy warto siać, etc.) zależy od fazy księżyca w danym dniu.
Nie wiem które narzędzie warto wybrać z Tool Palette.
TCalendar ? Tylko jak dodać do niego notatki itd.
Mam stare Delphi (7), ale w Lazarusie TCalendar
to bardzo uboga kontrolka z podstawowymi funkcjami; Jeśli zależy Ci na efektowności to warto poszukać lepszych kontrolek w sieci, albo samemu we własnym zakresie zaprogramować taką od podstaw z własnym rysowaniem; Wtedy będzie można dość łatwo dostosować kontrolkę pod własne oczekiwania.
Sam raczej na 100% nic nie wymyślę to dla mnie zbyt skomplikowane.
Na dobrą sprawę potrzebuję kalendarza z widokiem tygodnia i miejscem przy każdym dniu na notatki, które zależą od tego w jakim położeniu znajduje się księżyc.
Tworzenie własnej kontrolki jest tak samo skomplikowane, jak tworzenie aplikacji okienkowej - wystarczy podstawowa wiedza w zakresie programowania obiektowego + kreatywność i chęci;
Zawsze możesz wkorzystać podstawowy TCalendar
, a notatki trzymać w jakiejś wirtualnej liście (np. TStringList
) lub zbudować obpowiednią klasę do przechowywania notatek z danych dni, a podczas wybierania daty z kalendarza wyświetlać notatki np. w TMemo
, TListBox
, TCheckListBox
, TValueListEditor
czy podobnych;
Możliwości jest wiele, więc zastanów się najpierw nad tym jak interfejs ma wyglądać, potem poukładaj kontrolki na formularzu (jeśli nie chcesz oprogramować swojej) a na końcu oprogramuj je i stwórz jakiś silnik do obsługi tych notatek + zapis/odczyt do/z pliku by nie tracić ich po zakończeniu sesji.
Czy TCalendar umożliwia stworzenie eventu po kliknięciu na datę z kalendarza?
Tego nie wiem, bo nie używałem tego komponentu. Jednak mogę z czystym sumieniem polecić TStringGrid
. Zobacz na dołaczony do tego posta kod w Delphi 7 wraz z exekiem. Może nie jest idealny i pisany przeze mnie dawno temu, jeszcze w Delphi 3. Ale spełnia swoje zadanie. A dodatkowo TStringGrid
, poza własnością Cells
posiada również własnośc Objects
. Daje nam to możliwość dodawania do komórek własnego obiektu, na przykład jakiejś klasy przykładowo TWydarzenieRolnicze
czy jak sobie to nazwiesz. Wtedy sprawdzamy i jeśli w danym dniu TWydarzenieRolnicze[ACol, ARow] <> nil
to wiemy, że można tę komórkę TStringGrid
narysować na przykład innym kolorem tekstu lub tła (zobacz sobie jak w kodzie u siebie rysuje dzień aktualny lub niedzielę). A po kliknięciu na komórkę, co również można łatwo obsłużyć, można w innych komponentach wyświetlić dodatkowe informacje jak tekst czy liczby związane z tym dniem, a nawet grafikę. Wszystko zależy jakie pola będzie posiadała Twoja klasa ze zdarzeniem (dziedzicząca po TObject
).
Bardzo ci dziękuję :)
W międzyczasie testowałem inne możliwości i zacząłem robić to tak:
procedure TForm4.Calendar1Change(Sender: TObject);
begin
if Calendar1.Day = 1 then
Label1.Caption := '1';
end;
procedure TForm4.FormCreate(Sender: TObject);
begin
if Calendar1.Day = 16 then
Label1.Caption := 'jakiś hint';
end;
Działa :) Myślę że na tym oprę program, że każdy dzień będzie zmieniał zmienną informującą o położeniu księżyca i do każdego dnia na najbliższe miesiące dopiszę wartość tej zmiennej. Nie widzę szybszego wyjścia bo niestety nie jest to do końca regularne z tego co widzę.
Doszedłem do tego że mam w procedurze (przy kliknięciu na kalendarz) sprawdzanie jaka data jest wybrana i wyświetlenie do niej informacji. Czy da się uruchomić procedurę w procedurze? Czyli chodzi mi oto żeby ta procedura była również wykonywana przy starcie programu, a nie chcę jej powielać i wklejać tego samego do drugiego eventu.
Form1.Create
Chodzi mi o to że chcę do procedury wstawić inną.
procedure TForm4.FormCreate(Sender: TObject);
begin
if Calendar1.Month = 1 then
Label1.Caption := 'Styczeń';
end;
Powiedzmy że tą procedurę chcę wstawić innej procedury. Da się tak żeby nie powtarzać kodu?
Jeśli nie wiesz w jaki sposób wywołuje się procedurę w innej procedurze to polecam najpierw siąść i nauczyć się podstaw kodzenia, o dopiero później spróbować cokolwiek napisać.
Już to zrobiłem. Problem leżał w innej naturze :)