Erforderliche Aktualisierungen zulassen
Nach oben zu Den Kalender als Nur-Lesen-Steuerelement definieren
Der schreibgeschützte Kalender verwendet die Methode SelectCell für alle Arten von Änderungen, einschließlich des Setzens der Eigenschaften Row und Col. Mit der Methode UpdateCalendar werden Row und Col jedes Mal dann gesetzt, wenn sich das Datum ändert. Da SelectCell aber Änderungen verhindert, bleibt die Auswahl selbst bei einer Datumsänderung in Kraft.
Zur Umgehung dieses absoluten Änderungsverbots können Sie dem Kalender ein internes Boolesches Flag hinzufügen und somit erlauben, dass Änderungen durchgeführt werden, wenn das Flag auf True gesetzt ist:
Delphi:
type
TDBCalendar = class(TSampleCalendar)
private
FUpdating: Boolean; { private-Flag für interne Verwendung }
protected
function SelectCell(ACol, ARow: Longint): Boolean; override;
public
procedure UpdateCalendar; override; { Direktive override nicht vergessen }
end;
end;
// …
function TDBCalendar.SelectCell(ACol, ARow: Longint): Boolean;
begin
if (not FUpdating) and FReadOnly then Result := False { Auswählen beim Aktualisieren möglich }
else Result := inherited SelectCell(ACol, ARow); { Ansonsten geerbte Methode verwenden }
end;
procedure TDBCalendar.UpdateCalendar;
begin
FUpdating := True; { Flag setzen, um Aktualisierungen zu ermöglichen }
try
inherited UpdateCalendar; { Wie gewohnt aktualisieren }
finally
FUpdating := False; { Flag immer löschen }
end;
end;
C++:
class PACKAGE TDBCalendar : public TSampleCalendar
{
private:
// …
bool FUpdating; // private-Flag für interne Verwendung
protected:
virtual bool __fastcall SelectCell(long ACol, long ARow);
public:
// …
virtual void __fastcall UpdateCalendar();
// …
};
bool __fastcall TDBCalendar::SelectCell(long ACol, long ARow)
{
if (!FUpdating && FReadOnly) return false; // Keine Auswahl, wenn schreibgeschützt
return TSampleCalendar::SelectCell(ACol, ARow); // Andernfalls geerbte Methode verwenden
}
void __fastcall TDBCalendar::UpdateCalendar()
{
FUpdating=true; // Aktualisierungen zulassen
try
{
TSampleCalendar::UpdateCalendar(); // Aktualisierung wie gewöhnlich
}
catch(...)
{
FUpdating = false;
throw;
}
FUpdating = false; // Flag immer zurücksetzen
}
Der Kalender erlaubt immer noch keine Änderungen durch den Benutzer, spiegelt aber jetzt die ausgeführten Datumsänderungen durch eine entsprechende Änderung der Datumseigenschaften wider. Nun verfügen Sie über einen Nur-Lesen-Kalender, dem Sie die Katalog-Funktion hinzufügen können.