Entwickler-Ecke

Sonstiges (Delphi) - Jahreskalender


Bahade - Di 17.12.02 19:30
Titel: Jahreskalender
Hallo,
ich habe nun mal versucht einen Jahreskalender zu erstellen, der ähnlich funktionieren soll, wie der Windows-Kalender (Doppel-Klick auf Uhrzeit in der Taskleiste).
Leider funktioniert das ganze noch nicht so. Ich würde mich sehr freuen, wenn ihr meine Fehler beim Programmieren finden könntet und entsprechend Verbesserungen vornehmen würdet. Vielen Dank für euere Hilfe! Ich bin gespannt darauf!


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Grids, Spin;

type
  TForm1 = class(TForm)
    SpinEdit1: TSpinEdit;
    StringGrid1: TStringGrid;
    ComboBox1: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure MonateChange(Sender: TObject);
    procedure JahrChange(Sender: TObject);
  private
    { Private-Deklarationen }
    Monatstage: Array[1..12] of Integer;
    function IstSchaltjahr(Jahr: Integer): Boolean;
    function Wochentag(Tag, Monat, Jahr: Integer): Integer;
    function Monatstage(Monat, Jahr: Integer): Integer;
    procedure leer;
    procedure ausfuellen;

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  with Tage do
    begin
      Cells[0,0]:= '  Mo';
      Cells[1,0]:= '  Di';
      Cells[2,0]:= '  Mi';
      Cells[3,0]:= '  Do';
      Cells[4,0]:= '  Fr';
      Cells[5,0]:= '  Sa';
      Cells[6,0]:= '  So';
    end;
  Monate.ItemIndex:= 0;
  Monatstage[ 1]:= 31;
  Monatstage[ 2]:= 28;
  Monatstage[ 3]:= 31;
  Monatstage[ 4]:= 30;
  Monatstage[ 5]:= 31;
  Monatstage[ 6]:= 30;
  Monatstage[ 7]:= 31;
  Monatstage[ 8]:= 31;
  Monatstage[ 9]:= 30;
  Monatstage[10]:= 31;
  Monatstage[11]:= 30;
  Monatstage[12]:= 31;
  Zeigen;
end;


function TForm1.Wochentag(Tag, Monat, Jahr: Integer): Integer;
begin
  if Monat > 2 then begin
       Monat:= Monat - 2;
  Result:= (Tag + (13*Monat-1) div 5 +
            Jahr + Jahr div 4 - Jahr div 100 + Jahr div 400) mod 7;
            else
  then begin
    Monat:= 10 + Monat;
    Jahr:= Jahr - 1;
    end;

procedure TForm1.leer;
  Var i, j: Integer;
begin
  for j:= 1 to 6 do
    for i:= 0 to 6 do
      Tage.Cells[i,j]:= '';
end;


procedure TForm1.ausfuellen;
  var i, j, Tag, Monat, Jahr, Wochentag, Woche: Integer;
begin
  Loeschen;
  Jahr := Jahr.Value;
  Monat:= Monate.ItemIndex + 1;
  Tag  := 1;
  Wochentag:= Wochentag(Tag, Monat, Jahr);
  If Wochentag = 0
    then Wochentag:= 6
    else Wochentag:= Wochentag - 1;
  Woche:= 1;
  for i:= 1 to Monatstage(Monat, Jahr) do begin
    if i < 10
      then Tage.Cells[Wochentag, Woche]:= '    ' + IntToStr(i)
      else Tage.Cells[Wochentag, Woche]:= '  ' + IntToStr(i);
    Wochentag:= Wochentag + 1;
    If Wochentag = 7 then begin
      Wochentag:= 0;
      Woche:= Woche + 1;
    end;
  end;
end;


function TForm1.Monatstage(Monat, Jahr: Integer): Integer;
begin
  Result:= Monatstage[Monat];
  If (Monat = 2) and IstSchaltjahr(Jahr) then
    Result:= Monatstage[2]+1
end;

procedure TForm1.MonateChange(Sender: TObject);
begin
  ausfuellen;
end;

procedure TForm1.JahrChange(Sender: TObject);
begin
  ausfuellen;
end;



end.


Grüße & Danke,
Bahade


Wolff68 - Mi 18.12.02 00:01

Warum benutzt Du nicht einfach die Komponente TCalendar (unter Beispiele), oder ist die in Deiner Delphi-Version nicht drin?

Zu TCalendar könnte ich Die ein Beispiel senden. Komplett im Eigenbau hab ich das auch noch nicht gemacht.
(Und ehrlich gesagt momentan wenig Zeit Deinen Quelltext zu analysieren.)


LCS - Mi 18.12.02 09:54

Hi
also irgendwie sieht das aus als hättest du den Code nicht selber geschrieben sondern irgendwo kopiert. Oder bei dir ist was mächtig durcheinander geraten.


Irgendwo hab ich mal gelesen: Programmieren ist mehr als Copy & Paste :mrgreen:
Also schreib mal genau wo dein Problem liegt.

Gruss Lothar


Bahade - Mi 18.12.02 14:30
Titel: Jahreskalender oder HILFE, ich weiß nicht mehr weiter.....
Hallo,

ja natürlich habe ich ihn irgendwo her kopiert, loeschen muss wohl durch leer und zeigen durch ausfuellen ersetzt werden?!

Habe leider nicht viel Ahnung davon, darum bitte ich euch, mir zu helfen....
Das ganze ist ja schon mal die richtige Richtung.
Jetzt muss ich nur noch die vielen Fehler beseitigen (...)
Aber dazu brauche ich unbedingt euere Hilfe.

Also, es wäre toll, wenn wir zusammen das hinkriegen könnten!!!

Danke & Grüße aus Düsseldorf,
Bahade


smiegel - Mi 18.12.02 14:44

Hallo,

in Delphi ist ein Kalender, der auf einem Stringgrid basiert dabei. Zu finden im Reiter "Beispiele". Wenn Du über die Prof.-Version verfügst, ist der Quellcode dazu im Verzeichnis "C:\Programme\Borland\Delphi5\Source\Samples" unter dem Namen "calendar.pas" zu finden.

Schau Dir diesen einmal an, ich denke, da kannst Du genügend Ideen für Deinen Kalender abschauen.


LCS - Mi 18.12.02 15:00

Hi
Als erstes solltest du jetzt mal versuchen herauszufinden, was wohl mit Jahr, Monate und Tage gemeint ist. Das scheinen ja wohl Steuerelemente zu sein. Also wäre der erste Schritt den Steuerelementen die du auf deinem Formular hast, die richtigen Namen zuzuweisen.

Gruss Lothar


Sledge_Hammer - Mi 18.12.02 21:30

wo ihr grad bei kalendern seid, ich hab da auch gleich mal ne frage: wie kann ich ermitteln, welcher tag ein samstag ist (natürlich nicht nur im aktuellen jahr)?
THX Benni


hansa - Mi 18.12.02 21:58

Hi,

ist das nicht die Funktion DayOfWeek ? Ich bin fast der letzte, der sagt, guck in der Delphi-Hilfe, denn die ist sehr beschi........eiden. Zu diesem Thema aber eigentlich nicht. Fast zu umfangreich.

Gruß
Hansa


Tino - Do 19.12.02 10:46

hansa hat folgendes geschrieben:
Ich bin fast der letzte, der sagt, guck in der Delphi-Hilfe, denn die ist sehr beschi........eiden.

Das finde ich nicht! Meistens liegt es nur daran das man nicht weiß wo nach und wo man suchen muss und wie man letzendlich die Informationen die die Delphi-Hilfe liefert anwendet!

Gruß
TINO


hansa - Do 19.12.02 12:43

Hi Tino,

nun, das stimmt auch wieder, aber ich finde es kommt zu oft vor, wenig aufschlußreiches zu finden. Wie ich aber sagte, in diesem Fall war meine Vermutung richtig. Habs probiert und dabei in der Hilfe noch etwas neues gefunden. DayOfTHEweek, das kenne ich auch nicht mal. Der Vollständigkeit halber sei noch etwas "selbstverständliches" erläutert. Der Cursor muß auf dem Wort stehen, dann erscheint hierzu mit F1 die passende Erläuterung. Weiß man dieses Wort halt nicht genau, kommt das von Tino beschriebene hinzu. Das müßte IMHO so laufen wie die Google-Suche. "Nicht gefunden. Meinten Sie vielleicht.... ?"

Gruß
Hansa