Autor Beitrag
audioexe
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 25.03.10 19:42 
Guten Abend liebe Leute,


ich habe ein mittelschweres Problem andem ich so langsam verzweifele.

Kurze Erklärung.
Ich habe ein Programm geschrieben, dass über eine exterene Datei den Benutzer wie auch das Passwort läd beim "oncreate".Durch "rewrite" kann der Benutzer nach erfolgreicher Eingabe des Passworts,des aktuellen Benutzernamens und des neuen Benutzernamens auf die Benutzerdaten-Datei "bn.cb" den neuen Benutzernamen "einschreiben"

Nun haut mir Delphi den AE-Fehler 32 um die Ohren, obwohl die Datei "bn.cb" vorher durch "closefile" dicht gemacht wurde.

Wäre toll wenn ihr mir vielleicht sagen könntet wo der Fehler ist und eine Hilfestellung gebt, wie ich das ganze beseitigen kann.

Hier nochmal der QC fürs "Ändern"

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
procedure TForm5.Button1Click(Sender: TObject);
begin
 if Edit1.Text = BN1 then
             if Edit2.Text = PW1 then
                  if Edit3.Text = Edit4.Text then
                      begin

                      assignFile(InFile2, 'c:\bn.cb');
                      rewrite(InFile2);
                      writeln(InFile2, Edit3.Text);
                      writeln(InFile2, BN2);
                      writeln(InFile2, BN3);
                      CloseFile (InFile2);
                      Showmessage('Benutzer geändert! Starten Sie das Programme erneut!');
                      form1.close;
                      form2.close;
                      form3.close;
                      form4.Close;
                      end
                  else
                  Showmessage('Die Benutzer stimmen nicht überein')
             else
             Showmessage('Das Passwort ist nicht korrekt')
       else
       if Edit1.Text = BN2 then
             if Edit2.Text = PW2 then
                  if Edit3.Text = Edit4.Text then
                      begin
                      assignFile(Infile2, 'c:\bn.cb');
                      rewrite(Infile2);
                      writeln(InFile2, BN1);
                      writeln(InFile2, Edit3.Text);
                      writeln(InFile2, BN3);
                      CloseFile (InFile2);
                      Showmessage('Benutzer geändert! Starten Sie das Programme erneut!');
                      form1.close;
                      form2.close;
                      form3.close;
                      form4.Close;
                      end
                  else
                  Showmessage('Die Benutzer stimmen nicht überein')
             else
             Showmessage('Das Passwort ist nicht korrekt')
       else
       if Edit1.Text = BN3 then
             if Edit2.Text = PW3 then
                  if Edit3.Text = Edit4.Text then
                      begin
                      assignFile(Infile2, 'c:\bn.cb');
                      rewrite(Infile2);
                      writeln(InFile2, BN1);
                      writeln(InFile2, BN2);
                      writeln(InFile2, Edit3.Text);
                      CloseFile (InFile2);
                      Showmessage('Passwort geändert! Starten Sie das Programme erneut!');
                      form1.close;
                      form2.close;
                      form3.close;
                      form4.Close;
                      end
                  else
                  Showmessage('Die Benutzer stimmen nicht überein')
             else
             Showmessage('Das Passwort ist nicht korrekt')
       else
       Showmessage('Benutzer unbekannt!');

end;


und hier fürs "Formcreate"

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm5.FormCreate(Sender: TObject);
begin
assignFile(Infile, 'c:\pw.cb');
assignFile(Infile2, 'c:\bn.cb');
    reset(InFile);
    reset(InFile2);
          while not eof (InFile) do
            begin
            readln(InFile, PW1);
            readln(InFile, PW2);
            readln(InFile, PW3);
            end;
          while not eof (InFile2) do
            begin
            readln(InFile2, BN1);
            readln(InFile2, BN2);
            readln(InFile2, BN3);
            end;
    CloseFile (InFile);
    CloseFile (InFile2);

end;



mfg
audi

edit: habe glo. var ersetzt
edit2: relative pfade wurden ersetzt

Moderiert von user profile iconNarses: Quote- durch Delphi-Tags ersetzt


Zuletzt bearbeitet von audioexe am Fr 26.03.10 09:18, insgesamt 1-mal bearbeitet
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 25.03.10 19:56 
Bzgl. der Fehlermeldung:
Melancholy of Haruhi-chan Suzumiya

Und zu deinem Source:
- Programm beenden mit Application.Terminate;

- Globale Variablen sind bäh!

- Hat dein Nutzer die Berechtigungen für den Zugriff auf die Datei? Schreibschutz?

- Schau Dir mal das Thema Resourcenschutzblöcke (Try...finally\try...Except) an.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 25.03.10 19:59 
hi,
Bitte verwende kein [Zitat] für Quellcode! dafür gibts [delphi]deinquellcode[/delphi] tags.
Hast Du schon mal versucht Deinen Quellcode zu Debuggen! Also Haltepunkt setzen und dann Step by Step die Zeilen abzuarbeiten um den oder die Fehler zu Finden?

Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
audioexe Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 25.03.10 20:06 
so wollte nich antworten bevor ich mir sicher bin, den Inhalt des Posts von BenDe vollständig (nicht) verstanden zu haben^^

erstmal, danke für die Umstellung von [Zitat] auf [Delphi].
Werde das beim nächsten Post von mir beachten.

Nun BTT

Ich bin noch nicht so lange im Bereich Delphi unterwegs, was ihr auch sicherlich durch meinen Quellcode erkennen könnt.
Bedeutet, dass es mir etwas schwer fällt durch das Try..Finally Gewühl durchzusteigen.
Ich benutze Globale Var. da ich das mal iwann von meinem Lehrer vor ein paar Jahren in der Schule mitbekommen habe und würde auch gerne bei dieser Variante bleiben wenn das iwie möglich ist.
Der Benutzer hat die Rechte für den Zugriff.
Das ganze Programm gibts auch noch fürs PW ändern und da klappts einwandfrei nur hier nicht.

Der schmeißt mir den Fehler bei "rewrite(Infile2)" raus.

edit:
(bei allen 3 "rewrite(Infile2)" in den if schleifen)
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 25.03.10 20:24 
Ich würde erst mal Prüfen ob die Datei überhaupt da ist bevor ich rewrite aufrufe!
z.B.
ausblenden Delphi-Quelltext
1:
2:
assignFile(InFile2, 'bn.cb');
if not(FileExists('bn.cb')) then ReWrite(InFile2);

Aber dazu hat user profile iconBenBE ja schon was gesagt!

user profile iconaudioexe
Zitat:
Ich benutze Globale Var. ...... würde auch gerne bei dieser Variante bleiben

Empfehlung auch von mir: Ganz schnell Umdenken! :wink:

Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
audioexe Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 25.03.10 20:39 
umdenken, gerne^^

was wären denn die Alternativen zu Globalen Variablen?
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 25.03.10 20:48 
z.B.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm5.Button1Click(Sender: TObject);
var
 InFile2 = TextFile;

begin
    assignFile(InFile2, 'bn.cb');
end;

Der Rest ist ein Lernprozess, Tutorials lesen, Delphi Hilfe usw.

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
audioexe Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 25.03.10 20:55 
achso meintest du das, die VAR direkt in der Procedure deklarieren. Ja des is kein Thema.

aber meine Frage bleibt leider noch bestehen. Warum haut der mir da diesen Fehler raus?

Kurzes Update. Habe gelesen das man keine relativen Pfade angeben soll. Hab ich geändert, Fehler bleibt bestehen.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Do 25.03.10 21:00 

_________________
PROGRAMMER: A device for converting coffee into software.
delphi10
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: Do 25.03.10 21:00 
user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
Ich würde erst mal Prüfen ob die Datei überhaupt da ist bevor ich rewrite aufrufe!
z.B.
ausblenden Delphi-Quelltext
1:
2:
assignFile(InFile2, 'bn.cb');
if not(FileExists('bn.cb')) then ReWrite(InFile2);


Und wozu soll das in diesem Fall gut sein? ReWrite überschreibt eine vorhandene Datei oder legt eine neue an. Fehler 32 heißt, dass diese Datei von einem anderen Prozess geöffnet wurde und somit nicht schreibbereit ist. Also einfach mal gucken, wer da noch seine (Prozess)Finger im Spiel hat.
Edit: Das Gemeine bei Fehlern aus dem Filesystem ist, dass sie bereits eventuell irgendwo "vorher" ausgelöst wurden und sich aber erst in so einer Situation bemerkbar machen. Ich lösche grundsätzlich den IOError-Speicher durch abfragen des selben zu begin einer Procedure, in der irgendetwas mit Dateien gemacht wird.

_________________
Salus populi suprema lex esto


Zuletzt bearbeitet von delphi10 am Do 25.03.10 21:05, insgesamt 1-mal bearbeitet
audioexe Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 25.03.10 21:03 
@delphi10
ja das dachte ich mir auch, dass unter Umständen da noch iwo ein "closefile" zu wenig ist.
Aber ich hab den Code wirklich ziemlich genau durchgeschaut und ich finde da nichts, was da noch stören könnte.
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 25.03.10 21:51 
user profile icondelphi10 oops, da hab ich doch echt an Zeilen bearbeitung gedacht und nicht daran das er ständig eine neue Datei erstellt für sowas. :wink:

user profile iconaudioexe CrossPosts werden in Foren nicht gern gesehen!!

Da wir hier aber den gleichen QuellCode sehn wie in DT, dürftest Du wahrscheinlich doch nicht so genau lesen was andere schreiben, oder versuchen es umzusetzen! mh...

Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 26.03.10 00:34 
user profile iconaudioexe hat folgendes geschrieben Zum zitierten Posting springen:
so wollte nich antworten bevor ich mir sicher bin, den Inhalt des Posts von BenDe vollständig (nicht) verstanden zu haben^^

Naja, vor dem Verstehen käme zuerst das Lesen - was Du scheinbar auch nicht tust, wie man wunderbar an meinem "Nick" in deinem Post sieht. Vergleich mal mit dem, was links neben diesem Post steht ;-)

Aber sei unbesorgt: Obwohl ich deinen Satz ausgiebig gelesen habe, versteh ich nicht, was Du damit ausdrücken möchtest.

Zu den Alternativen zu globalen Variablen:
- Lokale Variablen wie bereits gezeigt
- Felder\Properties im Formular-Objekt

Und SOOOO Schwierig ist Try\Finally bzw. Try\Except auch nicht zu verstehen, wenn man sich einmal die Hilfe bzw. diverse Tutorials durchliest.

Vom Meister persönlich:
Psssst: Crashkurs, Crashkurs Reloaded


@ALF: Crossposts gehen schon in Ordnung, solange sie angegeben werden (und zwar direkt im Einleitungspost). Sollte man aber vermeiden, wenn es keinen triftigen Grund für gibt.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.