AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eigener Kalender bauen

Ein Thema von Dumpfbacke · begonnen am 2. Sep 2016 · letzter Beitrag vom 6. Sep 2016
Antwort Antwort
Seite 2 von 2     12   
Benedikt Magnus

Registriert seit: 6. Jul 2012
Ort: Bonn
190 Beiträge
 
FreePascal / Lazarus
 
#11

AW: Eigener Kalender bauen

  Alt 3. Sep 2016, 15:36
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.

Geändert von Benedikt Magnus ( 3. Sep 2016 um 16:00 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#12

AW: Eigener Kalender bauen

  Alt 3. Sep 2016, 15:56
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;
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#13

AW: Eigener Kalender bauen

  Alt 3. Sep 2016, 16:02
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;
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#14

AW: Eigener Kalender bauen

  Alt 3. Sep 2016, 18:41
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;
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#15

AW: Eigener Kabender bauen

  Alt 5. Sep 2016, 11:14
Hallo ConnorMcLeod,
danke dür den Code. Das bringt mich schon sehr viel weiter, bzw. vereinfacht das ganze schon einmal.

Vllt mit einer Prozedur, die alles macht und als Parameter die Anzeigeobjekte bekommt...

  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;
)
Nr.1 Delphi-Tool: [F7]

Geändert von ConnorMcLeod ( 5. Sep 2016 um 17:58 Uhr)
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#16

AW: Eigener Kabender bauen

  Alt 5. Sep 2016, 20:18
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 ? 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
Miniaturansicht angehängter Grafiken
kalender.jpg  
Tanja
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#17

AW: Eigener Kalender bauen

  Alt 6. Sep 2016, 10:25
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
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:24 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