![]() |
Eigener Kalender bauen
Hallo Leute,
ich möchte mir einn eigene Kalender Bauen. Diesen möchte ich für jedemn Tag individuell gestellen können.Das ganze läuft unter Intraweb und dort mit IWRegionen und Labels ab. Da ich jeden Tag extra gestallten möchte habe ich mir eine Case abfrage gebaut. Hiermal das Beispiel für den Monat 1 Tag 4 alseo der 04.01.2016. Habe ich eine Möglichkeit es zu vereinfachen ? Ansonsten müsste ich das ganze ja für jeden Tag anlegen. Also 356 mal.
Delphi-Quellcode:
14: begin
Jan4.Caption := Wochentag; if WochenTag = 'Sa' then begin Jan4.Font.Style := [fsBold]; Jan4Tag.Font.Style := [fsBold]; FeldJan4.Color := clWebBeige end; if WochenTag = 'So' then begin Jan4.Font.Style := [fsBold]; Jan4Tag.Font.Style := [fsBold]; FeldJan4.Color := clWebBISQUE end; if Feiertage.IstFeiertag(Datum) <> '' then begin Jan4.Font.Style := [fsBold]; Jan4Tag.Font.Style := [fsBold]; FeldJan4.Color := clWebBISQUE; Jan4.Font.Color := clRed; Jan4Tag.Font.Color := ClRed; Jan4Anzahl.Left := 50; Jan4Anzahl.Width := 55; Jan4Anzahl.Alignment := taLeftJustify; Jan4Anzahl.Font.Color := clRed; Jan4Anzahl.Font.Size := 7; Jan4Anzahl.Top := 1; Jan4Anzahl.Caption := Feiertage.IstFeiertag(Datum); end; if Feiertage.IstFerientag(Datum) = True then begin FeldJan4.Color := clyellow; end; end; Danke Tanja |
AW: Eigener Kabender bauen
Vllt mit einer Prozedur, die alles macht und als Parameter die Anzeigeobjekte bekommt...
Delphi-Quellcode:
procedure ProcessOneDay(ADate: TDate; const AWochenTag: string; var ADateLabel: TLabel; var ADayLabel: TLabel; var ACountLabel: TLabel; var AFeld: TPanel??);
begin ADayLabel.Caption := AWochentag; if (AWochenTag = 'Sa') or (AWochenTag = 'So') then begin ADateLabel.Font.Style := [fsBold]; ADayLabel.Font.Style := [fsBold]; AFeld.Color := clWebBISQUE end; if (EmptyStr <> Feiertage.IstFeiertag(ADate)) then begin ADateLabel.Font.Style := [fsBold]; ADayLabel.Font.Style := [fsBold]; AFeld.Color := clWebBISQUE; ADateLabel.Font.Color := clRed; ADayLabel.Font.Color := clRed; ACountLabel.Left := 50; ACountLabel.Width := 55; ACountLabel.Alignment := taLeftJustify; ACountLabel.Font.Color := clRed; ACountLabel.Font.Size := 7; ACountLabel.Top := 1; ACountLabel.Caption := Feiertage.IstFeiertag(Datum); end; if Feiertage.IstFerientag(ADate) then begin AFeld.Color := clYellow; end; end; ... ProcessOneDay(Datum, Wochentag, Jan4, Jan4Tag, Jan4Anzahl, FeldJan4); |
AW: Eigener Kabender bauen
Hat sich erledigt
|
AW: Eigener Kabender bauen
Zitat:
![]() |
AW: Eigener Kabender bauen
Zitat:
ConnorMcLeod hatte schon das geschrieben was ich auch schreiben wollte Gruß K-H |
AW: Eigener Kabender bauen
Zitat:
Deine Antwort passte eben nicht wirklich auf die Ausgangsfrage. Und da du gerade einen eigenen Fred aufgemacht hattest war es naheliegend, dass du dich verklickt hattest. :stupid: |
AW: Eigener Kalender bauen
Zitat:
Also alles was rechts der Zuweisung steht, aus einer Datei (oder sonstigem System) auslesen. Immer wenn ein neues Datum oder Jahrestag definiert ist, dann die neue Formatierung einsetzen, bis zu dem Tag, für den die nächste Formatierung definiert ist. |
AW: Eigener Kabender bauen
Hallo ConnorMcLeod,
danke dür den Code. Das bringt mich schon sehr viel weiter, bzw. vereinfacht das ganze schon einmal. Zitat:
Delphi-Quellcode:
Kann man den Code auch noch etwas vereinfach in Form z.B. einer Schleife ?
ProcessOneDay(Datum, Wochentag, Jan1, Jan1Tag, Jan1Anzahl, FeldJan1);
ProcessOneDay(Datum, Wochentag, Jan2, Jan2Tag, Jan2Anzahl, FeldJan1); ... ProcessOneDay(Datum, Wochentag, Dez30, Dez30Tag, DEZ30Anzahl, FeldDez30); ProcessOneDay(Datum, Wochentag, Dez31, Dez31Tag, DEZ31Anzahl, FeldDez31); Tanja |
AW: Eigener Kalender bauen
Naja, Datum ist 'ne Zahl, ginge also z. B. in 'ner For-Schleife:
Delphi-Quellcode:
procedure ProcessOneDay(ADate: TDate; var ADateLabel: TLabel; var ADayLabel: TLabel; var ACountLabel: TLabel; var AFeld: TPanel??);
begin Case DayOfWeek(ADate) of 1 : ADayLabel.Caption := 'Mo'; 2 : ADayLabel.Caption := 'Di'; 3 : ADayLabel.Caption := 'Mi'; 4 : ADayLabel.Caption := 'Do'; 5 : ADayLabel.Caption := 'Fr'; 6 : begin ADayLabel.Caption := 'Sa'; ADateLabel.Font.Style := [fsBold]; ADayLabel.Font.Style := [fsBold]; AFeld.Color := clWebBISQUE end; 7 : begin ADayLabel.Caption := 'So'; ADateLabel.Font.Style := [fsBold]; ADayLabel.Font.Style := [fsBold]; AFeld.Color := clWebBISQUE end; end; if (EmptyStr <> Feiertage.IstFeiertag(ADate)) then begin ADateLabel.Font.Style := [fsBold]; ADayLabel.Font.Style := [fsBold]; AFeld.Color := clWebBISQUE; ADateLabel.Font.Color := clRed; ADayLabel.Font.Color := clRed; ACountLabel.Left := 50; ACountLabel.Width := 55; ACountLabel.Alignment := taLeftJustify; ACountLabel.Font.Color := clRed; ACountLabel.Font.Size := 7; ACountLabel.Top := 1; ACountLabel.Caption := Feiertage.IstFeiertag(ADate); end; if Feiertage.IstFerientag(ADate) then begin AFeld.Color := clYellow; end; end; var i : Integer; begin For i := Trunc(StrToDate('01.01.2016')) to Trunc(StrToDate('31.12.2016')) do begin ProcessOneDay(i, DateLabel, DayLabel, CountLabel, Feld); end; end; |
AW: Eigener Kalender bauen
Zitat:
Das Problem liegt nicht beim Datum, sondern bei den Label. Ich habe ja für jeden Tag z.B. ein anders Label auf der Frorm liegen. Jan1Tag, Jan2Tag, Jan3Tag usw. ein StrToTLabel gibt es ja leider nicht denn sonst würde ich mir das String zusammenbauen und dann in ein TLabel umwandeln. Tanja |
AW: Eigener Kalender bauen
Zitat:
|
AW: Eigener Kalender bauen
Ein StrToLabel kann man sich doch selber bauen:
Wenn es für die Komponenten auf dem Formular eine Namenskonvention gibt, dann kann man sich doch, ausgehend vom Datum, per FindComponent das passende Label suchen: Einfachste Methode wäre, die Labels mit 'nem Namen versehen, der im Datum vorkommt. Z. B.
Delphi-Quellcode:
Damit haben wir Komponentennamen, die man automatisch "zusammenbauen" kann und somit per FindComponent suchen kann.
lbMonat0101 : TLabel;
lbMonat0102 : TLabel; ... lbMonat1231 : TLabel; ... lbTag0101 : TLabel; lbTag0102 : TLabel; ... lbTag1231 : TLabel; Ist jetzt mal nur so ungetestet hingedaddelt:
Delphi-Quellcode:
procedure ProcessOneDay(ADate: TDate);
var sWoTag : String; lbDate : TLabel; lbDay : TLabel; lbFeld : TLabel; lbCount : TLabel; begin lbDate := FindComponent(Format('lbMonat%s%s',[Copy(DateToStr(ADate),4,2),Copy(DateToStr(ADate),1,2)])); if not Assigned(lbDate then Exit; // oder 'ne Fehlermeldung lbDay := FindComponent(Format('lbTag%s%s',[Copy(DateToStr(ADate),4,2),Copy(DateToStr(ADate),1,2)])); if not Assigned(lbDay then Exit; // oder 'ne Fehlermeldung lbFeld := FindComponent(Format('lbFeld%s%s',[Copy(DateToStr(ADate),4,2),Copy(DateToStr(ADate),1,2)])); if not Assigned(lbFeld then Exit; // oder 'ne Fehlermeldung lbCount := FindComponent(Format('lbCount%s%s',[Copy(DateToStr(ADate),4,2),Copy(DateToStr(ADate),1,2)])); if not Assigned(lbCount then Exit; // oder 'ne Fehlermeldung Case DayOfWeek(ADate) of 1 : sWoTag := 'Mo'; 2 : sWoTag := 'Di'; 3 : sWoTag := 'Mi'; 4 : sWoTag := 'Do'; 5 : sWoTag := 'Fr'; 6 : begin sWoTag := 'Sa'; lbDate.Font.Style := [fsBold]; lbDay.Font.Style := [fsBold]; lbFeld.Color := clWebBISQUE end; 7 : begin sWoTag := 'So'; lbDate.Font.Style := [fsBold]; lbDay.Font.Style := [fsBold]; lbFeld.Color := clWebBISQUE end; end; if (EmptyStr <> Feiertage.IstFeiertag(ADate)) then begin lbDate.Font.Style := [fsBold]; lbDay.Font.Style := [fsBold]; lbFeld.Color := clWebBISQUE; lbDate.Font.Color := clRed; lbDay.Font.Color := clRed; lbCount.Left := 50; lbCount.Width := 55; lbCount.Alignment := taLeftJustify; lbCount.Font.Color := clRed; lbCount.Font.Size := 7; lbCount.Top := 1; lbCount.Caption := Feiertage.IstFeiertag(ADate); end; if Feiertage.IstFerientag(ADate) then begin lbFeld.Color := clYellow; end; end; var i : Integer; begin For i := Trunc(StrToDate('01.01.2016')) to Trunc(StrToDate('31.12.2016')) do begin ProcessOneDay(i); end; // oder ab heute für 365 Tage For i := Trunc(Now) to Trunc(Now + 365) do begin ProcessOneDay(i); end; end; |
AW: Eigener Kalender bauen
Delphi-Quellcode:
function StrToLabel(sName : String) : TLabel;
var myCompo : TComponent; begin Result := Nil; myCompo := FindComponent(Format('lb%s',[sName])); // oder welche Namenskonvention auch immer. if Assigned(myCompo) then begin if myCompo is tLabel then Result := myCompo; end; end; |
AW: Eigener Kalender bauen
Hab' gerade nochmal ein bisserl rumgesucht und noch was gefunden, was für die bisherige Namensvergabe der Komponenten passen könnte:
Delphi-Quellcode:
procedure ProcessOneDay(ADate: TDate);
var fFormatSettings : TFormatSettings; sName : String; lbDate : TLabel; lbDay : TLabel; lbFeld : TLabel; lbCount : TLabel; begin GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT,fFormatSettings); sName := FormatDateTime('mmmd',ADate,fFormatSettings); lbDate := FindComponent(sName); if not Assigned(lbDate) then Exit; // oder 'ne Fehlermeldung lbDay := FindComponent(Format('%sTag',[sName])); if not Assigned(lbDay) then Exit; // oder 'ne Fehlermeldung lbFeld := FindComponent(Format('Feld%s',[sName])); if not Assigned(lbFeld) then Exit; // oder 'ne Fehlermeldung lbCount := FindComponent(Format('%sAnzahl',[sName])); if not Assigned(lbCount) then Exit; // oder 'ne Fehlermeldung Case DayOfWeek(ADate) of 6,7 : begin lbDate.Font.Style := [fsBold]; lbDay.Font.Style := [fsBold]; lbFeld.Color := clWebBISQUE end; end; if (EmptyStr <> Feiertage.IstFeiertag(ADate)) then begin lbDate.Font.Style := [fsBold]; lbDay.Font.Style := [fsBold]; lbFeld.Color := clWebBISQUE; lbDate.Font.Color := clRed; lbDay.Font.Color := clRed; lbCount.Left := 50; lbCount.Width := 55; lbCount.Alignment := taLeftJustify; lbCount.Font.Color := clRed; lbCount.Font.Size := 7; lbCount.Top := 1; lbCount.Caption := Feiertage.IstFeiertag(ADate); end; if Feiertage.IstFerientag(ADate) then begin lbFeld.Color := clYellow; end; end; var i : Integer; begin For i := Trunc(StrToDate('01.01.2016')) to Trunc(StrToDate('31.12.2016')) do begin ProcessOneDay(i); end; // oder ab heute für 365 Tage For i := Trunc(Now) to Trunc(Now + 365) do begin ProcessOneDay(i); end; end; |
AW: Eigener Kabender bauen
Zitat:
für deine Frage hätte ich diese Antwort unten ... aber Du könntest Dir auch mal überlegen, Kompenenten selbst abzuleiten. Ein TDatumsLabel, ein TTagesLabel, ein TKalenderTagesPanel und so weiter. Die bekommen ein zusätzliches Property 'Date' und wenn man ein Datum zuweist, dann richten sie sich selbst darauf ein. Dein TKalender bestünde dann aus TKalenderTagesPanels und der Code wäre etwas übersichtlicher ;-)
Delphi-Quellcode:
var
liDateCounter: integer; lsDateString: string; for liDateCounter := 1 to 365 do begin Datum := MachEinSinnvollesDatum(liDateCounter); Wochentag := GibMirDenWochenTag(Datum); lsDateString := FormatDateTime('mmmd', Datum); ProcessOneDay( Datum , Wochentag , TLabel(FindComponent(lsDateString)) , TLabel(FindComponent(lsDateString + 'Tag')) , TLabel(FindComponent(lsDateString + 'Anzahl')) , TPanel(FindComponent('Feld' + lsDateString)) ); end; ) |
AW: Eigener Kabender bauen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Hallo, Danke für Deine Hilfe und auch für die Hilfe der Anderen hier. Das ganze hat micht ein ganzes Stück weitergebracht. Ich möchte ja auf einen Webseite mittels Intraweb ein Kalender darstellen. Hier soll an jeden Tag die Hindergrundfarbe gerändert werden können, des weiterne die Schrift (fett oder normal) und der Wochentag soll dargestellt werden. Ganz rechts soll dan ein Zahl stehen. Hierzu habe ich eine IWRegion benutzen und dann für jeden Tag eine eigene IWRegion um den Tag einzufärben. Links den Tag (IWLabel) und dann den Wochentag (IWLabel). Rechts dann eine frei Wählbare Anzahl (IWLabel). Geht so etwas wirklich als einen eigen Komponenten ? Ich würde dann eine Kalenderkomponenten in die Form ziehen und könnte dann den kompletten Kalender einstellen ? Ich haben so etwas noch niemals gemacht. Gibt es so etwas wie Komponenten ableitein für Blondienen und Dupfbacken ? :-D Ich habe mal ein Bild von dem was ich habe hier eingehängt dort sind die ersten 5 Monate schon erleigt. Wie gesagt das ganze geht schon mal nicht schlecht nur mal möchte ich gerne noch etwas datzuleren wenn es geht. Nochmals Danke an alle welceh mir hier weitergeholfen haben. Tanja |
AW: Eigener Kalender bauen
Das sieht sehr gut aus!
Für die Komponentenentwicklung gibt es zuhauf Tutorials im Netz, wenn nicht sogar hier irgendwo im Forum. Mit den IW-Kompos habe ich keine Erfahrung, inwieweit man bei denen auf spezielle Dinge achten muß, vllt findet sich dazu ein Kollege hier ;-) In der VCL hätte ich mir den Kalender ungefähr (sehr unvollständig) so gedacht:
Delphi-Quellcode:
HTH CmL
interface
uses ... type TMyLabel = class(TLabel) private FDate: TDate; procedure SetDate(AValue: TDate); // beim Ändern des Datums wird auch die Caption angepaßt published property Date: TDate read FDate read SetDate; end; TMyDayPanel = class(TPanel) private FDate : TDate; FDateLabel : TMyLabel; FDayLabel : TMyLabel; FCountLabel: TMyLabel; procedure SetDate(AValue: TDate); // schreibt das Datum auch in die Labels public constructor Create(AOwner: TComponent); // erzeugt auch die Labels published property Date : TDate read FDate read SetDate; property DateLabel : TMyLabel read FDateLabel; property DayLabel : TMyLabel read FDayLabel; property CountLabel: TMyLabel read FCountLabel; end; TMyDayArray = array[1..365] of TMyDayPanel; // Panels müssen erzeugt/freigegeben werden werden ... oder ... TMyDayList = TList<TMyDayPanel>; TMyCalendar = class(TPanel) private FDays: TMyDayArray; ... etc ... end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz