![]() |
AW: Kalender programmieren?
Es ist deutlich und höflich gesagt worden:
Poste den Code, der nicht funktioniert und man könnte Dir helfen. Aber 3 Wochen Gedanken machen Deinerseits ergibt auch hier keine Anhaltspunkte für eine Unterstützung. Dieses Forum quillt über von Code und Tips, wahrscheinlich würde allein eine gründliche Suche helfen. Die Tränendrüsennummer ist sicher eher kontraproduktiv, also krempel mal die Ärmel hoch und werd mal konkret. Was die Rechtschreibung angeht: Natürlich musst Du Dir das nicht annehmen, aber jeder hier hat da so seine Schmerzgrenze und damit musst Du wohl klar kommen (nicht nur hier). Wenn Du klug bist (du machst ja grad Abi), nimm es als Herausforderung! Das hat was mit Wertschätzung, Respekt und anderen Dingen zu tun. Hast Du die Zahl im Portal mal gesehen? Über eine Millionen Beiträge. Sagen wir die Hälfte sind Fragen, die andere Hälfte Antworten. Nicht schlecht oder? Tja und wir sind hier nicht bei FB oder so. Das sind keine Likes! Das sind fundierte Antworten, wenige Leute, die hier viel Zeit reinstecken. Ok, wahrscheinlich verdrehst Du schon die Augen, falls Du soweit gelesen hast. Was Du draus machst, ist allein Deine Sache. |
AW: Kalender programmieren?
Zitat:
Nehmen wir mal an, ihr möchtet die Ansicht (für Juni 2013) wie folgt haben
Code:
Gesucht wird also das Datum, was als erstes angezeigt werden soll (hier 27.05.2013).
Mo Di Mi Do Fr Sa So
27 28 29 30 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 4 5 6 7
Delphi-Quellcode:
Wenn man jetzt das Grid Zelle für Zelle durchläuft - in der Reihenfolge der Datumsfolge - dann braucht man nur noch das Datum um 1 Tag erhöhen und hat immer das passende Datum zu der Zelle
function GetMonthCalenderStartDate( AMonth, AYear : Word ) : TDate;
begin // Erster Tag im Monat Result := EncodeDate( AYear, AMonth, 1 ); // Montag vor dem Datum ermitteln => Starttag für die Kalender-Ansicht Result := Result - ( DayOfTheWeek( Result ) - 1 ); end;
Delphi-Quellcode:
BTW:
procedure ShowMonthGrid( AGrid : TStringGrid; AMonth, AYear : Word );
var LRow, LCol : Integer; LDate : TDate; begin LDate := GetMonthCalenderStartDate( AMonth, AYear ); // 7 Spalten AGrid.ColCount := 7; // 7 Zeilen (1x Überschrift, 6x Daten) AGrid.RowCount := 7; // 1 Zeile fixiert (wird von oben gezählt) AGrid.FixedRows := 1; // in der ersten Zeile stehen die Tagesnamen for LCol := 0 to 6 do AGrid.Cells[LCol,0] := FormatDateTime( 'ddd', LDate + LCol ); // Jetzt das eigentliche Kalenderblatt füllen for LRow := 1 to 6 do for LCol := 0 to 6 do begin // in die Zelle nur den Monatstag schreiben AGrid.Cells[LCol,LRow] := FormatDateTime( 'dd', LDate ); // 1 Tag weiter LDate := LDate + 1; end; end; ![]() PS: Bevor die Frage aufkommt, warum ich 6 Zeilen benutze, dann dieses Blatt mal für Dezember 2013 ausfüllen ;) |
AW: Kalender programmieren?
Zitat:
Welche Ansätze haben sich denn als Sackgassen erwiesen? Neben der sehr rudimentär beschriebenen Oberfläche, habt Ihr schon eine Vorstellung davon wie Ihr die Daten speichern wollt? Welche Möglichkeiten habt Ihr überhaupt? Soll der Kalender nur von einer Person oder von mehreren genutzt werden? [OT] Zitat:
Übrigens kann man mangelndes Talent in gewissen Grenzen durch Arbeit ausgleichen. [/OT] Gruß K-H |
AW: Kalender programmieren?
1. Die Zusammenfassung was JummiJa möchte; hat der schöne Günther schon geschrieben, daher denke ich einige lesen nur Bruchteile dieses Threads und sollten mal den ganzen lesen.
Zitat:
Delphi-Quellcode:
und
Date
Delphi-Quellcode:
auslesen.
DecodeDate(Date, Y, M, D);
3. Ich nehme nicht an das JummiJa solche Scheduller/Planner benötigt, da sie eher ein solches Tool entwickeln wollen. Mit Grüßen, Targetingsnake |
Praxis Terminplaner
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo erstmal und gleich sorry das ich dieses Thema hier nochmal aufwärme.
Aber es war irgendwie erstaunlich zu lesen. Ich selbst hatte zu der Zeit als der erste Post gemacht wurde, angefangen mir das programmieren mit Lazarus beizubringen. Gleich das zweite Projekt sollte für eine Praxis ein Terminplaner werden. Ich muss zugeben ich stand da anfangs auch vor lauter Rätseln. Nach ca 7 Wochen hatte ich dann eine erste halbwegs funktionierende Software. Die Datenspeicherung erfolgte damals noch in einer DBF. Das Programm wird immer noch weiter entwickelt und hat mitlerweile Funktionen wie: Tag/Wochenansicht, Multiterminvergabe, Mitarbeitermanagment, Arbeitzseiten, Online-Termine und jede menge mehr. Die Datenbank ist auch recht schnell auf SQL gewechselt, da jeder Mitarbeiter mit seinem Laptop Termine vergeben will/kann. Nichts desto trotz stosse ich nun langsam an Grenzen und ich muss den Terminplaner nocheinmal von Grund an neuschreiben. Dabei würde ich natürlich einige sachen verbessern. @Perlsau Das Bild von deinem Terminkalender gefällt mir sehr gut. Was für eine Komponente hast du für die Darstellung genommen. Was nutz du als Datenspeicherung? (SQL?) Würde sich ein VirtualStringTree anbieten für die Darstellung? (bin erst vor kurzem auf diese Komponente gestossen und experimentiere da noch ein bisschen) Anders als der Thema-Verfasser habe ich schon ein wenig Ahnung vom programmieren (von gut sicher noch etwas entfernt). Würde mich also freuen wenn ihr für mich ein paar Anregungen hättet, Kritik vertrage ich bestens. Rechtschreibung... ich versuchs. Ich habe auch mal ein Bild angehängt, welches ich aber sehr "beschneiden" musste (Datenschutz und so). Man sieht aber das StringGrid recht gut. Spalten einfärben ist kein Problem. Die Felder welche ein "N:" oder "I:" oder "P:" haben werden anders eingefärbt. Ich nutze dazu eben diese "zwei Zeichen(der buchstabe und der doppelpunkt)" um die Celle im onDrawEvent zu identifizieren - gibt es da noch eine andere Möglichkeit? hubble |
AW: Praxis Terminplaner
Zitat:
Code:
Allerdings ist mein Konzept nicht wirklich ausgereift, genügt aber meinen Ansprüchen bzw. denen eines gemeinnützigen Vereins, für den ich das vor bald drei Jahren zu entwickeln begonnen hatte. Heute würde ich vieles anders angehen.
CREATE TABLE TERMINE (
IDX_TERMINE BIGINT NOT NULL, BENUTZER INTEGER DEFAULT 0 NOT NULL, DATUM_START DATE, ZEIT_START TIME, DATUM_ENDE DATE, ZEIT_ENDE TIME, BESCHREIBUNG VARCHAR(200) DEFAULT '' NOT NULL COLLATE UNICODE, ERLEDIGT INTBOOLEAN DEFAULT 0 /* INTBOOLEAN = INTEGER DEFAULT 0 NOT NULL CHECK (VALUE IN (0,1)) */, ALARMEIN INTBOOLEAN DEFAULT 1 /* INTBOOLEAN = INTEGER DEFAULT 0 NOT NULL CHECK (VALUE IN (0,1)) */, ANLEGER INTEGER DEFAULT 0 NOT NULL, DATUM TIMESTAMP, DAUER TIME); Zitat:
|
AW: Praxis Terminplaner
Zitat:
Du hast in einer Zelle das Datum und weitere Uhrzeiten, hast du da Zellen miteinander verbunden oder wie kann man mehrere zeilen in einer Zelle darstellen... und wenn ja kannn man dann jede Uhrzeit separat anklicken(weitere Termininfos)? Zitat:
Was deine Firebird-Datenbank angeht, kann ich mir das so ähnlich wie bei SQL vorstellen (Server mit SQL und dann halt SQL befehle)? Was genau ist die IBDac Komponente(wird wohl nur bei Delphi dabei sein)? Wenn ich jetzt meine fast 2 jahre alten SQL-Tabellen anschaue kommt mir das Grauen. Zitat:
Jetzt ist es doch aber so das diese onDrawCell-procedure andauernd aufgerufen wird(habe da mal zum test ein SpinEdit benutzt, SpinEdit.Value:=SpinEdit.Value+1, und nach nicht mal zwei Minute stand der zähler schon bei einer Million). Von daher ist es nicht gut wenn der SQL-Server so oft befeuert wird. (Der SQL-Server ist ein rechner im netzwerk auf den 6 andere rechner zugreifen) Ich habe mir überlegt die Daten eines Tages aus der DB auszulesen und das nötigste zwischen zuspeichern, in einem array oder record, worauf eben die onDrawCell-procedure schnell zugreifen kann. |
AW: Praxis Terminplaner
Zitat:
Die mehrzeilige Darstellung hatte ich damals so erreicht, daß erstens RowHeight entsprechend vergrößert wurde und zweitens der AusgabeString (z.B. StringGrid.Cells[4,3]) aus den entsprechenden Strings, die den Termin enthielten, zusammengesetzt wurde, wobei jeder Einzelstring durch ein Chr(13) begrenzt wurde. Soweit ich mich noch erinnere, war ich damals gerade an diesem Projekt dran und habe später dieses Konzept aufgegeben. Inzwischen befindet sich unterhalb des Wochendarstellungs-StringGrids ein zweites Stringgrid mit den Terminen des gewählten Tages. Bei der Monats- und der Jahresübersicht habe ich darauf verzichtet, Einzeltermine darzustellen, sondern lediglich die Tage, an denen Termine stattfinden, gekennzeichnet. Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Code:
Oder als als Eintrag im Property Filter: DATUM >= '11.01.2016' and DATUM <= '17.01.2016', wobei die Filtered-Eigenschaft auf True stehen muß. Ich habe hier die zweite Möglichkeit gewählt, da ich die Where-Klausel im Select-Befehl des Queries bereits dafür verwende, nur die Termine des aktuellen Benutzers auszuwählen.
select * from TERMINE where DATUM >= '11.01.2016' and DATUM <= '17.01.2016';
Zitat:
Wenn dort, wo dein Programm zum Einsatz kommt, bereits ein SQL-Server existiert (gemeint ist wohl Microsoft SQL-Server), wäre es natürlich unsinnig, das jetzt mit Firebird lösen zu wollen. Hier wählst du natürlich das DBMS (Datenbankmanagementsystem), das dein Kunde bereits verwendet. Neben der tabellenförmigen sind übrigens noch weitere Darstellungsalternativen vorstellbar, so z.B. die grafische, die einfach einen Tag oder eine Woche in Balken darstellt, wobei Termine am selben Tag z.B. hintereinander liegen. Wichtig bei Mehrbenutzersystemen ist auch, die Benutzer- und Rechteverwaltung entsprechend zu programmieren, so daß z.B. klar definiert werden kann, wer für wen Termine anlegen darf und wer alle oder nur seine eigenen Termine sehen kann usw. Zitat:
Bei meinen Datenbank-Anwendungen wird restlos alles in der Datenbank gespeichert, auch individuelle Benutzereinstellungen wie Spaltenbreiten, Farben und Fenstergrößen und -positionen. Einzig die Art des Datenbank-Zugriffs – ob Embedded-DB, lokaler DB-Server oder Remote-Zugriff – wird entweder mit zwei drei Aufruf-Parametern geregelt oder über eine Ini-Datei. |
AW: Praxis Terminplaner
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Denke aber auch das ich dabei bleiben werde, eine Zelle -> ein Termin. Zitat:
Zitat:
Ich weis aber das mein damaliger SpE-Test ohne das ich in dem Programm etwas angeklickt hatte erhöht hat. Vielleicht liegt es ja an der Lazarus version wo das früher mal nicht so war. Dennoch: bei meinem Terminplaner(habe das SpE da mal schnell reinprogrammiert) wenn man etwas anklickt ist man ganz schnell bei mehreren tausenden aufrufen von onDrawCell und da jedes mal die Datenbank abfragen... mmh, macht mir irgendwie Bauchschmerzen. (und ja es wird sehr viel in dem Terminplaner rumgeklickt) Zitat:
Zitat:
Zitat:
|
AW: Kalender programmieren?
Nur mal so aus Neugier. Da ja mehrere Benutzer den Kalender gleichzeitig nutzen sollen, wie hast du das mit der Aktualisierung geregelt? Wenn Nutzer A für Dienstag 9 Uhr einen Termin anlegt, wann taucht das bei Nutzer B auf dem Schirm auf?
Zur Datenhaltung werden dir viele hier empfehlen diese (wie du das planst) in einer geeigneten Struktur vorzuhalten, das ist auf jeden Fall sinnvoll. Das StringGrid oder der VST sollte dann nur der Anzeige dienen. Du kannst dabei schon die Query zur Datenhaltung verwenden, wenn du sie nicht nur lokal in deiner "FülleMeinStringGrid" Prozedur verwendest, sondern als globales Elemet auf der Form (oder DataModul) hast. Oder du verwendest das Lazarus-Äquivalent eines TClientDatasets. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 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