Entwickler-Ecke

Dateizugriff - Vista File Open Dialog Probleme


Grafix - Sa 17.07.10 18:00
Titel: Vista File Open Dialog Probleme
Hey,

ich möchte mit einer FileOpenDialog-Komponente den User einen Dateipfad festlegen lassen. Nach dem Auswählen soll der Pfad in einer Edit gespeichert werden und anschließend nur in einer Textdatei gespeichert werden.

Wenn ich drei Pfade angeben lassen möchte, brauche ich dafür 3 dieser Komponenten? Oder kann ich einfach jeweils mit einem anderen Button diese Komponente ansprechen und entsprechend in eine andere EditKomponente einfügen?

Am ende der Form soll der User bestätigen und mittels diesem Button sollen die drei FODs mit Free gelöscht werden. Ist das so ok oder besser gleich nach der Dateiauswahl freen?

Lg

Grafix


Gausi - Sa 17.07.10 18:09

Wenn du die File-Open-Komponente auf der Form hast, dann solltest du die gar nicht selber freigeben. Das passiert am Ende das Programmes automatisch.

Zu dem anderen: Nein, du brauchst nur eine Komponente. Jeweils nach dem Execute des Dialogs trägst du den Filename an der passenden Stelle ein.


Xion - Sa 17.07.10 19:00

user profile iconGrafix hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich drei Pfade angeben lassen möchte, brauche ich dafür 3 dieser Komponenten? Oder kann ich einfach jeweils mit einem anderen Button diese Komponente ansprechen und entsprechend in eine andere EditKomponente einfügen?

Nein, brauchst du nicht. Wie Gausi sagte. Evtl wäre es sinnvoll, dass man alle Dateien auf einmal anwählen kann, da gibts ne MultiSelect(?) Option des OpenDialogs für.

user profile iconGrafix hat folgendes geschrieben Zum zitierten Posting springen:
Am ende der Form soll der User bestätigen und mittels diesem Button sollen die drei FODs mit Free gelöscht werden. Ist das so ok oder besser gleich nach der Dateiauswahl freen?

Das kommt auf deine Implementierung an. Wenn du sie dynamisch erstellst, dann musst du sie löschen. Wenn du sie jedes mal beim Dialog öffnen createst, dann musst du es nach jedem Aufruf löschen ;)


jaenicke - Sa 17.07.10 22:30

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du sie dynamisch erstellst, dann musst du sie löschen. Wenn du sie jedes mal beim Dialog öffnen createst, dann musst du es nach jedem Aufruf löschen ;)
Aber nur, wenn kein Owner angegeben wurde, also nil.

Denn wenn ein Owner angegeben ist, kümmert sich dieser schon selbst darum. Wenn man die Komponente dann selbst freigibt, kann das seltsame Effekte nach sich ziehen.


Grafix - So 18.07.10 12:37

Ich habe leider nur die Hälfte verstanden, von eurer Ausführlichen Erklärung :(

Was hat das mit dem Owner zu tun?

Zur dynamischen Programmierung: Ich habe es denke ich nicht dynamisch programmiert, es können maximal drei Pfade ausgewählt werden, mittels drei Buttons. Ich möchte es jedoch nicht mit Mehrfachauswahl machen.

Habe hier einfach mal meinen Code gepastet, dreimal das selbe und recht simple, wieso gibt er mir da eine Zugriffsverletzung sobald ich einen Button zur Auswahl drücke??

Ist es bei diesem Code nötig am ende FileOpenDialog.Free auszuführen?



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:
implementation

{$R *.dfm}

procedure TFInstall.BSkin_SearchClick(Sender: TObject);
begin
  if FileOpenDialog.Execute then
    ESkin.Text := FileOpenDialog.FileName
  else
    ESkin.Text := '';
end;

procedure TFInstall.BSP_SearchClick(Sender: TObject);
begin
  if FileOpenDialog.Execute then
    ESP.Text := FileOpenDialog.FileName
  else
    ESP.Text := '';
end;

procedure TFInstall.BWOM_SearchClick(Sender: TObject);
begin
  if FileOpenDialog.Execute then
  begin
    EWOM.Text := FileOpenDialog.FileName;
  end
  else
    EWOM.Text := '';
end;

procedure TFInstall.FormCreate(Sender: TObject);
begin
  // OpenFileDialogs schließen
  FileOpenDialog.Free;
end;
end.


danke für eure Hilfe


Andreas L. - So 18.07.10 16:18

Im OnCreate-Ereignis gibst du den Dialog frei, welchen Sinn macht das? ;-)

Entferne


Delphi-Quelltext
1:
FileOpenDialog.Free;                    


und alles sollte klappen.

EDIT: Du brauchst den Code für die Buttons auch nicht 3 mal schreiben. Definiere folgende Methoden und stell diese dann im Objekt-Inspektor der Buttons ein

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 TFInstall.SelectFileClick(Sender: TObject);
var
  btn: TButton;
begin
  //überprüfen ob der übergebene Sender ein Button ist.
  //Wenn deine Buttons nicht vom Typ TButton sind (z. B. TSpeedButton) 
  //musst du das natürlich ändern.
  if Sender is TButton then 
  begin
    //Dialog aufrufen
    if FileOpenDialog.Execute then
    begin
      //Button aus Sender holen oder besser gesagt in die Variable casten
      btn := TButton(Sender);
      if btn = BSkin_Search then
        ESkin.Text := FileOpenDialog.FileName
      else if btn = BSp_Search then
        ESP.Text := FileOpenDialog.FileName
      else if btn = BWOM_Search then
        EWOM.Text := FileOpenDialog.FileName;
    end;
  end;
end;


Grafix - So 18.07.10 22:51

Vielen Dank, Problem gelöst =)