| Autor |
Beitrag |
delphistart
      
Beiträge: 119
|
Verfasst: So 10.12.06 16:28
Hallo,
ich habe hier 2 Proceduren, die eigentlich eine Datei Öffnen bzw. speichern sollen, doch leider bekomme ich nur Fehlermeldungen und funde einfach das Problem nicht!
Vielleicht hat ja einer von euch ein Idee:
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:
| procedure TArtikelliste.Button3Click(Sender: TObject); var i:integer; begin if OpenDialog1.Execute then assignFile(datei4,OpenDialog1.FileName); if (FileExists(OpenDialog1.FileName)) and (FileSize(datei4)>0) then begin Reset(datei4); seek(datei4,0); for i := 0 to FileSize(datei4) do begin read(datei4,list); edit1.Text:=list.eingabeean; setartikel; arrEdit[i+1].Text:=IntToStr(list.menge); end; CloseFile(datei4); end else ShowMessage('Fehler beim lesen der Datei!'); end;
procedure TArtikelliste.Button4Click(Sender: TObject); var i:integer; begin if SaveDialog1.Execute then assignFile(datei4,SaveDialog1.FileName); if FileExists(SaveDialog1.FileName) then Reset(datei4) else ReWrite(datei4); seek(datei4,0); for i := 0 to (count-1) do begin list.eingabeean:=arrLabel1[i+1].Caption; list.menge:=StrToInt(arrEdit[i+1].text); Write(datei4,list); end; CloseFile(datei4); ShowMessage('Die Liste wurde erfolgreich gespeichert!') end; |
Den record zu der Datei habe ich so gesetzt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| type liste = record eingabeean:string[13]; menge:integer; end; var datei4: file of liste; list:liste; |
Zuletzt bearbeitet von delphistart am So 10.12.06 17:11, insgesamt 1-mal bearbeitet
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: So 10.12.06 16:31
Was für einen Fehler erhältst du?
_________________ Markus Kinzler.
|
|
delphistart 
      
Beiträge: 119
|
Verfasst: So 10.12.06 16:37
Beim speichern bekomme Ich:
Im Projekt Projekt1.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 0046943E in Modul 'Projekt1.exe'. Lesen von Adresse 00000004' aufgetreten.
Es wird nur eine Leere Datei geschrieben. Wenn ich auf fortsetzen gehe und versuche diese zu öffnen, dann kommt:
Im Projekt Projekt1.exe ist eine Exception der Klasse EinOutErrot mit der Meldung 'E/A-Fehler 103' aufgetreten.
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: So 10.12.06 16:41
Debugge mal das Projekt um herauszufinden in welcher Zeile der Fehler auftritt.
_________________ Markus Kinzler.
|
|
delphistart 
      
Beiträge: 119
|
Verfasst: So 10.12.06 17:12
mkinzler hat folgendes geschrieben: | | Debugge mal das Projekt um herauszufinden in welcher Zeile der Fehler auftritt. |
Ich habe die Zeile oben im Queltext mal markiert, aber ich finde da einfach keinen Fehler  ...
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: So 10.12.06 17:17
Hallo
was ist arrlabel ? ist wirklich ein stat. array und kein dynamisches, weil dann wäre dein i+1 sicher falsch.
Außerdem hast du noch einen logikfehler drin:
Delphi-Quelltext 1: 2: 3: 4:
| if OpenDialog1.Execute then assignFile(datei4,OpenDialog1.FileName); if (FileExists(OpenDialog1.FileName)) and (FileSize(datei4)>0) then ... |
Du würdest die Datei immer öffnen/speichern, egal ob der nutzer ok oder abbrechen klickt, da fehlt ein begin end
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| if OpenDialog1.Execute then begin assignFile(datei4,OpenDialog1.FileName); if (FileExists(OpenDialog1.FileName)) and (FileSize(datei4)>0) then ... end; |
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
delphistart 
      
Beiträge: 119
|
Verfasst: So 10.12.06 17:34
Also das mit dem begin und end ist schonmal wichtig! Danke!
Was das mit dem Array betrifft:
Soweit ich wis ist das schon ein dynamischer Array... Ich bin jetzt soweit, dass ich das Problem mit "list.menge:=StrToInt(arrEdit1[i].text)" gelöst habe. Es heist arrEdit1 und nicht arrEdit, aber jetzt kommt der Fehler -"" Ist ken gültiger Integerwert-, obwohl ich zum test in das editfeld 54 eingegeben habe.
Vielleicht hilf ja wie das Editfeld erstellt wird:
Delphi-Quelltext 1: 2: 3: 4: 5:
| arrEdit1[count]:=TEdit.Create(self); arrEdit1[count].parent:=artikelliste.Scrollbox1; arrEdit1[count].Top:=position+25; arrEdit1[count].Left:=534; arrEdit1[count].text:='1'; arrEdit1[count].Width:=40; |
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: So 10.12.06 18:01
dynamische Array beginnen von 0 an zu zählen. mit deinem [i+1] beginnst du ein item zu spät und endest auch eins zu spät -> und siehst deine AV.
Delphi-Quelltext 1:
| arrEdit1[count]:=TEdit.Create(self); |
wann erhöhst du count und wo steht dein setlength?
wenn du dein count vorher erhöhst bist du hier genauso über der Arraygrenze
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
delphistart 
      
Beiträge: 119
|
Verfasst: So 10.12.06 18:22
|
|
delphistart 
      
Beiträge: 119
|
Verfasst: So 10.12.06 18:46
Bin mit dem öffnen nun auch schon ein Stückchen weiter: Die Datei wird geöffnet und SetArtikel; wird auch aufgerugen, doch anscheinend sucht das programm dann die Datei in der die Artikelinformationen stehen im verzeichnis wo die Listendatei steht un nicht mehr da wo das Programm ist. DAdurch werden die Dateien dann natürlich nicht gefunden. Wie kann ich das ändern?
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 10.12.06 19:49
Du musst überall, wo du einen Dateinamen angibst auch das Verzeichnis mit angeben. Tust du das nicht, wird das aktuelle Arbeitsverzeichnis benutzt, und das ist nach dem Ausführen des Öffnen-Dialogs das dort ausgewählte Verzeichnis.
Also: ExtractFilePath(ParamStr(0)) + '\YourFile.txt'
|
|
delphistart 
      
Beiträge: 119
|
Verfasst: So 10.12.06 19:56
jaenicke hat folgendes geschrieben: | Du musst überall, wo du einen Dateinamen angibst auch das Verzeichnis mit angeben. Tust du das nicht, wird das aktuelle Arbeitsverzeichnis benutzt, und das ist nach dem Ausführen des Öffnen-Dialogs das dort ausgewählte Verzeichnis.
Also: ExtractFilePath(ParamStr(0)) + '\YourFile.txt' |
Kann ich auch irgendwie das Arbeitsverzeichnis wieder umstellen ohne immer den Dateipfad anzugeben? Am besten mit Hilfe von einem Befehl den ich einfach nach der Schleife setzen kann, dann muss ich das Verzeichnis nähmlich nur in dieser Unit mit angeben und nicht überall im Programm. Überall ändern wäre jetzt sehr zeitaufwändig.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 10.12.06 20:02
Es ist sehr unsauberer Code, wenn du den Pfad nicht angibst. Denn so ist das nicht gedacht.
Dass es normalerweise so funktioniert, ist eine andere Sache, aber du solltest dich nicht darauf verlassen, dass die Datei tatsächlich gefunden wird, wenn du keinen Pfad angibst.
Aber wenn du wider besseren Wissens das doch so machen willst, bitte:
Es gibt für das Setzen des Arbeitsverzeichnisses die Methode SetCurrentDirectory, die in der Unit ShellApi deklariert ist.
Wunder dich dann aber nicht, wenn es vielleicht bei irgendjemandem dabei Probleme gibt...
|
|
delphistart 
      
Beiträge: 119
|
Verfasst: So 10.12.06 20:21
jaenicke hat folgendes geschrieben: | Es ist sehr unsauberer Code, wenn du den Pfad nicht angibst. Denn so ist das nicht gedacht.
Dass es normalerweise so funktioniert, ist eine andere Sache, aber du solltest dich nicht darauf verlassen, dass die Datei tatsächlich gefunden wird, wenn du keinen Pfad angibst.
Aber wenn du wider besseren Wissens das doch so machen willst, bitte:
Es gibt für das Setzen des Arbeitsverzeichnisses die Methode SetCurrentDirectory, die in der Unit ShellApi deklariert ist.
Wunder dich dann aber nicht, wenn es vielleicht bei irgendjemandem dabei Probleme gibt... |
Das Programm ist nur für den Eigenbedarf um Zitat: Die von Computern geschaffenen Aufgaben zu erleichtern...
Ich hab das ganze Jetzt mal probiert, aber ich kriege die Meldung UNdefinierter Bezeichner SetCurrentDirectory.
Mein Code dazu:
Delphi-Quelltext 1:
| ShellApi.SetCurrentDirectory:=ExtractFilePath(ParamStr(0)); |
Ich habe dieUnit auch in den Uses Teil geschrieben. War doch richtig so oder?
Delphi-Quelltext 1: 2: 3:
| uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ShellApi; |
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 10.12.06 20:40
SetCurrentDirectory ist keine Variable sondern eine Methode!!!
In die uses einbinden ist schon richtig.
Aber du musst SetCurrentDirectory mit dem Verzeichnis als Parameter aufrufen, nicht das Verzeichnis mit := zuweisen.
Ok: SetCurrentDirectory(PChar(ExtractFilePath(ParamStr(0))));
In deinem Profil hast du leider nicht geschrieben, welche Delphi-Version du benutzt, deshalb kann ich es nicht mit dieser Version testen, aber zumindest bei Delphi 7 und 2006 funktioniert es, wenn die Unit ShellAPI in der uses steht.
|
|
delphistart 
      
Beiträge: 119
|
Verfasst: So 10.12.06 20:54
DANKE!!!

|
|