Autor Beitrag
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mi 19.02.03 22:17 
Es gibt drei Fehlerquellen:

- Die Datei ist da, aber der Pfad ist falsch und die Datei kann nicht gefunden werden.

- Der Dateiname ist falsch geschrieben.

- Alles ist richtig geschrieben, aber die Dateierweiterung fehlt.

Wie auch immer, irgendwas ist falsch an dem Dateinamen.

Es gibt einige funktionen die eine Variable als Parameter brauchen. Es ist meisten dann, wenn es einen Rückgabewert gibt. In solchen Fällen kann man nicht mit Komponenten-Text oder Caption ankommen, sondern muß es über eine Variable machen. Allerdings braucht DeleteFile keine Variable. Deshalb muß es funktionieren.

Übrigens:

function DeleteFile(const FileName: string): Boolean;

Beschreibung

DeleteFile löscht die mit FileName angegebene Datei vom Datenträger. Kann die Datei nicht gelöscht oder gefunden werden, gibt die Funktion False zurück.

Prüf den Boolean Rückgabewert.

ausblenden Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  if not DeleteFile(Combobox1.Text) then ShowMessage('Datei konnte nicht gelöscht werden, da sie nicht gefunden werden konnte'); 
end;


Alternativ (das hab ich aber bereits geschrieben) kann man vorher prüfen ob die Datei existiert. Siehe FileExists Funktion.

Das Problem ist immer noch, daß du ein Wunder erwartest und nicht bereit bist die Beispiele die du bekommst auszuprobieren.
Dotter Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 20.02.03 19:45 
Hier der Quelltext.


ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
Makros.dat ist ein Textfile mit den Dateien als einträgen.
makro1
makro2
makro3


procedure TMakro.FormCreate(Sender: TObject);
begin
  Combobox1.items.LoadFromFile('Makros.dat');
end;


procedure TMakro.DeleteClick(Sender: TObject);
begin
  deletefile(Combobox1.text);   // Funktioniert NICHT obwohl im Watch 'makro1' steht.
  deletefile('makro1'):         // Funktioniert
  Combobox1.DeleteSelected;
  Combobox1.items.SaveToFile('Makros.dat');
end;


Glaubt mir, ich hatte ganz andere Probleme zu lößen. Das Simple mache ich immer zuletzt.... dachte ich.
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Fr 21.02.03 02:20 
Ich gebe zu, daß es durchaus interresant wäre zu erfaheren wieso es bei dem einen Text funktioniert und bei dem anderen nicht. Allerdings sind bereits vorschläge gemacht worden wie es funktionieren könnte, z.B. mit einem Pfad davor. Mir ist zwar klar, daß es sowas wie den aktuellen Pfad gibt, aber wie kommst du bloß drauf, daß du dich in dem richtigen Ordner befindest? Wie stellst du das sicher? Wie überprüfst du das vorher?

So wie ich es sehe ist es nur ein Glückstreffer wenn du die richtige Datei löscht. Ich hab dir den Tip mit dem Rückgabewert bei FileDelete gegeben. Auf diese Weise kannst du überprüfen wieso es nicht klappt. Wenn ein False zurückkommt, dann konnte die Datei nicht gefunden werden. Allerdings setzt du die Tips nicht um.

Zwar hast du laut deiner Aussage bereits viele Jahre als Programmierer Erfahrungen, da hast du dich aber nicht mit dem Datenzugriff beschäftigt. Alle Tips die man dir geben konnte wurden dir gegeben, jedoch ohne daß du nur einen umgesetzt hättest. Was mich angeht, so werde ich hier nicht weiter antworten. Die Tipps mit dem Pfad vor dem Dateinamen hab ich dir gegeben. Zwar meint Tino, daß es auch wunderbar mit dem aktuellen Pfad funktioniert, aber ich halte das für ein Glückspiel. Entscheide also selbst ob du dir alle bisherigen Antworten nochmal durchliest und es anders machst.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 21.02.03 09:39 
Dotter hat folgendes geschrieben:
ausblenden Quelltext
1:
deletefile(Combobox1.text);   // Funktioniert NICHT obwohl im Watch 'makro1' steht.					

Das stimmt nicht! Ich hab´s mal eben ausprobiert. Die Datei wird problemlos gelöscht - solange ich das Arbeitsverzeichnis nicht ändere, bzw. solange dieses Arbeitsverzeichnis zufällig der Ordner mit dem Delphi-Projekt ist! Ausprobieren:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TMakro.DeleteClick(Sender: TObject);
begin
  SetCurrentDir('c:\');

  deletefile(Combobox1.text);
  deletefile('makro1');
  Combobox1.DeleteSelected;
  Combobox1.items.SaveToFile('Makros.dat');
end;

Da ich davon ausgehe, dass sich deine Makro-Dateien nicht im Root der Festplatte C:\ befinden, wirst du diesmal auch mit
ausblenden Quelltext
1:
deletefile('makro1');					

schlechte Karten haben.

Was dir alle anderen die ganze Zeit sagen wollen, und was du -trotz angeblich vorhandener Erfahrungen in der Programmierung!- nicht zu verstehen scheinst, ist: du solltest den kompletten Pfad angeben! Wenn sich diese Makrodateien im selben Ordner wie dein Programm befinden, dann genügt
ausblenden Quelltext
1:
DeleteFile(ExtractFilePath(paramstr(0)) + Combobox1.Text);					

und es spielt absolut keine Rolle, welcher Ordner gerade als aktuelles Arbeitsverzeichnis eingestellt ist.

Und was bei vorhandener Programmiererfahrung auf keinen Fall passieren darf, ist die MISSACHTUNG von Funktionen und ihren Ergebnissen. Wenn ich mir den Beispielcode so ansehe, dann bemerke ich zwei grundsätzliche Fehler.

1. Man kann und sollte prüfen, ob die Combobox überhaupt Text enthält.
2. Es ist dir vollkommen egal, ob das Löschen der Datei geklappt hat oder nicht. Das ausgewählte Item wird in jedem Fall aus der Combobox entfernt, und die "makros.dat" wird dann auch neu gespeichert.

Ich persönlich hätte es so gemacht:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
with ComboBox1 do
  if(Text <> '') and
    (DeleteFile(ExtractFilePath(paramstr(0)) + Text)) then
  begin
    Items.Delete(ItemIndex);
    ItemIndex := 0;
    Items.SaveToFile('makros.dat');
  end else
    ShowMessage('Datei nicht gefunden');
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Fr 21.02.03 11:44 
Popov hat folgendes geschrieben:
Zwar meint Tino, daß es auch wunderbar mit dem aktuellen Pfad funktioniert, aber ich halte das für ein Glückspiel.

Ich habe geschrieben das ich wenn ich kein Verzeichnis angebe die Datei im aktuellen Arbeitsverzeichnis gesucht und in dem Fall von Dotter gelöscht wird. Nichts anders. Ob die Angabe eines Verzeichnisses notwendig ist oder nicht kann ich in dem Fall von Dotter nicht beurteilen. Einige meiner Programme müssen auf Dateien zugreifen welche sich im aktuellen Arbeitsverzeichnis befinden. Diese Dateien findet mein Programm immer... also kann ich die Ausage mit dem Glücksspiel nicht verstehen.

Aber in den meisten Fällen, da geben ich Dir recht, ist die Angabe eines kompletten Verzeichnisses notwendig. Nur habe ich dies nie zur Diskussion gebracht.

Gruß
TINO
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Fr 21.02.03 12:11 
"Zwar meint Tino, daß es auch wunderbar mit dem aktuellen Pfad funktioniert" war jetzt nicht irgendwie als Sonstwas gemeint, sondern daß ich es selbst nicht ausprobiert habe und dich lediglich als Referenz angegeben habe.

Ich persönlich habe vor Jahren ein oder zwei mal mit dem aktuellen Ordner gearbeitet und hab das letzte mal extrem schlechte Erfahrungen damit gemacht. Deshalb hab ich nie wieder damit gearbeitet und werde es auch in Zukunft nie damit arbeiten. Ich hab die Erfahrung gemacht, daß der aktuelle Ordner von anderen Programmen verändert werden kann. Deshalb meine Aussage mit dem Glücksspiel. Kann aber sein, daß seit Delphi1 jedes Delphi-Programm sein eigenen aktuellen Ordner hat. Dann sind meine Beobachtungen veraltet.

Ich für mein Teil sehe keinerlei Arbeit darin mit "richtigen" Pfaden zu arbeiten. Mag sein, daß du weiß was du tust, ich bin mir aber nicht sicher ob Dotter auch sich im klaren ist was er macht. So wie ich seinen Codes beurteile sind das Glücksspiele.

Um nochmal auf den aktuellen Ordner zurückzukommen. So weit ich mich erinnern kann gibt es eine Funktion in Delphi die auch mit dem aktuellen Ordner arbeitet. Man muß also, um mit der Funktion zu arbeiten, zuerst den aktuellen Ordner korrekt setzen und erst dann die Funktion ausführen. Allerdings kann ich mich nicht an den Namen der Funktion erinnern.
Dotter Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 23.02.03 07:01 
Ich bitte 1000 mal um Verzeihung daß ich so nervte. Es war natürlich mein Fehler. Ich hatte, da das Programm fast fertig war, die Exceptions deaktiviert. Hatte es allerdings ... ähem... vergessen. Nachdem ich die Exceptions wieder aktivierte wars dann simple..... *KOPF_in_den_SAND_STECK*..... hatte vergessen eine Datei zu schließen... HILFE... was für ein Anfängerfehler... daran war bestimmt das Bier schuld. :roll: Danke trotzdem für eure Hilfe, ihr seid wirklich gut.
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mo 24.02.03 16:27 
Dotter hat folgendes geschrieben:
Ich hatte, da das Programm fast fertig war, die Exceptions deaktiviert.


Das ist ein schönes Beispiel dafür wieso man die Exceptions nicht deaktivieren sollte. Ich verstehe nicht wieso es die Option überhaupt gibt. Wenn man alles richtig macht, dann gibts auch keine Exceptions die einen nerven. Wenn man aber schon mit Try..Except programmiert, dann sollten man es wenigsten immer anlassen, sonst sieht man seine Fehler nicht.