Erforderliche Aktualisierungen zulassen

Aus RAD Studio
Wechseln zu: Navigation, Suche

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.