Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Kalender mit Checkboxen (https://www.delphipraxis.net/164095-kalender-mit-checkboxen.html)

loirad 28. Okt 2011 11:31

Kalender mit Checkboxen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo ihr,
ich möchte für jeden Tag meines Kalenders eine Listbox einfügen. Jedoch sind immer zu wenig Listboxen da --> ich häng mal das Projekt an --> guckt es euch an bitte!
Hier der Quelltext:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, Grids, StdCtrls, DateUtils;

type
  TForm1 = class(TForm)
    Kalender: TStringGrid;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Beenden1: TMenuItem;
    Monat: TLabel;
    zuruek: TButton;
    vor: TButton;
    procedure FormCreate(Sender: TObject);
    function welchermonat(Monat:string):string;
    procedure vorClick(Sender: TObject);
    procedure fuellen(Monat,Jahr, Wochentag: integer);
    procedure clear;
    function Wochentag(Datum:TDateTime):integer;
    procedure zuruekClick(Sender: TObject);
    procedure KalenderDblClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure KalenderDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure setRect(rec:Trect;Nummer:integer);
    procedure Listboxcreate(Listbox:TListbox;Nummer:integer);
    procedure listboxenverteilen;
  private
    { Private-Deklarationen }
    taga,mona,monatsnamea,jahra,tag,mon,monatsname,jahr:String;
    dat:TDateTime;
    L: array [1..31] of TListbox;
    day:integer;
  public
    { Public-Deklarationen }
    Nameu,VonT,BisT,VonZ,BisZ,Wiederholung,Inhalt:string;
    neuerText:boolean;  
  end;

var
  Form1: TForm1;
  L1,L2,L3,L4,L5,L6,L7,L8,L9,L10,L11,L12,L13,L14,L15,L16,
  L17,L18,L19,L20,L21,L22,L23,L24,L25,L26,L27,L28,L29,L30,
  L31:TListbox;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
neuerText:=false;
Kalender.Top:=20;
Kalender.Left:=0;
Kalender.Width:=Form1.ClientWidth;
Kalender.Height:=Form1.ClientHeight-20;
Kalender.DefaultColWidth:=(Kalender.Width div 7)-2;
Kalender.DefaultRowHeight:=(Kalender.Height div 7)-2;
Kalender.Cells[0,0]:='Montag';
Kalender.Cells[1,0]:='Dienstag';
Kalender.Cells[2,0]:='Mittwoch';
Kalender.Cells[3,0]:='Donnerstag';
Kalender.Cells[4,0]:='Freitag';
Kalender.Cells[5,0]:='Samstag';
Kalender.Cells[6,0]:='Sonntag';
Monat.Top:=0;
Monat.Left:=Form1.ClientWidth div 2 - Monat.Width div 2;
zuruek.Left:=0;
zuruek.Top:=0;
vor.Top:=0;
vor.Left:=Form1.ClientWidth-vor.Width;
dat:=now;
taga:=FormatDateTime('d',dat);
mona:=FormatDateTime('m',dat);
jahra:=FormatDateTime('yyyy',dat);
monatsnamea:=welchermonat(mona);
Form1.Caption:='Kalender - '+taga+'. '+monatsnamea+' '+jahra;
Monat.Caption:=monatsnamea+' '+jahra;
day:=Wochentag(strtodate('01.'+mona+'.'+jahra));
fuellen(strtoint(mona),strtoint(jahra),day);
tag:=taga;
mon:=mona;
monatsname:=monatsnamea;
jahr:=jahra;
listboxenverteilen;
end;

function TForm1.welchermonat(Monat: String): string;
begin
case strtoint(Monat) of
 1:result:='Januar';
 2:result:='Februar';
 3:result:='März';
 4:result:='April';
 5:result:='Mai';
 6:result:='Juni';
 7:result:='Juli';
 8:result:='August';
 9:result:='September';
 10:result:='Oktober';
 11:result:='November';
 12:result:='Dezember';
end;
end;

procedure TForm1.vorClick(Sender: TObject);
begin
Form1.UpdateControlState;
clear;
if strtoint(mon)<12 then
 mon:=inttostr(1+strtoint(mon))
else
 begin
  mon:='1';
  jahr:=inttostr(1+strtoint(jahr));
 end;
fuellen(strtoint(mon),strtoint(jahr),Wochentag(strtodate('01.'+mon+'.'+jahr)));
monatsname:=welchermonat(mon);
Monat.Caption:=monatsname+' '+jahr;
day:=Wochentag(strtodate('01.'+mon+'.'+jahr));
listboxenverteilen;
end;

procedure TForm1.fuellen(Monat, Jahr, Wochentag: integer);
var i,j,z:integer;
begin
i:=1;
z:=1;
j:=Wochentag-1;
repeat
 Kalender.Cells[j,z]:=inttostr(i)+'. '+welchermonat(inttostr(Monat))+' '+inttostr(Jahr);
 if j<6 then
  begin
   inc(j);
  end
 else
  begin
   inc(z);
   j:=0;
  end;
 inc(i);
until i>Daysinamonth(Jahr,Monat);
end;

procedure TForm1.clear;
var i,j:integer;
begin
for i:=0 to Kalender.ColCount do
 for j:=1 to Kalender.RowCount do
  Kalender.Cells[i,j]:='';
for i:=1 to Length(L) do
  L[i].Free;
fillchar(L,sizeOf(L),0) ;
end;

function TForm1.Wochentag(Datum: TDateTime): integer;
begin
case DayOfWeek(Datum) of
 1: Result := 7;
 2: Result := 1;
 3: Result := 2;
 4: Result := 3;
 5: Result := 4;
 6: Result := 5;
 7: Result := 6;
end;
end;

procedure TForm1.zuruekClick(Sender: TObject);
begin
Form1.Hide;
clear;
if strtoint(mon)>1 then
 mon:=inttostr(strtoint(mon)-1)
else
 begin
  mon:='12';
  jahr:=inttostr(strtoint(jahr)-1);
 end;
fuellen(strtoint(mon),strtoint(jahr),Wochentag(strtodate('01.'+mon+'.'+jahr)));
monatsname:=welchermonat(mon);
Monat.Caption:=monatsname+' '+jahr;
day:=Wochentag(strtodate('01.'+mon+'.'+jahr));
listboxenverteilen;
Form1.Show;
end;

procedure TForm1.KalenderDblClick(Sender: TObject);
begin
if Kalender.Cells[Kalender.Selection.Left,Kalender.Selection.Top]<>'' then
 begin
  Form1.Enabled:=false;
  Form2.Show;
  Form2.Name.SetFocus;
  Inhalt:=Form1.Kalender.Cells[Form1.Kalender.Selection.Left,Form1.
  Kalender.Selection.Top]
 end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form2.Close;
end;

procedure TForm1.KalenderDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
if Kalender.Cells[ACol,ARow]='' then
 begin
  Kalender.Canvas.Brush.Color := clMedGray;
  Kalender.Canvas.FillRect(Rect);
 end;
end;

procedure TForm1.setRect(rec: Trect;Nummer:integer);
var r:TRect;
begin
  // CheckBox in stringgrid
  CopyRect(r,rec); // rec an r übergeben
  r.BottomRight:=L[Nummer].Parent.ScreenToClient(Kalender.ClientToScreen(r.BottomRight));
  r.TopLeft:=L[Nummer].Parent.ScreenToClient(Kalender.ClientToScreen(r.TopLeft));
  L[Nummer].SetBounds(r.Left,r.Top,r.Right-r.Left,r.Bottom-r.Top);
  L[Nummer].BringToFront;
end;

procedure TForm1.Listboxcreate(Listbox: TListbox; Nummer: integer);
begin
{Listbox:=TListbox.Create(self);
Listbox.Parent:=Form1;
L[Nummer]:=Listbox; }
end;

procedure TForm1.listboxenverteilen;
var x,y,i:integer;
begin
x:=day-1;
y:=1;
for i:=1 to 31{daysinamonth(strtoint(jahr),strtoint(mon))} do
 begin
  L[i]:=TListbox.Create(self);
  with L[i] do
    begin
      parent := Form1;
      name := 'L'+IntToStr(i);
      left := 10;
      top := i * 2;
      Width:=Form1.Kalender.DefaultColWidth;
     if x<7 then
      begin
       setRect(Kalender.CellRect(x,y),i);
       inc(x);
      end
     else
      begin
       x:=0;
       inc(y);
       setRect(Kalender.CellRect(x,y),i);
      end;
    end;
 end;

end;

end.
Vielen Dank für Antworten
loirad!!!

hans ditter 28. Okt 2011 12:08

AW: Kalender mit Checkboxen
 
Hey,
ist dir vlt schonmal in den Sinn gekommen, dass man nicht dein ganzes Projekt erstmal durchlesen möchte, um dir zu helfen? ;)
Ach ja, und dann wäre es ja noch hilfreich, wenn du eine ausführliche Problembeschreibung vornehmen würdest. Wieviele Tage willst du darstellen? sollen das nur die Tage eines Monats sein? etc. pp.!

Also, falls du mehr Tage als die eines 31tägigen Monats darstellen willst, dann darf die Schleife nicht auf 1 bis 31 beschränken!

LG; hans ditter

Steku 28. Okt 2011 12:17

AW: Kalender mit Checkboxen
 
Wenn ich mich nicht täusche hast du den gleichen Thread
schon einmal vor kurzem hier eröffnet:

http://www.delphipraxis.net/163864-k...heckboxen.html

Den alten Thread zu pushen hätte genügt um ihn wieder
nach vorne zu holen...

Gruß,
Steku

loirad 28. Okt 2011 12:40

AW: Kalender mit Checkboxen
 
Hallo,

@ hans ditter: Der Fehler müsste in der Prozedur listboxenverteilen liegen.
ich will für den jeweiligen Monat für jeden Tag eine Listbox anlegen.
Ich habe die Schleife nur zu Testzwecken verändert auf 1-31 das eigentliche steht in geschweiften Klammern dahinter!

@ Steku: Ja du hast recht! Wie macht man das mit dem pushen? Wusste ich nicht :oops: ! Hast du eine Idee?

@ all: Ideen gerne willkommen!

Liebe Grüße
loirad

Steku 28. Okt 2011 12:44

AW: Kalender mit Checkboxen
 
Hi,

einfach auf den eigenen Thread antworten, als Text sollte ein: *PUSH* ausreichen.
Bitte aber erst pushen wenn sich nach mindestens 24 Stunden niemand / niemand mehr
auf deinen Thread gemeldet hat.

Danke und Gruß,
Steku

loirad 9. Nov 2011 07:57

AW: Kalender mit Checkboxen
 
*push*

Pullmoll 6. Apr 2015 03:31

AW: Kalender mit Checkboxen
 
Hallo,
ich habe ein ähnliches Problem, ich möchte das man einen oder mehrere Wochentage (Montag, Diensatg, ...) per Checkbox auswählen kann und diese werden dann mit dem heutigen Wochentag vergleicht. Leider stoße ich aber auf das Problem das ich es nicht hin bekomme. (Hatte vor diese dann mit einer Case_Anweisung zu vergleichen)

mein Ansatz:

var
Wochentag: integer;
datum : TDateTime;

begin
datum := date; //Datum von Heute
wochentag := LongDayNames[DayOfWeek(datum)];
Label1_Wochentag.Caption := IntToStr[DayOfWeeek(Datum)];

normal sollte DayOfWeek doch einen Integer Wert zurück geben oder?
andere Lösungsvorschläge ?

himitsu 6. Apr 2015 07:34

AW: Kalender mit Checkboxen
 
Ja, einen Integer, aber einen Lösungsvorschlag kann ich leider nicht geben, da ich garnicht weiß (hat irgendwie keiner verraten), wo eigentlich dein Problem liegt.

Und den Fehler bei
Delphi-Quellcode:
wochentag := LongDayNames[...
hat dir der Compiler bestimmt schon genannt.

hoika 6. Apr 2015 07:54

AW: Kalender mit Checkboxen
 
Hallo,

Ohne, dass ich jetzt Delphi starte

http://www.delphibasics.co.uk/RTL.asp?Name=DayOfWeek

Was ist denn hier falsch?

Außer das eee .


Heiko

Pullmoll 6. Apr 2015 15:07

AW: Kalender mit Checkboxen
 
Hallo,
erstmal Danke für die schnelle Hilfe. Was ich möchte, ist der Integerwert von der funktion DayOfWeek, diese hat aber als Ausgabewert ein Word Datentype, so wie ich es verstanden habe, denn der compiler zeigt mir immer an dieser Stelle:

Label1_Wochentag.Caption := IntToStr[DayOfWeeek(Datum)];

eine Fehlermeldung:
[Fehler] DiitalUhr_u.pas(89): Es gibt keine überladene Version von 'IntToStr', die man mit diesen Argumenten aufrufen kann

ich benutze Delphi 7 Personal von dem Buch Delphi für Kids.

Ich habe vor das man bei meinem Wecker/Uhr die Wochentage an denen der Wecker klingeln soll per Checkboxen aktivieren werden kann und der durch einen Timer der per Button eingeshaltet wird ständig überprüft ob der/einer der Wecktag(e) erreicht ist wenn ja soll er nach der Uhrzeit gucken. Es läuft auch alles so wie ich es will bloß, dass Problem mit den Wochentagen bleibt.

Den Wochentag alleine als ausgeschriebenes Wort hab ich bereits als Information auf meinem Formular.

lbl_wochentag.Caption := ('Heute ist '+wochentag);

Ich hoffe das ich meine Situation etwas genauer beschreiben konnte und das ihr mir vielleicht etwas weiter helfen könnt.:coder2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:28 Uhr.
Seite 1 von 2  1 2      

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