Benutzer soll Speicherort selbst wählen

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
Boneless
Beiträge: 52
Registriert: So 1. Dez 2013, 14:15
OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
CPU-Target: 64Bit
Wohnort: Ostsee

Benutzer soll Speicherort selbst wählen

Beitrag von Boneless »

Hi liebes Forum,

ich habe wieder ein neues Problem.. :(

Nun suche ich nach einer geeigneten Lösung, wie ich es dem Programm-Benutzer am einfachsten mache, sich ein Speicherort für eine EXE-Datei selbst auszusuchen...
Den Anfang habe ich schon hinbekommen. Muss ich dann etwa mit TSaveDialog weitermachen?

Ich stelle mir das so vor: Jeder kennt das doch bei einer stinknormalen Intallation. Der Installationspfad wird angezeigt und man kann ihn dann nach eigenem Ermessen ändern. Meist geht dies mit einem Button "Durchsuchen..." oder möglich ist auch, den Pfad manuell einzugeben in einem TEdit.

Genau diese beiden Dinge möchte ich gern möglich haben. Ich weiß aber nicht genau, wie ich das umsetzen kann.
Jetzt so beim Schreiben und Nachdenken fällt mir ein, dass TSaveDialog für meine Vorstellungen nicht wirklich geeignet sei.

Mit dem Bild wisst ihr dann spätestens, was ich meine :)
Unbenannt.png
Unbenannt.png (2.59 KiB) 2401 mal betrachtet
Und hier mein Code-Schnipsel

Code: Alles auswählen

procedure TForm1.Button3Click(Sender: TObject);
begin
  if MessageDlg('Möchten Sie das Programm auf Ihrem Desktop speichern?', mtInformation, [mbYes, mbNo], 0)= mrYes then
  begin
    CopyFile('data/Programme/Programm.exe', getenvironmentvariable('USERPROFILE')+'\Desktop\Programm.exe');
    Aufruf;
  end
else
 //Hier muss ja dann mein Problem rein ^^
end;
Schönen Nikolaus

Boneless

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Benutzer soll Speicherort selbst wählen

Beitrag von m.fuchs »

Schau doch mal in der Komponentenpalette unter Misc nach dem Control TFileNameEdit. Das sollte dann genau sein was du suchst. Ein TEdit mit einem TButton an dem wiederum ein entsprechender Dialog hängt.

Damit es ein Speicherndialog wird, musst du die Eigenschaft DialogKind auf dkSave stellen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
theo
Beiträge: 10926
Registriert: Mo 11. Sep 2006, 19:01

Re: Benutzer soll Speicherort selbst wählen

Beitrag von theo »

Vielleicht wäre auch ein Installer wie InnoSetup geeignet für dein Anliegen?
http://wiki.freepascal.org/Deploying_Your_Application

Boneless
Beiträge: 52
Registriert: So 1. Dez 2013, 14:15
OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
CPU-Target: 64Bit
Wohnort: Ostsee

Re: Benutzer soll Speicherort selbst wählen

Beitrag von Boneless »

m.fuchs hat geschrieben:Schau doch mal in der Komponentenpalette unter Misc nach dem Control TFileNameEdit
Ich hab jetzt eher das DirectoryEdit im Fokus gehabt. Ich will ja nur den Pfad vom Benutzer ändern lassen, wohin etwas dann kopiert wird. Das Programm (der Name und die Endung) bleibt gleich, nicht aber der Pfad.
theo hat geschrieben:Vielleicht wäre auch ein Installer wie InnoSetup geeignet für dein Anliegen?
Meinste? Für eine kleine EXE, die nur kopiert werden soll, so einen Aufwand? :lol: Ich weiß nicht...



Nun bin ich ja schon soweit, dass mein Programm irgentwie nicht auf die EXE (die kopiert werden soll) zugreifen kann.

Hier mal der Code:

Code: Alles auswählen

 
  { TForm1 }  
procedure TForm1.Button3Click(Sender: TObject);
var
  TempDir,TempProg: String;
begin
  TempDir := 'data\Programme\AutoMouse.exe';
  TempProg := 'Automouse.exe';
  if MessageDlg('Möchten Sie AutoMouse auf Ihrem Desktop speichern?', mtInformation, [mbYes, mbNo], 0)= mrYes then
  begin
    CopyFile(TempDir, getenvironmentvariable('USERPROFILE')+'\Desktop\AutoMouse.exe');
    Aufruf;
  end
else
  Form2.Visible := True;
  Form2.DirectoryEdit1.Directory := getenvironmentvariable('PROGRAMFILES')+'\AutoMouse\';
  Form2.Memo1.Clear;
  Form2.Memo1.Lines.Add(TempDir);
  Form2.Memo1.Lines.Add(TempProg);
end;

Code: Alles auswählen

 
{ TForm2 } 
procedure TForm2.Button1Click(Sender: TObject);
begin
  CopyFile(Memo1.Lines[1],DirectoryEdit1.Directory+Memo1.Lines[2]);
end;   
Irgendetwas scheint falsch zu sein..

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Benutzer soll Speicherort selbst wählen

Beitrag von m.fuchs »

Boneless hat geschrieben:Ich hab jetzt eher das DirectoryEdit im Fokus gehabt. Ich will ja nur den Pfad vom Benutzer ändern lassen, wohin etwas dann kopiert wird. Das Programm (der Name und die Endung) bleibt gleich, nicht aber der Pfad.
Jo, das funktioniert ja ähnlich.
Boneless hat geschrieben:
theo hat geschrieben:Vielleicht wäre auch ein Installer wie InnoSetup geeignet für dein Anliegen?
Meinste? Für eine kleine EXE, die nur kopiert werden soll, so einen Aufwand? :lol: Ich weiß nicht...
Wenn es wirklich nur das Kopieren ist, könnte ein Installer etwas übertrieben sein. Zumindest wenn man sich auch erst einarbeiten muss. Vorteil wäre dann solche Zusatzfeatures wie automatischer Uninstaller und Anlegen von Startmenüeinträgen.
Boneless hat geschrieben:Nun bin ich ja schon soweit, dass mein Programm irgentwie nicht auf die EXE (die kopiert werden soll) zugreifen kann.
[...]

Code: Alles auswählen

 
  TempDir := 'data\Programme\AutoMouse.exe';
 
Nur eine Vermutung: reicht da wirklich der relative Pfad aus? Probiere es mal mit:

Code: Alles auswählen

 
  TempDir := Application.Location + 'data\Programme\AutoMouse.exe';
 
Zuletzt geändert von m.fuchs am Fr 7. Nov 2014, 17:14, insgesamt 1-mal geändert.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
theo
Beiträge: 10926
Registriert: Mo 11. Sep 2006, 19:01

Re: Benutzer soll Speicherort selbst wählen

Beitrag von theo »

Boneless hat geschrieben:
theo hat geschrieben:Vielleicht wäre auch ein Installer wie InnoSetup geeignet für dein Anliegen?
Meinste? Für eine kleine EXE, die nur kopiert werden soll, so einen Aufwand? :lol: Ich weiß nicht...
Naja, dann kann man sich auch fragen, warum du das überhaupt willst.
Wozu muss eine Exe auf dem Desktop liegen? (Falls Windows das überhaupt noch zulässt, bin da nicht mehr so fit).
Wäre eine Verknüpfung nicht besser?

Boneless
Beiträge: 52
Registriert: So 1. Dez 2013, 14:15
OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
CPU-Target: 64Bit
Wohnort: Ostsee

Re: Benutzer soll Speicherort selbst wählen

Beitrag von Boneless »

m.fuchs hat geschrieben:Nur eine Vermutung: reicht da wirklich der relative Pfad aus? Probiere es mal mit:

Code: Alles auswählen

TempDir := Application.Location + 'data\Programme\AutoMouse.exe';
Also ein Fehler ist es nicht.
Ohne Application.Location kommt die Fehlermeldung,wenn ich in Form2 auf Button1 klicke: Unable to open file "\AutoMouse.exe"
und mit Application.Location kommt die Fehlermeldung: Unable to open file "\data\Programme"

:D

@ theo: Pass auf, es ist so. Das Programm, welches mir Probleme bereitet und dafür zuständig ist, dass eine kleine EXE kopiert werden soll, landet später MIT dieser kleinen EXE u.a. auf eine CD / DVD und das Programm kann man dann entweder gleich von der CD / DVD aus starten oder -wenn es denn jemand möchte- sich gleich dann auf den eigenen PC kopieren, sodass man nicht immer die CD / DVD einwerfen muss

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

Benutzeravatar
theo
Beiträge: 10926
Registriert: Mo 11. Sep 2006, 19:01

Re: Benutzer soll Speicherort selbst wählen

Beitrag von theo »

Lass dir doch mit ShowMessage mal anzeigen, was Application.Location ausspuckt.
Damit kannst du den Pfad schon basteln.
Bei deinen Pfaden fehlt mir ein Laufwerk "C:\" oder sowas, bist doch auf Windows, oder?

Ein Installer wäre auch für deinen Fall trotzdem besser. Verknüpfungen, Uninstall etc..

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Benutzer soll Speicherort selbst wählen

Beitrag von m.fuchs »

Achso, da fällt mir noch etwas auf: in deiner Variable TempProg steht immer nur 'Automouse.exe'. Da wird nicht der Pfad aus dem DirectoryEdit1 vorgesetzt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Boneless
Beiträge: 52
Registriert: So 1. Dez 2013, 14:15
OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
CPU-Target: 64Bit
Wohnort: Ostsee

Re: Benutzer soll Speicherort selbst wählen

Beitrag von Boneless »

OK. Hab mir meine Pfade gebaut. Er findet sie jetzt.

Aber wenn ich die EXE an einen Ort hinkopier, wo zum Beispiel der Ordner nicht erstellt wurde bzw. nicht existiert, streikt er. Muss ich irgendwelche Parameter hinzufügen oder sowas?

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}


Boneless
Beiträge: 52
Registriert: So 1. Dez 2013, 14:15
OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
CPU-Target: 64Bit
Wohnort: Ostsee

Re: Benutzer soll Speicherort selbst wählen

Beitrag von Boneless »

OK habe das Problem mit FileExists gelöst. :)

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

Antworten