Zitat von
stephan3309:
Ich bekomme ... einen Fehler beim Übersetzen, woran könnte das Liegen?
Könnt ihr sonst noch einen Denkfehler entdecken?
Warum erlaubst Du uns nicht, die vom Compiler gemeldeten Fehler zu lesen? So müssen wir raten...
Allerdings sind diverse Fehler offensichtlich. Ich sehe folgende Problemstellen oder Fehler:
Delphi-Quellcode:
function TForm1.Backup: Boolean;
// ...
procedure Backup_DB;
Backup ist Bestandteil der Klasse TForm1, Backup_DB ist eine (globale?) Prozedur; es bietet sich aber wohl an, beides in derselben Klasse zu deklarieren und zu implementieren - es sei denn, Du willst beides unabhängig voneinander benutzen.
if TForm1.Backup.Result := 1 then begin
Hier gibt es folgende Fehler:
1. Du greifst auf TForm1, d.h. auf eine Klasse zu; Du würdest aber eine Instanz - z.B. Form1 - benötigen.
2. Backup ist eine Funktion vom Typ Boolean. Form1.Backup repräsentiert also bereits einen der Werte true/false.
3. Result kann nur als lokale Variable innerhalb einer Funktion verwendet werden; es ist aber kein Bestandteil einer Klasse TForm1.Backup (das wäre auch ein Widerspruch zur Deklaration als Funktion, also Quatsch).
4. Mit Result := 1 weist Du der (nicht existenten) Eigenschaft Result den numerischen Wert 1 zu.
Da muss der Compiler doch durcheinander kommen.
In der Folge gäbe es weitere gleichartige Probleme:
Delphi-Quellcode:
var clear_DB:Boolean ;
// ...
if
// ...
clear_DB := 1;
end;
// ...
if clear_DB := 1 then begin
clear_DB := 0;
end;
end;
Bitte nimm Einrückungen vollständig, d.h. auch innerhalb von if...begin/end vor; dann sollten Dir Fehler selbst auffallen:
1. clear_DB ist als Boolean deklariert, bekommt aber numerische Werte zugewiesen.
2. if clear_DB := 1 ist eine Zuweisung einer Zahl, soll aber ein bool-Vergleich sein.
3. Bei der zweiten if-Abfrage ist nicht sichergestellt, dass clear_DB überhaupt einen Wert hat: Es bekommt weder vor der ersten if-Abfrage noch innerhalb eines else-Zweiges einen Wert zugewiesen.
4. Am Ende bekommt clear_DB noch den Wert 0, mit dem Du aber nichts mehr machst. Wozu?
Ich vermute, dass Du Folgendes erreichen willst:
Delphi-Quellcode:
function TForm1.Neuer_Monat: Boolean;
var Year, Month, Day: Word;
Vergleich: TDateTime;
begin
// bei dieser Variante könnte man auf die Variable Vergleich verzichten
// und DecodeDate(Now...) schreiben; aber zur Vergleichbarkeit lassen wir das
Vergleich := Now;
DecodeDate(Vergleich, Year, Month, Day);
// Rückgabe: Day = 1 => Neuer_Monat ja
// Rückgabe: Day <> 1 => Neuer_Monat nein
Result := Day = 1;
end;
// geändert in Funktion innerhalb des Formulars:
// Rückgabe: Kopie erledigt und bearbeitet ja/nein
function TForm1.Backup_DB: Boolean;
var sDateiname:
string;
begin
// Result bezieht sich auf die aktuelle Funktion;
// Vorgabe: es wurde keine Kopie erstellt
Result := false;
// Neuer_Monat ist der Rückgabewert der o.g. Funktion!!!
if Neuer_Monat
then
begin
// Versuch einer Kopie mit Fehlerprüfung
try
// der Dateiname könnte noch schöner erzeugt werden und benötigt
// bei einmaliger Verwendung keine Variable
sDateiname := '
c:\test\backup\daten' + datetostr(now) + '
.mdb';
copyFileTo('
c:\test\db\daten.mdb' , sDateiname );
// wenn kopiert werden konnte
Result := true;
except
// wenn nicht kopiert werden konnte: Fehlermeldung
on e:
exception
do ShowMessage(e.
Message);
// Result steht weiterhin auf false
end;
end;
// wenn kopiert werden konnte, dann DB anpassen
if Result
then
begin
try
// mit Fehlerprüfung
DataModule6.ADOTable1.Close;
DataModule6.ADOTable1.Open;
DataModule6.ADOCommand1.Execute;
DataModule6.ADOTable1.Close;
DataModule6.ADOTable1.Open;
except
// wenn DB nicht bearbeitet werden konnte: Fehlermeldung
on e:
exception
do ShowMessage(e.
Message);
// Result muss jetzt auf false gesetzt werden
Result := false;
end;
end;
end;
Zur Verbesserung könnte man die zweite Funktion noch danach unterscheiden, ob überhaupt nicht kopiert werden sollte (Day <> 1) oder ob nicht kopiert werden konnte oder ob die
DB nicht überarbeitet werden konnte. Außerdem kann die erste Funktion lokal in die zweite eingebaut werden (da schreien dann andere User wieder auf - bitte keine neue Diskussion darüber); und je nach Fehlermeldung kannst Du unterschiedlich reagieren.
Aber das solltest Du Dir alles später überlegen. Jürgen