Zugriff Steuerelement Kalender

Hallo,

da ich jetzt viel Zeit habe, beschäftige ich mich nach langer Zeit wieder mit VB6 und bin dabei, einige bereits vor Jahren angefangene Projekte zu vollenden.

Eines dieser Projekte enthält das Kalender-Steuerelement (mscal.ocx). Bei Programmstart wird das aktuelle Datum angezeigt. Wenn ich nun den Monat und/oder das Jahr verändere, ist die Markierung des aktuellen Tages weg und ich bekomme die gesamte Änderung über das Klick-Ereignis erst dann mit, wenn ich auf einen der Tages-Buttons klicke.

Ich möchte aber jede Änderung mitbekommen und z.B. auch schon bei Monatswechsel das Tagesdatum beibehalten (ggfls. neu aktivieren). Ich habe es schon mit „NewMonth“ versucht, hat auch nicht geholfen (oder ich habe mich zu dumm angestellt).

Welche Möglichkeiten gibt es also um Monats-/Jahreswechsel sofort mitzubekommen?

Ok, ich könnte auch das MonthView-Steuerelement nehmen, aber das gefällt mir nicht so gut von der Optik und ich könnte, da dies nur Übungs- bzw. Beschäftigungs-Projekte für mich sind, auch mit dem zusätzlichen Klick auf den entspr. Tages-Button leben - aber es muss ja nicht immer der einfachste Weg sein, es sollte doch hierfür eine Lösung geben!

Vielen Dank!

Gruß, Robi

Hallo Robi,


Eines dieser Projekte enthält das Kalender-Steuerelement
(mscal.ocx). Bei Programmstart wird das aktuelle Datum
angezeigt. Wenn ich nun den Monat und/oder das Jahr verändere,
ist die Markierung des aktuellen Tages weg und ich bekomme die
gesamte Änderung über das Klick-Ereignis erst dann mit, wenn
ich auf einen der Tages-Buttons klicke.

Ich möchte aber jede Änderung mitbekommen und z.B. auch schon
bei Monatswechsel das Tagesdatum beibehalten (ggfls. neu
aktivieren). Ich habe es schon mit „NewMonth“ versucht, hat
auch nicht geholfen (oder ich habe mich zu dumm angestellt).

Welche Möglichkeiten gibt es also um Monats-/Jahreswechsel
sofort mitzubekommen?

Das Kalendersteuerelement löst u.a. die Ereignisse „Click“,
„NewMonth“ und „NewYear“ aus.

„Click“ wird, wie Du festgestellt hast, ausgelöst, wenn der
Benutzer auf einen Tag klickt. „NewMonth“ und „NewYear“ werden
ausgelöst, sobald der Benutzer aus den Drop-Down-Feldern einen
anderen Monat bzw. anderes Jahr auswählen.

Also: Einfach Prozeduren für die Ereignisse „NewMonth“ und
„NewYear“.

Gruß
Thomas

Also: Einfach Prozeduren für die Ereignisse „NewMonth“ und
„NewYear“.

Hallo Thomas,

dann mach mal bitte, ich habe das nicht hingekriegt.

Private Sub Calendar1_NewMonth()
Calendar1.Refresh
MsgBox Calendar1.Monat
End Sub

Refresh bewirkt nix sichtbares. Wähle ich einen Monat so ergibt MsgBox Calendar1.Monat 0.

Es wird zwar auf den neuen Monat umgestellt, aber kein tag ist markiert.

Ich habe VB5.0, da sind die Eigenschaften in Deutsch:

Calendar1.Tag
Calendar1.Monat
Calendar1.MonatLänge
Calendar1.Jahr
Calendar1.LängeDesTages
Calendar1.Datumsmarkierer
Calendar1.Wert

Ist das in VB6.0 auch so?

Das Steuerelement nennt sich
Microsoft Kalender-Steuerelement 9.0
verbirgt sich in der Datei:
…\mscaldeu.tlb

Gruß
Reinhard

Hallo Reinhard,

Also: Einfach Prozeduren für die Ereignisse „NewMonth“ und
„NewYear“.

Hallo Thomas,

dann mach mal bitte, ich habe das nicht hingekriegt.

Private Sub Calendar1_NewMonth()
Calendar1.Refresh
MsgBox Calendar1.Monat
End Sub

Es wird zwar auf den neuen Monat umgestellt, aber kein tag ist
markiert.

Stimmt, ist bei mir auch so :frowning:

Das Ereignis wird zwar ausgelöst, der neu ausgewählte Monat (bzw.
das neu ausgewählte Jahr) werden aber nirgends übergeben…

In unseren Projekten habe ich folgende Lösung gefunden:

Wir haben eigene Combo-Boxen für Monat und Jahr erstellt,
und diese über das Calendar Control gelegt.

Dann kann mit folgendem Code eine Aktualisierung des Calendar
Controls durchgeführt werden:

(Combo1 ist Dropdown-Liste mit Monaten, Calendar1 das Kalender-
Steuerelement)

Private Sub Combo1\_Click()
 Me.Calendar1.Month = Me.Combo1.Text
End Sub

Ich habe VB5.0, da sind die Eigenschaften in Deutsch:

Ist das in VB6.0 auch so?

Wir haben bei uns ein „Microsoft Calendar Control 12.0“
(MSCAL.OCX) installiert (wird mit irgendeinem Office
automatisch aktualisiert; die Eigenschaften sind in englisch.

Viele Grüße
Thomas

Ich möchte aber jede Änderung mitbekommen und z.B. auch schon
bei Monatswechsel das Tagesdatum beibehalten (ggfls. neu
aktivieren). Ich habe es schon mit „NewMonth“ versucht, hat
auch nicht geholfen (oder ich habe mich zu dumm angestellt).

Welche Möglichkeiten gibt es also um Monats-/Jahreswechsel
sofort mitzubekommen?

Hallo Robi,

Ursprungscode:
http://support.microsoft.com/kb/193967/de

Getestet mit einer Form und kalender steuerelement in VB5.0

du brauchst
Public Tag as String
in Module1

dann im Modul der Form:

Option Explicit

Private Declare Function FindWindowEx Lib "user32" \_
 Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, \_
 ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "user32" \_
 Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, \_
 ByVal wParam As Long, lParam As Any) As Long
Private Const CB\_GETCURSEL = &H147
Private Const CB\_GETLBTEXT = &H148
Private calendarHwnd As Long
Private cboMonthHwnd As Long
Private cboYearHwnd As Long

Private Sub Form\_Load()
Tag = Left(Calendar1, InStr(Calendar1, ".") - 1)
calendarHwnd = FindWindowEx(Me.hwnd, 0&, "CalendarWndClass", vbNullString)
cboMonthHwnd = FindWindowEx(calendarHwnd, 0&, "ComboBox", vbNullString)
cboYearHwnd = FindWindowEx(calendarHwnd, cboMonthHwnd, "ComboBox", vbNullString)
End Sub

Private Sub Calendar1\_Click()
Tag = Left(Calendar1, InStr(Calendar1, ".") - 1)
End Sub

Private Sub Calendar1\_NewMonth()
Call tt
End Sub

Private Sub Calendar1\_NewYear()
Call tt
End Sub

Sub tt()
Dim yearIndex As Long, monthIndex As Long
monthIndex = SendMessage(cboMonthHwnd, CB\_GETCURSEL, 0&, 0&amp:wink:
yearIndex = SendMessage(cboYearHwnd, CB\_GETCURSEL, 0&, 0&amp:wink:
Calendar1 = Tag & "." & monthIndex + 1 & "." & yearIndex + 1900
End Sub

Gruß
Reinhard

Dank an euch Beide!

Ich hatte ja ursprünglich gedacht, dass das Ganze relativ einfach wäre und tatsächlich über NewMonth/NewYear funktionieren sollte, aber warum einfach, wenn es auch kompliziert geht?

Nun, wieder was dazugelernt! Die Lösung mit eigener Kombobox hatte ich übrigens auch schon kurz angedacht, aber wie gesagt…

Grüße und einen guten Rutsch

Robi