Entwickler-Ecke
Dateizugriff - Resources
NeMeZ - Mo 25.04.11 09:21
Titel: Resources
Hallo Leute,
habe folgendes Problemm, die Resources, die ich in eine EXE gesteckt habe, möchte ich in einem bestimmten Ordner speichern und bekomme immer wieder fehlermeldung
und was ich geschrieben hab'.....
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.Button1Click(Sender: TObject); var Save : TSaveDialog; begin with TResourceStream.Create(hInstance, 'exe1', RT_RCDATA) do try save := TsaveDialog.Create(Self); if save.Execute then begin Save.InitialDir :=ExtractFilePath(edit1.Text); Seek(0, soFromBeginning); SaveToFile(save.InitialDir); end;
finally Free; end;
end; |
Moderiert von
Narses: Delphi-Tags hinzugefügt
Moderiert von
Narses: Bild als Anhang hochgeladen.
bummi - Mo 25.04.11 10:10
Mach mal statt SaveToFile ein Showmesssage....
Delphi-Quelltext
1:
| SaveToFile(save.InitialDir) |
turboPASCAL - Mo 25.04.11 11:04
bummi hat folgendes geschrieben : |
Mach mal statt SaveToFile ein Showmesssage....
Delphi-Quelltext 1:
| SaveToFile(save.InitialDir) | |
Ja, denn da wird wohl der Dateiname an sich fehlen. ;)
bummi - Mo 25.04.11 11:34
@turboPASCAL
Spielverderber ;-)
NeMeZ - Mo 25.04.11 11:43
bummi hat folgendes geschrieben : |
Mach mal statt SaveToFile ein Showmesssage....
Delphi-Quelltext 1:
| SaveToFile(save.InitialDir) | |
witzbold.....
vielleicht passiert das weil ich Win7 habe, UAC *mist*e z.B.
bummi - Mo 25.04.11 12:05
sicher nicht, lies doch mal die Fehlermeldung genau...
Etwas in der Art D:\Dateiname.endung wäre hilfreich....
jaenicke - Mo 25.04.11 13:06
NeMeZ hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| if save.Execute then begin Save.InitialDir :=ExtractFilePath(edit1.Text); Seek(0, soFromBeginning); SaveToFile(save.InitialDir); end; | |
Fassen wir mal zusammen:
Du zeigst zuerst den Dialog an. Der Benutzer wählt einen Dateinamen aus, in dem gespeichert werden soll.
Dann nachdem der Dialog bereits angezeigt war setzt du die Eigenschaft, welcher Pfad zuerst bei der Anzeige des Dialogs ausgewählt sein soll auf den Pfad in Edit1.Text.
Und am Ende speicherst du in diesen von dir selbst gerade zugewiesenen Pfad. :shock: Wofür eigentlich der Dialog, wenn der vom Benutzer ausgewählte Dateiname ohnehin verworfen wird?!?
Was du machst geht viel einfacher zu schreiben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.Button1Click(Sender: TObject); begin with TResourceStream.Create(hInstance, 'exe1', RT_RCDATA) do try Seek(0, soFromBeginning); SaveToFile(ExtractFilePath(edit1.Text)); finally Free; end; end; |
Und dass es nicht klappt, wenn du an SaveToFile den
Pfad aus dem Dateinamen in Edit1.Text übergibst, ist wohl irgendwie logisch, oder?
Was willst du jetzt wirklich machen? Einen Dateinamen über den Dialog vom Benutzer erfragen und dort speichern? Dann solltest du auch die Eigenschaft FileName des Dialogs benutzen um dort zu speichern...
NeMeZ - Mo 25.04.11 17:17
ich wollte eigentlich so machen, dass ich alle Resources in EXE, in einem ordner habe, als beispiel habe ich nur eine datei genommen, sollten aber mehrere sein....
Installer so zu sagen....
jaenicke - Mo 25.04.11 17:35
Das ändert aber nichts daran, dass du keinen Dateinamen angibst und der SaveDialog zwar angezeigt, die Auswahl des Benutzers aber ignoriert wird.
Was willst du denn nun machen mit dem Dialog?
NeMeZ - Di 26.04.11 15:58
also, jetzt kann ich ein folder erstellen, aber die Resources wollen nicht darein.... so eine kake.... und savedialog(damit ich den ordner auswählen kann...) kann ich auch nicht reinprogrammieren kommt gleich eine fehlermeldung "zugriffverletzung"
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Forms, Dialogs, StdCtrls, ShlObj, Controls;
type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Button2: TButton; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1; edit1:Tedit; Dir: string; implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin with TResourceStream.Create(hInstance, 'exe1', RT_RCDATA) do try Dir := edit1.Text; ForceDirectories(Dir); Seek(0, soFromBeginning); SaveToFile(dir); finally Free; end;
end;
end. |
jaenicke - Di 26.04.11 16:01
NeMeZ hat folgendes geschrieben : |
also, jetzt kann ich ein folder erstellen, aber die Resources wollen nicht darein.... so eine kake.... und savedialog(damit ich den ordner auswählen kann...) kann ich auch nicht reinprogrammieren kommt gleich eine fehlermeldung "zugriffverletzung" |
Der SaveDialog ist auch zur Auswahl einer Ziel
datei, keines Ordners...
Dafür gibt es SelectDirectory.
NeMeZ hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| with TResourceStream.Create(hInstance, 'exe1', RT_RCDATA) do try Dir := edit1.Text; ForceDirectories(Dir); Seek(0, soFromBeginning); SaveToFile(dir); finally Free; end; | |
Ist dir echt nicht klar, dass es einen Unterschied zwischen Dateien und Ordnern gibt? :shock:
Was willst du damit bewirken, wenn du als
Dateiname zum Speichern den Namen eines
Ordners angibst? :nixweiss:
// EDIT:
:shock:
NeMeZ hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5:
| var Form1: TForm1; edit1:Tedit; Dir: string; implementation | |
Nicht nur, dass du Dir global deklarierst, warum auch immer... :autsch:
Nein, du deklarierst auch noch eine Variable Edit1 zusätzlich. :shock: Warum?
NeMeZ - Di 26.04.11 18:59
Zitat: |
Nein, du deklarierst auch noch eine Variable Edit1 zusätzlich. :shock: Warum? |
in einer procedur wurde edit1 nicht anerkannt, wieso weiss ich nicht... :)
also, ich habe das heir geschrieben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var dir : string; begin if SelectDirectory ('Select folder', '', dir, [sdNewFolder, sdNewUI]) then edit1.Text:= dir; end; |
aber die daten aus der EXE kann ich immer noch nicht speichern.... da, wo ich das will....
jaenicke - Di 26.04.11 19:04
NeMeZ hat folgendes geschrieben : |
in einer procedur wurde edit1 nicht anerkannt, wieso weiss ich nicht... :) |
Weil es eine Prozedur ist. Und keine Methode des Formulars. Den Unterschied siehst du, wenn du z.B. eine ButtonClick-Methode mit deiner Prozedur vergleichst.
NeMeZ hat folgendes geschrieben : |
also, ich habe das heir geschrieben: |
Wenn du edit1 dort ein zweites Mal deklariert hast, wird auch diese Variable benutzt. Die ist aber
nil, weil die nie einen Wert zugewiesen bekommen hat. Deshalb kommt eine Schutzverletzung, denn den Text von
nichts kann man schlecht setzen. :zwinker:
NeMeZ hat folgendes geschrieben : |
aber die daten aus der EXE kann ich immer noch nicht speichern.... da, wo ich das will.... |
Hast du denn mittlerweile endlich zusätzlich zum Pfad einen Dateinamen angegeben?
HenryHux - Di 26.04.11 19:09
NeMeZ hat folgendes geschrieben : |
Zitat: | Nein, du deklarierst auch noch eine Variable Edit1 zusätzlich. :shock: Warum? |
in einer procedur wurde edit1 nicht anerkannt, wieso weiss ich nicht... :) |
Das passiert wenn du die Procedure nicht in der Klasse deiner Form deklarierst, so weiß dein Compiler nicht was edit1 ist.
Wenn du jetzt einfach ein neues TEdit deklarierst und es weder erstellst noch ihm einen Parent gibst, klappt es sowieso schonmal nicht.
Versuchs mal mit DeineForm.edit1, Dann wird es klappen.
Und wieso nimmst du nicht den Weg, den du oben schon angesprochen hast?
Ein paar Änderungen und es sollte klappen.
Mal ein Beispiel, an dem du den Unterschied zwischen Pfad und Pfad + Datei siehst.
Angenommen du hast ein Bild auf C:\, das TestBild heißt.
Wenn du jetzt in deinen Browser C:\ eingibst, dann öffnet er die die Partition, das Bild wird dir aber nicht angezeigt.
Wenn du jetzt soetwas wie C:\TestBild.bmp eingibst, passiert was anderes.
Kannst es ja mal ausprobieren.
lg
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!