![]() |
Hi, So nach langen umerhumtüfteln, hab ich es noch immer nicht ganz geschafft.
Ich weiss nicht, wie ich UpdateCalMark im Privaten Teil deklarieren soll! Ich habe UpdateCalMark : Boolean; Wenn ich das habe, glaube ich, dass dann die Fehlermeldungen, die mit dem letzten Code zusammenhängen, auch weg sind. |
Hallo m-werk,
im zweiten Source Abschnitt meies letzten Postings habe ich ja eine Methode vorgestellt:
Delphi-Quellcode:
Dort erkennst du, dass die Procedure UpdateCalMark eine Methode der Klasse TForm1 ist. Die Deklaration muss demnach lauten:
procedure TForm1.UpdateCalMark;
Delphi-Quellcode:
TForm1 = class(TForm)
... private { Private-Deklarationen } FirstTime : Boolean; [b] procedure UpdateCalMark;[/b] ... public { Public-Deklarationen } end; |
Hi, darauf hätte ich auch selber kommen können. Das kommt davon, wenn man nicht genau nachdenkt, was man tut.
Ich habe jetzt leider ein anderes kleines problem: Ich habe mir die Kalenderkomponenten auf meinen Komponentenordner, wo ich schon andere Komponenten auch drinn habe, hineinkopiert. Dann bin ich auf Komponenten installieren gegangen, und der Kalender wurde hinzugefügt. Dann habe ich den Kalender im Programm so eingebaut, wie du beschrieben hast und das hat auch funktioniert. Wenn ich dann den PC ausschalte, und dann später wieder weitermache, ist zwar der Kalender drinn aber wenn ich das Programm dann starten möchte, kommt die Fehlermeldung: [Fataler Fehler] Arbeitszeit.pas: Datei nicht gefunden: 'Calpnl.dcu' Und der Cursor steht bei:
Code:
Ich muss dann wieder die Kalenderkomponenten neu installieren und dann gehts wieder.
uses
Windows, Messages, SysUtils,.......,Calpnl; Was ist da los? |
Weiters Hab ich noch zu den Eingabe und Übername-Buttons eine Frage:
Ist es nicht so, dass die Daten, die man eingibt automatisch in die DB gespeichert werden. Den Übernamebutton versteh ich ja noch aber Warum gibt es einen Eingabebutton? |
Hallo m-werk,
wenn Delphi das Programm "linked", sucht es nach den DCU (delphi compiled unit) der Bibliotheken, die benötigt werden. Wo überall gesucht wird, kannst du auf der Optionen Seite einstellen: Tools|Umgebungsoptionen... Seite Bibliothek dort hinter Suchpfad die 3 Punkte anklicken und in das untere Editfeld des Dialogs Verzeichnisse den Pfad auswählen, in dem die DCU des Kalenders steht. Dann noch Hinzufügen anklicken und dann noch OK. Dann sollte es funktionieren. |
Hallo m-werk,
der Eingabebutton erzeugt einen neuen Eintrag für das Datum, das im Kalender angewählt ist. Wenn ein Eintrag für dieses Datum bereits existiert, wird dieser ggf. überschrieben:
Delphi-Quellcode:
Damit der Code funktioniert musst du noch einen weiteren Button namens btnCancel hinzufügen, der unter dem Button Übernahme steht und mit "Rückgängig" beschriftet ist. Damit kann der Nutzer die Eingabe abbrechen. Der Code für den Übernahme Button:
procedure TForm1.btnEingabeClick(Sender: TObject);
var pickDate : TDateTime; tag : Integer; begin with cal do begin if qrySelData.Locate('Datum', EncodeDate(year,month,day), []) then if MessageDlg('Eintrag für diesen Tag existiert schon.'#10 +'Soll der Eintrag geändert werden?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then exit else qrySelData.Edit else begin qrySelData.Append; qrySelDataDatum.Value := EncodeDate(year,month,day); end; ActiveControl := dbeStart end; btnPost.Enabled := True; btnCancel.Enabled := True end;
Delphi-Quellcode:
Und für den Abbrechen Button:
procedure TForm1.btnPostClick(Sender: TObject);
begin try qrySelData.Post; btnPost.Enabled := False; btnCancel.Enabled := False; except { Fehlermeldung } end; end;
Delphi-Quellcode:
Dem OnNewRecord Event von qrySelData weist du folgenden Code zu:
procedure TForm1.btnCancelClick(Sender: TObject);
begin qrySelData.Cancel; btnPost.Enabled := False; btnCancel.Enabled := False; end;
Delphi-Quellcode:
Damit wird auch die Personalnummer automatisch gesetzt, denn die kennt der Benutzer ja nicht.
procedure TForm1.qrySelDataNewRecord(DataSet: TDataSet);
begin qrySelDataPersonalNummer.Value := frmLogin.PNr; end; So, das soll es mal für heute sein. |
Hi, das mit dem Kalender funktioniert jetzt.
Ich habe auch die anderen Codes so eingebaut wie du beschrieben hast. Den letzten Code hab ich leider nicht verstanden, was dieser bewirkt. Leider habe ich da ein Problem. 1. Ich kann in die Editfelder nichts eintragen. (Readonly ist auf False) 2. Wenn ich, bevor ich überhaupt was eintrage auf "Eingabe" klicke, kommt folgende Fehlermeldung: qrySelData: Cannot modify a read-only dataset. Ich hab mir alles nochmal angesehen, und konnte keinen Fehler entdecken. Was hats da? Nochwas möchte ich machen beim Login-Form. Wenn der User sein PW eingibt, soll er mit der Enter-Taste zum Hauptmenü kommen. Ich habe schon dem EditFeld "ePasswort" bei Ereignisse den OnClick den Button "Login" zugewiesen aber das geht nicht. |
Hallo m-werk,
zunächst einmal musst du RequestLive bei qrySelData auf True setzen, dann hast du eine editierbare Datenmenge. Dann kannst du nach Betätigung des Eingabe-Schalters auch Werte in die DBEdit Felder schreiben. Das letzte Codestück setzt das Feld Personalnummer bei jedem neu eingefügten Datensatz auf den Wert, den wir uns im Loginformular als die Personalnummer der Person gemerkt haben, die sich gerade eingeloggt hat. Wie gesagt, deine Mitarbeiter kennen ja ihre Personalnummer gar nicht, ist ja auch nicht nötig. Außerdem könnten sie bei manueller Eingabe aus Versehen die falsche Nummer eingeben und so z.B. deine Arbeitszeit eingeben :shock:, und das verhindert dieser Code. |
Hallo m-werk,
nach Eingabe eines neuen Datensatzes soll der Kalender angepasst werden, damit auch für das neue Datum der Tag blau markiert wird:
Delphi-Quellcode:
Wenn der Mitarbeiter einen Tag im Kalender anwählt, soll aus der Datenbank gleich der dazugehörige Datensatz angezeigt werden:
procedure TForm1.qrySelDataAfterPost(DataSet: TDataSet);
begin UpdateCalMark end;
Delphi-Quellcode:
Bevor ein neue Satz endgültig übernommen wird, sind noch ein paar Prüfungen notwendig:
procedure TForm1.calDateChange(Sender: TObject);
begin with cal do begin UpdateCalMark; qrySelData.Locate('Datum', EncodeDate(year,month,day), []) end; end;
Delphi-Quellcode:
So, jetzt hast du bereits das Wichtigste geschafft.
procedure TForm1.qrySelDataBeforePost(DataSet: TDataSet);
var hilf : TDateTime; begin if Trim(qrySelDataStart.AsString) = '' then begin ShowMessage('Ungültige Startzeit'); ActiveControl := dbeStart; Abort end; if Trim(qrySelDataEnde.AsString) = '' then begin ShowMessage('Ungültige Endzeit'); ActiveControl := dbeEnde; Abort end; if qrySelDataStart.Value > qrySelDataEnde.Value then begin hilf := qrySelDataStart.Value; qrySelDataStart.Value := qrySelDataEnde.Value; qrySelDataEnde.Value := hilf end; end; |
Hi, bin erst jetzt dazugekommen, mir den Code genauestens unter die Lupe zu nehmen, da ich zur Zeit wenig Zeit habe.
Folgendes: Ich habe den Code jetzt eingegeben und kann jetzt auch Werte in die Editfelder schreiben. Wenn ich jetzt aber auf irgendein Datum im Kalender klicke kommt folgende Meldung: Key violation Was bedeutet das und was sagt diese Fehlermeldung aus? Weiters: wenn ich einen Wert eingebe, ist nichts blau im Kalender hinterlegt. Im Datumsfeld (DBGrid) steht auch kein Datum drinn. Wenn ich das Programm dann schließe, und wieder öffne, ist der Datensatz auch weg. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 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