Entwickler-Ecke

Sonstiges (Delphi) - String einem Datum zuweisen


FiceGoesDelphi - Mi 30.05.07 10:29
Titel: String einem Datum zuweisen
Hallo liebe Community,

ich hoffe mein Titel ist einigermaßen aussagekräftig!
Ich habe eine Kundenkartei geschrieben und dort nun einen Kalender (JvMonthCalender) integriert.
Per doppelklick auf ein Datum kommt eine neue Form + Memofeld indem ich dann für dieses Datum eine Info oder sonstiges speichern möchte!
Ich stehe aber total auf dem Schlauch!
Ich kriegs einfach nicht hin ein neues Array zu machen für diese Situation und dessen Inhalt zu speichern und automatisch beim Laden einer *.kdd (Kundendaten) zu laden.
Ich hänge mal alles von dem Programm mit an, weil es doch ein wenig zu viel wäre, alles hier zu posten!
Sollte das "verboten" oder nicht erwünscht sein, bitte ich dieses zu entschuldigen und dann muss ich wohl einen anderen Weg finden! :)
Im Zip Ordner findet ihr den Kompletten SourceCode und eine .Exe Datei!


Christian S. - Mi 30.05.07 11:04
Titel: Re: String einem Datum zuweisen
user profile iconFiceGoesDelphi hat folgendes geschrieben:
Sollte das "verboten" oder nicht erwünscht sein, bitte ich dieses zu entschuldigen und dann muss ich wohl einen anderen Weg finden! :)

Es ist eigentlich unüblich und auch kontraproduktiv, dem Hilfs-Willigen zuzumuten, sich durch ein komplettes Programm zu wühlen. Relevante Quelltext-Teile zu zeigen, ist wesentlich effektiver und zeigt, dass man auch selber Zeit investiert.


FiceGoesDelphi - Mi 30.05.07 11:11

Ok dann werde ich mal alles zerpflücken und sehen das ich alles relevante finde ;)


Das ist meine Form, in der mein neuer Termin eingetragen werden soll!

Delphi-Quelltext
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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
unit U_NeuenTermin;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, U_Kalender, U_Kundenkartei;

type
  TForm5 = class(TForm)
    Memo_NeuerTermin: TMemo;
    BTN_TerminBestaetigen: TButton;
    procedure BTN_TerminBestaetigenClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form5: TForm5;

implementation

uses JvCalendar;

{$R *.dfm}

procedure TForm5.BTN_TerminBestaetigenClick(Sender: TObject);
var
  i: integer;
begin
  SetLength(Form2.Termine,Length(Form2.Termine)+1);
  Form2.FTerminIndex := Length(Form2.Termine)-1;
  Form2.Termine[i].Termin := Form2.JvMonthCalendar21.DateFirst;
  Form2.Termine[i].Notiz := Memo_NeuerTermin.Text;
  Form1.Aktualisierung;
end;

procedure TForm5.FormActivate(Sender: TObject);
begin
  Memo_NeuerTermin.CleaR;
end;

end.


Das ist die Form wo mein Kalender integriert ist!

Delphi-Quelltext
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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
unit U_Kalender;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, JvExControls, JvCalendar, U_Kundenkartei, Menus;

type
  TTermine = record
    Termin: TDateTime;
    Notiz: String[255];
  end;
  TForm2 = class(TForm)
    JvMonthCalendar21: TJvMonthCalendar2;
    Memo_Termine: TMemo;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    AlleTerminelschen1: TMenuItem;
    Laden1: TMenuItem;
    Speicher1: TMenuItem;
    Beenden1: TMenuItem;
    procedure AlleTerminelschen1Click(Sender: TObject);
    procedure Speicher1Click(Sender: TObject);
    procedure Laden1Click(Sender: TObject);
    procedure JvMonthCalendar21Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure JvMonthCalendar21DblClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Termine: Array of TTermine;
    i: Integer;
    fTerminIndex: Integer;
  end;

var
  Form2: TForm2;

implementation
uses U_NeuenTermin;
{$R *.dfm}



procedure TForm2.AlleTerminelschen1Click(Sender: TObject);
begin
  SetLength(Termine,0);
end;

procedure TForm2.FormActivate(Sender: TObject);
begin
  Memo_Termine.Clear;
  JvMonthCalendar21.Today := Date;
end;


procedure TForm2.JvMonthCalendar21Click(Sender: TObject);
var
  i: Integer;
  Year, Day, Month: Word;
  Reinigung1: String;
begin
  Form1.Aktualisierung;
  DecodeDate(JvMonthCalendar21.DateFirst,Year,Month,Day);
  if JvMonthCalendar21.Bold[Year,Month,Day] = True then
  begin
    Memo_Termine.Clear;
    if Date > JvMonthCalendar21.DateFirst then
      for I := 0 to Length(Form1.Kunden) -1 do
        if (Form1.Kunden[i].Reinigung = JvMonthCalendar21.DateFirst) or (Form1.Kunden[i].NaechsteReinigung = JvMonthCalendar21.DateFirst) then
          Memo_Termine.Lines.Add('Letze Reinigung bei ' + (Form1.Kunden[i].Kunde) + ' war am: ' + DateToStr(JVMonthCalendar21.Datefirst));
    if Date < JvMonthCalendar21.DateFirst then
      for I := 0 to Length(Form1.Kunden) -1 do
        if (Form1.Kunden[i].Reinigung = JvMonthCalendar21.DateFirst) or (Form1.Kunden[i].NaechsteReinigung = JvMonthCalendar21.DateFirst) then
          Memo_Termine.Lines.Add('Die nächste Reinigung bei ' + (Form1.Kunden[i].Kunde) + ' ist am: ' + DateToStr(JVMonthCalendar21.Datefirst));
    if Date = JvMonthCalendar21.DateFirst then
      for I := 0 to Length(Form1.Kunden) -1 do
        if (Form1.Kunden[i].Reinigung = JvMonthCalendar21.DateFirst) or (Form1.Kunden[i].NaechsteReinigung = JvMonthCalendar21.DateFirst) then
          Memo_Termine.Lines.Add('Heute ist die nächste Reinigung bei: ' + (Form1.Kunden[i].Kunde));
  end
  else
  begin
    Memo_Termine.Clear;
    if Date = JvMonthCalendar21.DateFirst then
      Memo_Termine.Lines.Add('Heute ist kein Termin eingetragen.')
    else
      Memo_Termine.Lines.Add('Am ' + DateToStr(JVMonthCalendar21.DateFirst) + ' ist kein Termin eingetragen');
  end;
  //Memo_Termine.Lines.Add(Termine[i].Notiz)
end;

procedure TForm2.JvMonthCalendar21DblClick(Sender: TObject);
begin
  //Termine[i].Termin := JvMonthCalendar21.DateFirst;
  Form5.ShowModal
end;

procedure TForm2.Laden1Click(Sender: TObject);
var
  DateiAdressen: File of TTermine;
  i: integer;
begin
  if OpenDialog1.Execute then
  begin
    try
      AssignFile(DateiAdressen,OpenDialog1.FileName);
      Reset(DateiAdressen);
      SetLength(Termine,0);
      while not Eof(Dateiadressen) do
      begin
        SetLength(Termine,Length(Termine)+1);
        Read(DateiAdressen,Termine[Length(Termine)-1]);
      end;
      CloseFile(DateiAdressen);
    except
     begin
      messagebox(application.handle, 'Datei nicht gefunden''Fehler', MB_IconERROR);
      exit;
     end;
    end;
    Form1.aktualisierung;
  end;
end;

procedure TForm2.Speicher1Click(Sender: TObject);
var
  DateiAdressen: File of TTermine;
  i: integer;
  MyFileExt: String;
begin
  if SaveDialog1.Execute then
  begin
    try
      if (ExtractFileExt(SaveDialog1.FileName) = ''OR (UpperCase(ExtractFileExt(SaveDialog1.FileName)) <> '.KDD')then
        SaveDialog1.FileName := SaveDialog1.FileName +'.kdd';
      AssignFile(DateiAdressen,SaveDialog1.FileName);
      ReWrite(DateiAdressen);
    for I := 0 to Length(Termine) -1 do
      Write(DateiAdressen,Termine[i]);
    finally
      CloseFile(DateiAdressen);
    end;
  end;
end;

end.


Die "funktionen" aus meiner MainForm sind:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Aktualisierung;
var
  i: integer;
  Year, Month, Day: Word;
begin
 LB_Kundenliste.Clear;
 for I := 0 to Length(Kunden) -1 do
 begin
   LB_Kundenliste.Items.Add(InttoStr(i+1) + ':  ' + Kunden[i].Kunde);
   DecodeDate(Kunden[i].NaechsteReinigung,Year,Month,Day);
   Form2.JvMonthCalendar21.Bold[Year,Month,Day] := True;
   DecodeDate(Kunden[i].Reinigung,Year,Month,Day);
   Form2.JvMonthCalendar21.Bold[Year,Month,Day] := True;
 end;
end;


Und so habe ich mein Record auf Form1 deklariert:


Delphi-Quelltext
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:
type
  TAdressen = Record
    Name: String[50];
    Vorname: String[50];
    Strasse: String[50];
    Hausnummer: String[10];
    Postleitzahl: String[10];
    Ort: String[50];
    Email: String[50];
    Mobil: String[50];
    Telefon: String[50];
  end;
  TKundenkartei = Record
    Kunde: String[50];
    Adresse: TAdressen;
    Preis: String[20];
    Bemerkung: String[100];
    Reinigung: TDateTime;
    NaechsteReinigung: TDateTime;
    GesamtPreis: String[20];
  end;



 public
    { Public-Deklarationen }
    KundeTemp: TKundenKartei;
    fKundenIndex : Integer;
    Kunden : Array of TKundenkartei;



Mein Problem ist nun, wie schon oben beschrieben, dass ich es nicht schaffe einem Datum einen oder auch mehrere Termine zuzuweisen. Desweiteren werden die Kundendaten in einer Datei gespeichert und die Termine in dem Kalender sind dementsprechend auch davon abhängig welche Kundendatei geladen wurde. Somit müssen die auch aneinander hängen.
Ich stehe total auf dem Schlauch und kriegs nicht hin.. ich komme nicht weiter! :(


@[quote] Christian S. : Hoffe so ists besser. ;)


ZeitGeist87 - Mi 30.05.07 11:12
Titel: Re: String einem Datum zuweisen
user profile iconChristian S. hat folgendes geschrieben:
user profile iconFiceGoesDelphi hat folgendes geschrieben:
Sollte das "verboten" oder nicht erwünscht sein, bitte ich dieses zu entschuldigen und dann muss ich wohl einen anderen Weg finden! :)

Es ist eigentlich unüblich und auch kontraproduktiv, dem Hilfs-Willigen zuzumuten, sich durch ein komplettes Programm zu wühlen. Relevante Quelltext-Teile zu zeigen, ist wesentlich effektiver und zeigt, dass man auch selber Zeit investiert.


Hallo!

Da muss ich Björn mal in Schutz nehmen.
Das Problem hat er in einem anderen Thread schon geschildert, was hier fehlt ist eventuell der Verweis auf diesen.

@Björn: Ich hab leider die Komponente nicht, sonst würd ich mir deinen Code anschauen. So kann ich das nur heut abend zu Hause erledigen.

LG
Stefan


FiceGoesDelphi - Mi 30.05.07 11:46

Danke @ Stefan!
Ich kann mich gedulden ;)
Ich hänge da ja schon ein bisschen länger! Mach dir bitte keinen Druck und wenn du mal 1-2 Minuten Zeit hast (Mehr wirst du wahrscheinlich garnicht inverstieren müssen, bis du es raus hast *gg*) dann kannst du ja mal kurz schauen!


ZeitGeist87 - Mi 30.05.07 11:59

user profile iconFiceGoesDelphi hat folgendes geschrieben:
Danke @ Stefan!
Ich kann mich gedulden ;)
Ich hänge da ja schon ein bisschen länger! Mach dir bitte keinen Druck und wenn du mal 1-2 Minuten Zeit hast (Mehr wirst du wahrscheinlich garnicht inverstieren müssen, bis du es raus hast *gg*) dann kannst du ja mal kurz schauen!


Björn..das wäre ein guter Zeitpunkt, um sich mit Datenbanken zu befassen :)

LG
Stefan


FiceGoesDelphi - Mi 30.05.07 12:06

Eben ist mein 1. Programm für die Bank in den Testumlauf gegangen!
Dort wird eine Textdatei in DB2 Importiert :roll:
Naja ich lerne ja nie aus!
Und noch habe ich keinerlei AusbildunG! Plz nicht vergessen :)


ZeitGeist87 - Mi 30.05.07 12:57

Meine Idee

Hoffe du kannst damit was anfangen!

Ich geh jetzt Mittagessen.
Ich erklärs später :)

LG
Stefan


FiceGoesDelphi - Mi 30.05.07 13:02

Vom Prinzip her, habe ich es verstanden!
Ein paar kleine Detail-Fragen sind noch da ;) Keine sorge :D
Guten Hunger und bis nachher :)

Ein Kollege hat gerade ein tolles Wort in den Raum geworfen ...

"Streams"

Stefan was meinst du?! Wäre das eine machbare (für mich/uns :P ^^) Lösung?


ZeitGeist87 - Mi 30.05.07 13:46

user profile iconFiceGoesDelphi hat folgendes geschrieben:
Vom Prinzip her, habe ich es verstanden!
Ein paar kleine Detail-Fragen sind noch da ;) Keine sorge :D
Guten Hunger und bis nachher :)

Ein Kollege hat gerade ein tolles Wort in den Raum geworfen ...

"Streams"

Stefan was meinst du?! Wäre das eine machbare (für mich/uns :P ^^) Lösung?


Bringen bei dem was du vorhast nicht wirklich viel.


ZeitGeist87 - Mi 30.05.07 13:58

1) Du hast verschiedene Kundenkarteien.
Jede Kartei bekommt eine eindeutige ID.

2) Du hast viele Kunden.
Jeder Kunde bekommt eine eindeutige ID.

3) Jede Kundenkartei beinhaltet unterschiedliche Kunden.
Die Zuordnung erfolgt über die Kundenzuordnung (Aufbau entspricht INI).

4) Du hast Termine zu unterschiedlichen Zeitpunkten (Datum).
Jedes Datum (Zeitpunkt) hat seine eigene Datei (Aufbau entspricht INI).
Zuordnung erfolgt über die Datei Termine.
Termine verweist über Datum.Pfad auf die Datei, in welcher die Termine für
das jeweilige Datum spezifiziert sind.
Die Datumsdateien enthalten die KundenID sowie eine Beschreibung des Termins (KundenID = Beschreibung des Termins).

Über die KundenID kannst du also problemlos in deiner Kundenzuordnung nach der zu ladenen Kundenkartei suchen und diese ggf. laden.


Mit diesem System hast du folgende Möglichkeiten:

- Eindeutige Datenhaltung
- Zuordnung über eine unique Nummer (KundenID)
- Ein Termin/Datum kann für n Kunden verwendet werden
- Du kannst alle Termine suchen, die für einen Kunden reserviert sind/waren/wurden und die Ereignisse abrufen
- ...

Da du keine Datenbank zur Verfügung hast, würde ich es so lösen.

Die Dateien, die die Termine enthalten, kannst du zum Beispiel in Extra-Ordner nach dem System \Programmverzeichnis\Jahr\Monat\ legen.

Falls du noch Fragen hast -> frag.

LG
Stefan