Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Eigener Kalender bauen (https://www.delphipraxis.net/190140-eigener-kalender-bauen.html)

Dumpfbacke 2. Sep 2016 12:53

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

ConnorMcLeod 2. Sep 2016 13:20

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);

p80286 2. Sep 2016 13:22

AW: Eigener Kabender bauen
 
Hat sich erledigt

Aviator 2. Sep 2016 15:37

AW: Eigener Kabender bauen
 
Zitat:

Zitat von p80286 (Beitrag 1346612)
Hat sich erledigt

Ich glaube das bezog sich auf diesen Thread, oder?

p80286 2. Sep 2016 15:57

AW: Eigener Kabender bauen
 
Zitat:

Zitat von Aviator (Beitrag 1346624)
Zitat:

Zitat von p80286 (Beitrag 1346612)
Hat sich erledigt

Ich glaube das bezog sich auf diesen Thread, oder?

Nee leider nicht, da suche ich mir noch einen wolf....
ConnorMcLeod hatte schon das geschrieben was ich auch schreiben wollte

Gruß
K-H

Aviator 2. Sep 2016 16:00

AW: Eigener Kabender bauen
 
Zitat:

Zitat von p80286 (Beitrag 1346628)
Nee leider nicht, da suche ich mir noch einen wolf....
ConnorMcLeod hatte schon das geschrieben was ich auch schreiben wollte

Achso. Sorry. :pale:

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:

jobo 3. Sep 2016 10:04

AW: Eigener Kalender bauen
 
Zitat:

Zitat von Dumpfbacke (Beitrag 1346608)
ich möchte mir einn eigene Kalender Bauen. Diesen möchte ich für jedemn Tag individuell gestellen können.

Auch wenn Du mit dem Post hier wohl eher an eine Code Verbesserung gedacht hast (hast Du ja bereits bekommen). Ich würde die Formatierung irgendwoher laden, z.B. aus einer Textdatei.
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.

Dumpfbacke 3. Sep 2016 13:27

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:

Zitat von ConnorMcLeod (Beitrag 1346610)
Vllt mit einer Prozedur, die alles macht und als Parameter die Anzeigeobjekte bekommt...

Delphi-Quellcode:
  ProcessOneDay(Datum, Wochentag, Jan4, Jan4Tag, Jan4Anzahl, FeldJan4);

Jetzt habe ich nur nochein Problem. Ich müste nun beim erzeugen 365 mal die Aufruf starten also etwas so:

Delphi-Quellcode:
 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);
Kann man den Code auch noch etwas vereinfach in Form z.B. einer Schleife ?

Tanja

nahpets 3. Sep 2016 13:49

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;

Dumpfbacke 3. Sep 2016 14:07

AW: Eigener Kalender bauen
 
Zitat:

Zitat von nahpets (Beitrag 1346671)
Naja, Datum ist 'ne Zahl, ginge also z. B. in 'ner For-Schleife:
Delphi-Quellcode:
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;


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

Benedikt Magnus 3. Sep 2016 14:36

AW: Eigener Kalender bauen
 
Zitat:

Zitat von Dumpfbacke (Beitrag 1346672)
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

Du könntest die Tags der Labels nutzen (Tags = Tag), sie in einer Liste/Array zusammenfassen (Index = Tag) oder mit FindComponent arbeiten.

nahpets 3. Sep 2016 14:56

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:
lbMonat0101 : TLabel;
lbMonat0102 : TLabel;
...
lbMonat1231 : TLabel;
...
lbTag0101 : TLabel;
lbTag0102 : TLabel;
...
lbTag1231 : TLabel;
Damit haben wir Komponentennamen, die man automatisch "zusammenbauen" kann und somit per FindComponent suchen kann.

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;

nahpets 3. Sep 2016 15:02

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;

nahpets 3. Sep 2016 17:41

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;

ConnorMcLeod 5. Sep 2016 10:14

AW: Eigener Kabender bauen
 
Zitat:

Zitat von Dumpfbacke (Beitrag 1346668)
Hallo ConnorMcLeod,
danke dür den Code. Das bringt mich schon sehr viel weiter, bzw. vereinfacht das ganze schon einmal.

Zitat:

Zitat von ConnorMcLeod (Beitrag 1346610)
Vllt mit einer Prozedur, die alles macht und als Parameter die Anzeigeobjekte bekommt...

Delphi-Quellcode:
  ProcessOneDay(Datum, Wochentag, Jan4, Jan4Tag, Jan4Anzahl, FeldJan4);

Jetzt habe ich nur nochein Problem. Ich müste nun beim erzeugen 365 mal die Aufruf starten also etwas so:

Delphi-Quellcode:
 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);
Kann man den Code auch noch etwas vereinfach in Form z.B. einer Schleife ?

Tanja

Hallo Tanja,
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;
)

Dumpfbacke 5. Sep 2016 19:18

AW: Eigener Kabender bauen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von ConnorMcLeod (Beitrag 1346779)
Hallo Tanja,
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 ;-)


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

ConnorMcLeod 6. Sep 2016 09:25

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:
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;
HTH CmL


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz