Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi EFcreateError Hilfe! (https://www.delphipraxis.net/168242-efcreateerror-hilfe.html)

Defe 10. Mai 2012 21:01

EFcreateError Hilfe!
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Leute ich bin ein ziemlicher Neuling in Sachen programmieren (9Monate Programmiererfahrung durch Schule) und habe vor kurzem ein für mich etwas größeres Projekt begonnen.

Dieses Projekt ist ein Vokabeltrainer doch schon gleich bei dem speichern von der Vokabel-Textdatei komme ich nicht mehr weiter...
Das Problem ist wie oben beschrieben ein EFCreateError, der mir nicht erlaubt die Textdatei zu erstellen.

Jetzt meine Frage:
Ist es richtig, dass dieser nur auftaucht wenn
a) ich nicht die Berechtigung dazu habe
b) Pfad oder Dateiname falsch sind
c) Datei nicht überschreibbar ist

Denn diese 3 Aspekte habe ich sorgfältigst überprüft (bin übrigens Administrator an meinem Pc)
Ich sitze mittlerweile knappe 10Stunden an dem einen Problem, weshalb ich mich auch jetzt an dieses Forum gewand habe...

Hier noch ein Ausschnitt des Quelltexts:

------------------------------------------------------------
Delphi-Quellcode:
var i:integer; part:char; back,ok,pathlang1,pathlang2:string;
begin
 voka1.Clear;
 voka2.clear;
 path.clear;

 for i:=1 to stringgrid1.rowcount-1 do
  begin
   voka1.add(stringgrid1.cells[1,i]);
   voka2.add(stringgrid1.cells[2,i]);
  end;
 voka1.add('///END///');
 voka2.add('///END///');

 savedialog1.execute;

 back:='';
 i:=length(savedialog1.filename);
 while not (savedialog1.filename[i]='\') do
  begin
   part:=savedialog1.filename[i];
   back:=back+part;
   i:=i-1;
  end;

 ok:='';
 for i:=length(back) downto 1 do
  ok:=ok+back[i];
  edit1.text:=ok;

 path.add('Vokabellisten\'+lang1+'\'+ok);
 path.add('Vokabellisten\'+lang2+'\'+ok);
 path.add(lang1);
 path.add(lang2);
 path.savetofile(savedialog1.filename);
 pathlang1:='Vokabellisten\'+lang1+'\'+ok;
 pathlang2:='Vokabellisten\'+lang2+'\'+ok;
 voka1.savetofile(pathlang1);
 voka2.savetofile(pathlang2);
----------------------------------------------

die Stringlisten voka1 und voka2 lassen sich nicht abspeichern, beide wurden bei der formcreate-Prozedur mit voka1:=Tstringlist.create;
aufgerufen und in den Unit-Variablen deklariert.Bild vom Fehler befindet sich im Anhang...

Danke schon im Voraus

himitsu 10. Mai 2012 21:08

AW: EFcreateError Hilfe!
 
Zitat:

Delphi-Quellcode:
pathlang1:='Vokabellisten\'+lang1+'\'+ok

:!: Arbeite niemals mit relativen Pfaden!

Nein, relative Pfade sind nicht relativ zum Verzeichnis wo die EXE liegt,
sondern sie liegen relativ zum aktiellen Arbeitsverzeichnis. (und das kann sich ändern, z.B. der FileDialog spielt gerne damit rum :angle2: )

Tja, wenn du versuchst eine Datei in einem Verzeichnis zu speichern, welches nicht existiert, dann muß es zwangsläufig knallen.

Tipp:
Delphi-Quellcode:
ExtractFilePath(ParamStr(0))
oder
Delphi-Quellcode:
ExtractFilePath(Application.ExeName)
z.B. siehe http://www.delphipraxis.net/168206-d...-new-post.html

So, wenn deine Pfade irgendwann mal stimmen (absolut sind), dann darfst du dir auch DirectorYExists, CreateDirectory oder ForceDirectories angucken, oder du erstellst die Verzeichnisstruktur außerhalb deines Programms. (z.B. manuell über den Explorer)



PS:
Delphi-Quellcode:
SaveDialog1.Execute
ist eine Funktion. :zwinker:
Drück mal auf Abbrechen und wundere dich dann, daß dennoch gespeichert wird, obwohl du es doch nicht mehr wolltest.

Zitat:

Delphi-Quellcode:
 back:='';
 i:=length(savedialog1.filename);
 while not (savedialog1.filename[i]='\') do
  begin
   part:=savedialog1.filename[i];
   back:=back+part;
   i:=i-1;
  end;

Das soll nicht zufällig ein Delphi-Referenz durchsuchenExtractFileName darstellen? :angle:

Delphi-Referenz durchsuchenReverseString

daywalker9 10. Mai 2012 21:09

AW: EFcreateError Hilfe!
 
Du solltest keine relativen Pfade nutzen für voka1 und voka2 sondern zB
Delphi-Quellcode:
ExtractFIlePath(Application.ExeName) + '\Vokabltrainer...'
dann wird im aktuellen Order der EXE gespeichert.

Zudem solltest Du vorher prüfen ob das Verzeichnis existiert, es gibt zB die FUnktion
Delphi-Quellcode:
ForceDirectories(<dein Pfad>)
, die falls der Ordner nicht existiert , erzeugt.

Defe 11. Mai 2012 05:53

AW: EFcreateError Hilfe!
 
Danke Himitsu und Daywalker für die raschen Antworten

Euere Beiträge haben mir sehr geholfen, vor allem der
Code:
ExtractFIlePath(Application.ExeName)
Befehl...
Das das Speichern nicht abbrechbar war hatte ich nicht berücksichtigt und jetzt ebenfalls behoben

Defe 11. Mai 2012 15:31

AW: EFcreateError Hilfe!
 
achja das hatte ich überlesen, ja, das sollte es darstellen, aber wie schon gesagt bin noch relativ neu und kenne daher nur ein bruchteil der Befehle :?

himitsu 11. Mai 2012 23:01

AW: EFcreateError Hilfe!
 
Nun kennst du es ja. :zwinker:

Neues kennengelernt zu haben, ist der Hauptgrund für einen Lernprozess.
Nur Wenige wissen alles sofort.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz