![]() |
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:
Kann sich das jemand erklären oder mir Hilfsversuche geben?
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; Ich bin langsam am :wall:. |
AW: TSave Dialog Exception
Hallo,
lass mal das
Delphi-Quellcode:
weg!
Programm.SpeicherDialog.Free;
|
AW: TSave Dialog Exception
Nicht echt -.- :wall:
Zitat:
|
AW: TSave Dialog Exception
Zitat:
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 ... |
AW: TSave Dialog Exception
Er wird beim Programmstart erstellt, also muss ich ihn bei Programmende freigeben.
Danke. |
AW: TSave Dialog Exception
Irgendie hast du das mit dem
Delphi-Quellcode:
wohl noch nicht verstanden :)
try .. finally
Delphi-Quellcode:
Dein Konstrukt
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;
Delphi-Quellcode:
ist völlig unsinnig ... auch wenn ein Fehler auftritt, dann soll der Rückgabewert True sein?
function Speichern_mit_Dialog : boolean;
var Speicher_Pfad : string; Ordner_Pfad : string; Datei_Name : string; begin try ... finally Result := True; end; ... end; Ok, dann reicht das völlig aus (fragt sich nur wozu dann eine Funktion
Delphi-Quellcode:
Und GAAAAANZ wichtig so bitte nie niemals nicht
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;
Delphi-Quellcode:
Das reicht aus und funktioniert immer
if Programm.SpeicherDialog.Execute = True then
if Speichern(Speicher_Pfad) = True then
Delphi-Quellcode:
if Programm.SpeicherDialog.Execute then
if Speichern(Speicher_Pfad) then |
AW: TSave Dialog Exception
Zitat:
Zitat:
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? |
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" ? |
AW: TSave Dialog Exception
Er meinte wahrscheinlich, wieso das eine Funktion ist, wenn sie sowieso immer true zurückgibt.
|
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 |
AW: TSave Dialog Exception
Delphi-Quellcode:
Wobei es natürlich besser wäre, die Exception dann auch auszuwerten, um zu ermitteln, wieso es schiefgegangen ist.
Result := true;
try MachIrgendwas; except Result := false; end; |
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; |
AW: TSave Dialog Exception
Okay, danke für die beiden Vorschläge, ich schau mal was besser passt.
EDIT: Alles klar, so gehts. Danke. |
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.
|
AW: TSave Dialog Exception
Delphi-Quellcode:
function Speichern : Boolean;
begin Result := MeinSaveDialog.Execute; if Result then begin ... // speichern end; end; |
AW: TSave Dialog Exception
Nur das korrekte Ausführen, des Dialoges ist kein Garant, dass auch alles geklappt hat beim Speichern.
|
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. |
AW: TSave Dialog Exception
Zitat:
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... |
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