Autor Beitrag
delphistart
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 119



BeitragVerfasst: 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:
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:
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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 10.12.06 16:31 
Was für einen Fehler erhältst du?

_________________
Markus Kinzler.
delphistart Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 119



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 10.12.06 16:41 
Debugge mal das Projekt um herauszufinden in welcher Zeile der Fehler auftritt.

_________________
Markus Kinzler.
delphistart Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 119



BeitragVerfasst: So 10.12.06 17:12 
user profile iconmkinzler 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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:
ausblenden 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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 119



BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 119



BeitragVerfasst: So 10.12.06 18:22 
Also, ich weis zwar nicht wo der Fehler jetzt wirklich lag, aber so geht das speichern auf jeden Fall:
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:
23:
procedure TArtikelliste.Button3Click(Sender: TObject);
var i:integer;
begin
  if OpenDialog1.Execute then
    begin
    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)-1) do
        begin
        read(datei4,list);
        edit1.Text:=list.eingabeean;
        setartikel;
        arrEdit1[i+1].Text:=IntToStr(list.menge);
        end;
      CloseFile(datei4);
      end;
     end
    else
      ShowMessage('Fehler beim lesen der Datei!');
end;


Leider habe ich immernoch den Fehler beim öffnen. Wo könnte hier der Fehler sein?
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:
23:
procedure TArtikelliste.Button3Click(Sender: TObject);
var i:integer;
begin
  if OpenDialog1.Execute then
    begin
    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)-1) do
        begin
        read(datei4,list);
        edit1.Text:=list.eingabeean;
        setartikel;
        arrEdit1[i].Text:=IntToStr(list.menge);
        end;
      CloseFile(datei4);
      end;
     end
    else
      ShowMessage('Fehler beim lesen der Datei!');
end;
delphistart Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 119



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 119



BeitragVerfasst: So 10.12.06 19:56 
user profile iconjaenicke 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 119



BeitragVerfasst: So 10.12.06 20:21 
user profile iconjaenicke 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:
ausblenden Delphi-Quelltext
1:
ShellApi.SetCurrentDirectory:=ExtractFilePath(ParamStr(0));					

Ich habe dieUnit auch in den Uses Teil geschrieben. War doch richtig so oder?
ausblenden Delphi-Quelltext
1:
2:
3:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellApi;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 119



BeitragVerfasst: So 10.12.06 20:54 
DANKE!!!
:beer: