Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:05 Uhr.
Seite 1 von 2  1 2      

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