AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TSave Dialog Exception

Ein Thema von Dunkelbunt27 · begonnen am 13. Mai 2011 · letzter Beitrag vom 14. Mai 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#1

TSave Dialog Exception

  Alt 13. Mai 2011, 20:46
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 .
FG Dunkelbunt
"Wer zuletzt lacht hat den höchsten Ping"
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#2

AW: TSave Dialog Exception

  Alt 13. Mai 2011, 20:48
Hallo,

lass mal das Programm.SpeicherDialog.Free; weg!
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#3

AW: TSave Dialog Exception

  Alt 13. Mai 2011, 20:51
Nicht echt -.-

Zitat:
lass mal das Programm.SpeicherDialog.Free; weg!
Danke. So geht es. Ist irgendiwie logisch... Dann also erst bei Programmende freigeben, oder nie?
FG Dunkelbunt
"Wer zuletzt lacht hat den höchsten Ping"
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: TSave Dialog Exception

  Alt 13. Mai 2011, 21:37
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
...
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#5

AW: TSave Dialog Exception

  Alt 13. Mai 2011, 23:14
Er wird beim Programmstart erstellt, also muss ich ihn bei Programmende freigeben.
Danke.
FG Dunkelbunt
"Wer zuletzt lacht hat den höchsten Ping"
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: TSave Dialog Exception

  Alt 13. Mai 2011, 23:30
Irgendie hast du das mit dem 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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (13. Mai 2011 um 23:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#7

AW: TSave Dialog Exception

  Alt 14. Mai 2011, 10:23
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

Wie kann ich es dann machen, wenn das Speichern aus irgendeinem Grund fehgeschlagen ist, dass dann result auf False gesetzt ist?
FG Dunkelbunt
"Wer zuletzt lacht hat den höchsten Ping"

Geändert von Dunkelbunt27 (14. Mai 2011 um 10:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: TSave Dialog Exception

  Alt 14. Mai 2011, 10:31
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" ?
$2B or not $2B

Geändert von himitsu (14. Mai 2011 um 10:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#9

AW: TSave Dialog Exception

  Alt 14. Mai 2011, 10:32
Er meinte wahrscheinlich, wieso das eine Funktion ist, wenn sie sowieso immer true zurückgibt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#10

AW: TSave Dialog Exception

  Alt 14. Mai 2011, 10:53
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
FG Dunkelbunt
"Wer zuletzt lacht hat den höchsten Ping"

Geändert von Dunkelbunt27 (14. Mai 2011 um 10:58 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz