Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi TSave Dialog Exception (https://www.delphipraxis.net/160456-tsave-dialog-exception.html)

Dunkelbunt27 13. Mai 2011 19:46

TSave Dialog Exception
 
Hallo Delphi-PRAXIS,

ich speichere bei meinem Programm die Daten mit einen Speicher-Dialog.
Beim ersten mal speichern verläuft alles reibungslos, Dateien und Ordner werden angelegt, ... .
Beim zweitenmal Speichern kommt aber jedesmal folgende Exception:
Code:
Erste Gelegenheit für Exception bei $7737B727. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 00406934 in Modul Projekt.exe Lesen von Adresse 0000007C'. Prozess Projekt.exe (3040)

Delphi-Quellcode:
function Speichern_mit_Dialog : boolean;
var Speicher_Pfad  : string;
    Ordner_Pfad    : string;
    Datei_Name     : string;
begin
try
  Programm.SpeicherDialog.InitialDir := Dokumente_Pfad;

  if Programm.SpeicherDialog.Execute = True then
    begin
      Datei_Name   := ExtractFileName(Programm.SpeicherDialog.FileName);
      Ordner_Pfad  := Dokumente_Pfad+'\'+ChangeFileExt(Datei_Name,'');
      if not DirectoryExists(Ordner_Pfad) then
            ForceDirectories(Ordner_Pfad);

      Speicher_Pfad      := Ordner_Pfad+'\'+Datei_Name;
      AktuellerDateiName := Speicher_Pfad;
    {***Speichern***}
      if Speichern(Speicher_Pfad) = True then      //Das eigentlich speichern ist unwichtig, es verursacht den Fehler nicht (getestet)
        ShowMessage('Speichern erfolgreich.')
          else
            ShowMessage('Speichern abgebrochen.');
    end;
  finally
    Result := True;
  end;
  Programm.SpeicherDialog.Free;
end;
Kann sich das jemand erklären oder mir Hilfsversuche geben?
Ich bin langsam am :wall:.

Helmi 13. Mai 2011 19:48

AW: TSave Dialog Exception
 
Hallo,

lass mal das
Delphi-Quellcode:
Programm.SpeicherDialog.Free;
weg!

Dunkelbunt27 13. Mai 2011 19:51

AW: TSave Dialog Exception
 
Nicht echt -.- :wall:

Zitat:

lass mal das Programm.SpeicherDialog.Free; weg!
Danke. So geht es. Ist irgendiwie logisch... Dann also erst bei Programmende freigeben, oder nie?

himitsu 13. Mai 2011 20:37

AW: TSave Dialog Exception
 
Zitat:

Zitat von Dunkelbunt27 (Beitrag 1100691)
Dann also erst bei Programmende freigeben, oder nie?

Wie, wann und wo wird der denn erstellt?
Freigegeben wird alles möglichst an der Gegenstelle, wo es auch erzeugt wurde.

> am Anfang einer Prozedur erstellen > spätestens am Ende dieser Prozedur freigeben
> im OnCreate erstellen > im OnDestroy freigeben
> beim Programmstart erstellen > beim Programmende freigeben
...

Dunkelbunt27 13. Mai 2011 22:14

AW: TSave Dialog Exception
 
Er wird beim Programmstart erstellt, also muss ich ihn bei Programmende freigeben.
Danke.

Sir Rufo 13. Mai 2011 22:30

AW: TSave Dialog Exception
 
Irgendie hast du das mit dem
Delphi-Quellcode:
try .. finally
wohl noch nicht verstanden :)
Delphi-Quellcode:
MyObject := TMyObject.Create; // Instanz erzeugen

try // Hier beginnt der Schutzblock

  MyObject.DoSomeThing; // Beliebig viele Sachen durchführen

  // und egal was hier drinnen passiert (z.B. eine Exception)

finally // wird das hier ausgeführt
  MyObject.Free; // Instanz aus dem Speicher entfernen
end;
Dein Konstrukt
Delphi-Quellcode:
function Speichern_mit_Dialog : boolean;
var Speicher_Pfad : string;
    Ordner_Pfad : string;
    Datei_Name : string;
begin

  try

  ...

  finally
    Result := True;
  end;
  ...
end;
ist völlig unsinnig ... auch wenn ein Fehler auftritt, dann soll der Rückgabewert True sein?
Ok, dann reicht das völlig aus (fragt sich nur wozu dann eine Funktion
Delphi-Quellcode:
function Speichern_mit_Dialog : boolean;
var Speicher_Pfad : string;
    Ordner_Pfad : string;
    Datei_Name : string;
begin

  // Kein try mehr

  Result := True; // Result setzen ...

  // Hier jetzt dein Rest-Code

  Programm.SpeicherDialog.InitialDir := Dokumente_Pfad;

  if Programm.SpeicherDialog.Execute = True then
    begin
      Datei_Name := ExtractFileName(Programm.SpeicherDialog.FileName);
      Ordner_Pfad := Dokumente_Pfad+'\'+ChangeFileExt(Datei_Name,'');
      if not DirectoryExists(Ordner_Pfad) then
            ForceDirectories(Ordner_Pfad);

      Speicher_Pfad := Ordner_Pfad+'\'+Datei_Name;
      AktuellerDateiName := Speicher_Pfad;
    {***Speichern***}
      if Speichern(Speicher_Pfad) = True then //Das eigentlich speichern ist unwichtig, es verursacht den Fehler nicht (getestet)
        ShowMessage('Speichern erfolgreich.')
          else
            ShowMessage('Speichern abgebrochen.');
    end;

end;
Und GAAAAANZ wichtig so bitte nie niemals nicht
Delphi-Quellcode:
if Programm.SpeicherDialog.Execute = True then

if Speichern(Speicher_Pfad) = True then
Das reicht aus und funktioniert immer
Delphi-Quellcode:
if Programm.SpeicherDialog.Execute then

if Speichern(Speicher_Pfad) then

Dunkelbunt27 14. Mai 2011 09:23

AW: TSave Dialog Exception
 
Zitat:

fragt sich nur wozu dann eine Funktion
Das ist für die CloseQuery, CanClose := Speichern(Datei).

Zitat:

Irgendie hast du das mit dem try .. finally wohl noch nicht verstanden
Das kommt wohl, wenn mal sich alles selber beibringen muss, weil man in der Schule noch beim Einbinden einer zweiten Unit steckt -.-.

Danke für die ganzen Hinweise, ich verbessere das mal :oops:

Wie kann ich es dann machen, wenn das Speichern aus irgendeinem Grund fehgeschlagen ist, dass dann result auf False gesetzt ist?

himitsu 14. Mai 2011 09:31

AW: TSave Dialog Exception
 
Es ging ihm darum, daß das Result immer true ist, egal was passiert.
(außer es tritt eine Exception auf, da dann das Result eh nicht mehr benötigt wird)
Und ein Result, was eh immer nur das Selbe liefert, ist doch irgendwie "nutzlos" ?

DeddyH 14. Mai 2011 09:32

AW: TSave Dialog Exception
 
Er meinte wahrscheinlich, wieso das eine Funktion ist, wenn sie sowieso immer true zurückgibt.

Dunkelbunt27 14. Mai 2011 09:53

AW: TSave Dialog Exception
 
Ja, ich weiß, dass es so wie es ist sinnlos ist, ich wollte ja bewirken, dass auch mal result = false sein kann...
Also wenn das Speichern klappt, dann result = true
wenn das Speichern nicht klappt, durch z.B. keine Schreibrechte, dann result = false

DeddyH 14. Mai 2011 10:08

AW: TSave Dialog Exception
 
Delphi-Quellcode:
Result := true;
try
  MachIrgendwas;
except
  Result := false;
end;
Wobei es natürlich besser wäre, die Exception dann auch auszuwerten, um zu ermitteln, wieso es schiefgegangen ist.

Sir Rufo 14. Mai 2011 10:14

AW: TSave Dialog Exception
 
Delphi-Quellcode:
function Speichern : Boolean;
begin
  Result := False; // Erst mal den Rückgabewert auf False, wer weiß was alles passieren kann :o)

  if MeinSaveDialog.Execute then // Ich soll also wirklich speichern
    begin
      // Hier kommt jetzt der Block zum Speichern
      ...
      // Wenn dieser Block komplett ohne Fehler abgeschlossen wurde, dann ist die Datei wohl gespeichert
      Result := True;
    end;

end;

Dunkelbunt27 14. Mai 2011 10:16

AW: TSave Dialog Exception
 
Okay, danke für die beiden Vorschläge, ich schau mal was besser passt.

EDIT: Alles klar, so gehts. Danke.

Luckie 14. Mai 2011 11:05

AW: TSave Dialog Exception
 
Visuelle Komponenten und der Timer haben einen Besitzer (Owner). Der Besitzer ist für das Freigeben der Komponente zuständig. Bei visuellen Komponenten ist das dir Form auf der sie liegen. Das heißt, die Form gibt diese Objekte wieder frei. Und dies geschieht automatisch. Du brauchst dich also um, nichts mehr zu kümmern. Das noch mal zur Erklärung.

himitsu 14. Mai 2011 11:55

AW: TSave Dialog Exception
 
Delphi-Quellcode:
function Speichern : Boolean;
begin
  Result := MeinSaveDialog.Execute;
  if Result then
  begin
    ... // speichern
  end;
end;

Luckie 14. Mai 2011 12:00

AW: TSave Dialog Exception
 
Nur das korrekte Ausführen, des Dialoges ist kein Garant, dass auch alles geklappt hat beim Speichern.

himitsu 14. Mai 2011 12:11

AW: TSave Dialog Exception
 
Glaubst du wirklich, daß er beim Speichern die ganzen Rückgabewerte der Speicherfunktionen abfragt?
Wenn doch, dann kann man dort immernoch Result wieder auf False setzen. :angle2:
Und wenn es zu einer Exception kommt, dann ist das Result sowieso egal.

Dunkelbunt27 14. Mai 2011 13:09

AW: TSave Dialog Exception
 
Zitat:

Glaubst du wirklich, daß er beim Speichern die ganzen Rückgabewerte der Speicherfunktionen abfragt?
Da hast du leider recht.

Wie kommt man an die Rückgabewerte ran? Wie wertet man sie aus?
Es ist für mein Programm sehr wichtig, dass keine Speicherfehler passieren.

Darum wäre das sicher hilfreich...

Luckie 14. Mai 2011 15:53

AW: TSave Dialog Exception
 
Guck in die Hilfe, da sollte alles drin stehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 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