Autor Beitrag
Speed
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48

WIN XP
Delphi 2006 Prof.
BeitragVerfasst: Di 29.11.05 14:37 
Hey,

Ja...Ich hab ein Spiel geschrieben, was ich auf ne CD gebrannt hab.
Die Datei für den Highscore wird allerdings in das selbe Verzeichnis gespeichert, wie, wo die *.exe liegt. Beim neuen Highscore kommt dann die Fehlermeldung "Dateizugriff verweigert". Is ja auch klar, kann ja net auf CD schreiben.

Bloß wie kann ich jetzt den Fehler umgehen, dass es einfach dann garnichts macht, wenn der Zugriff verweigert ist. (Auch keine Meldung anzeigen.)
Habs schon mit Try..Except probiert und bei Except einfach nichts rein geschrieben
->ging aber nicht!

Was gibts denn sonst noch für Möglichkeiten???

Greetz Speed
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 29.11.05 15:12 
Moin!

Dann hast du nicht alle Teile des Codes für den Dateizugriff sauber try-geklammert, ganz einfach. :wink: Oder du verwendest Code, der nicht von try-except gefangen werden kann.

Fazit: Ohne Code kann man dir da nicht weiterhelfen. :D

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 29.11.05 15:21 
user profile iconSpeed hat folgendes geschrieben:

Bloß wie kann ich jetzt den Fehler umgehen, dass es einfach dann garnichts macht, wenn der Zugriff verweigert ist. (Auch keine Meldung anzeigen.)

Das musst du doch wissen, du hast doch den Code gechrieben, dass heißt du kannst selber entscheiden, was er bei einem Fehler macht.

Zitat:

Habs schon mit Try..Except probiert und bei Except einfach nichts rein geschrieben
->ging aber nicht!

Nun ja, eine genauere fehlerbeschreibung WAS da nicht gingt wäre sehr hilfreich.

Zitat:

Was gibts denn sonst noch für Möglichkeiten???

Man könnte gucken, ob das Programm von einer CD gestartet wurde und dann die Funktion deaktivieren.


Moderiert von user profile iconChristian S.: Quote-Tag repariert
Speed Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48

WIN XP
Delphi 2006 Prof.
BeitragVerfasst: Di 29.11.05 16:15 
Danke erstmal,

Das mit dem Überprüfen, obs von der CD gestartet wird, hatte ich ich auch schon dran gedacht, bloß da is auch wieder das Problem, wie mach ich das.

So hier ist der Code,... is ne Try...finally, sorry, hattes aber so, wie ichs oben beschrieben hatte auch probiert und ging ne

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  Try                        
    AssignFile(Datei,sFilename);
    Rewrite(Datei);
    For y:=0 to 9 do
      Begin
        Seek(Datei,y);
        Write(Datei,Liste[y]);
      End;
  Finally
     CloseFile(Datei);
  End;
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 29.11.05 18:44 
Guck dir in der Hilfe mal IOResult an.
Speed Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48

WIN XP
Delphi 2006 Prof.
BeitragVerfasst: Mi 30.11.05 11:42 
Danke für den Tip. :tongue:

Habs jetzt so erweitert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
  Try
    AssignFile(Datei,'Score.dat');
    {$I-}
    Rewrite(Datei);
    {$I+}
    If IOResult=0 then
      Begin
        For y:=0 to 9 do
          Begin
            Seek(Datei,y);
            Write(Datei,Liste[y]);
          End;
      End;
  Finally
    CloseFile(Datei);


Funzt aber immer noch nicht so, wie ichs wollte. Jetzt kommt "E/A-Fehler 103". In der OH steht da ja, dass die Datei nicht geöffnet wurde.
Wo muss ich denn das IOResult hinsetzen bzw. die Compiler-Optionen, damit es wenns ne geht einfach nichts macht (raus geht aus Prozedur).
Brueggendiek
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: Do 01.12.05 08:24 
Hallo Speed!

Da sehe ich gleich mehrere Problemstellen:

1. Du hast IOResult und try/finally gemischt - das ist falsch.
Entweder verwendet man IOResult - dann auch beim Seek, Write und CloseFile, oder man verwendet try/finally bzw. try/except.
Nebenbei: das try/finally wirft eine Exception - muß also nochmal mit try/except geklammert sein - oder soll das Programm bei Speicherfehlern mit einer für den Nutzer nichtssagenden Fehlermeldung abstürzen?

2. So wie es da steht (ReWrite), wird die Datei jedesmal neu erstellt. Was soll dann da das Seek? Das Write schreibt fortlaufende Datensätze, beginnend an der aktuellen Position. Die ist nach ReWrite schon auf den Dateianfang gesetzt.

3. verwendest Du in Deinem letzten Codeschnipsel relative Dateinamen. Das kann klappen, kann aber auch gewaltig in die Hose gehen. Ein OpenDialog oder ein "Programm ausführen in" in einer Desktop- oder Startmenüverknüpfung reicht, um die Datei sonstwohin zu schreiben. Schreibe also AssignFile(Datei,ExtractFilePath(ParamStr(0))+'Score.dat'); und Du bist auf halbwegs sicherer Seite. Sollte allerdings - wie unter dem Betriebssystem Windows üblich - der Anwender keine Schreibberechtigung im Programmverzeichnis haben, knallt es erneut. Mein Tipp: Unter DOS (also Win9x/ME) sollte man die Datei im Programmverzeichnis haben, unter Windows (NT, 2000, XP) im Verzeichnis für Anwenderdaten, siehe hierzu Suche im MSDN SHGETSPECIALFOLDERPATH, der Ordner ist CLIDL_APPDATA. Das landet dann (auf einem deutschsprachigen, nicht umgestellten Windows) in "C:\Dokumente und Einstellungen\<benutzernamen>\Anwendungsdaten" und ist damit für jeden Benutzer individuell.

4. Hast Du vielleicht eine Score-Datei mit auf die CD gebrannt und auf Platte kopiert? Dann kann die Datei schreibgeschützt sein! Dateien auf CD haben das Attribut "Schreibgeschützt" und Win9x kopiert alle Attribute mit. Bei XP hat man das Problem erkannt, da wird das Attribut zurückgesetzt (sollte es zumindest).
Wenn Du ganz sicher sein willst, solltest Du einfach die Attribute auslesen und ggf. anpassen.

Anmerkung: In der Regel wird für die Ermittlung der Spezialordner Suche im MSDN SHGETSPECIALFOLDERLOCATION vorgeschlagen. Ich bevorzuge Suche im MSDN SHGETSPECIALFOLDERPATH, weil da direkt der Pfad geliefert wird. Bei Location wird eine Datenstruktur geliefert, die man noch auswerten und dann freigeben muß. Allerdings steht die Path-Variante bei Win95 und WinNT4 nur zur Verfügung, wenn mindestens IE4 installiert ist (ist das eine Einschränkung?)!


Bei Win9x liegt der Einstellungsordner in "C:\Windows\Anwendungsdaten" - in ein Unterverzeichnis des Systemverzeichnisses gehört für mich sowas nicht hin, weil der gemeine DAU hier zuviel Schaden beim Löschen anrichten kann - und unterschiedliche Benutzer gibt es nicht. Deshalb schreibe ich das bei Win9x ins Programmverzeichnis.

Gruß

Dietmar Brüggendiek