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

Screenshot

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 user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: 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

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconNeMeZ hat folgendes geschrieben Zum zitierten Posting springen:

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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconNeMeZ hat folgendes geschrieben Zum zitierten Posting springen:

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?!?



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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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

user profile iconNeMeZ hat folgendes geschrieben Zum zitierten Posting springen:
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 Zieldatei, keines Ordners...
Dafür gibt es SelectDirectory.

user profile iconNeMeZ hat folgendes geschrieben Zum zitierten Posting springen:

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:
user profile iconNeMeZ hat folgendes geschrieben Zum zitierten Posting springen:

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

user profile iconNeMeZ hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconNeMeZ hat folgendes geschrieben Zum zitierten Posting springen:
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:

user profile iconNeMeZ hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconNeMeZ hat folgendes geschrieben Zum zitierten Posting springen:
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