Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Allgemeine Pfadangabe unter Delphi (https://www.delphipraxis.net/83252-allgemeine-pfadangabe-unter-delphi.html)

Ykcim 29. Dez 2006 23:31


Allgemeine Pfadangabe unter Delphi
 
Hallo Zusammen,

um es gleich zu zugeben: Ich bin ein Newby und habe gleich zwei Probleme:

Ich habe ein Berechnungsprogramm geschrieben, mit dem man das Volumen einer Schraube berechnen kann. Das ganze erfordert einen ordentlichen Bericht.

Dazu habe ich folgendes Code verwendet, damit ein neues Dokument in Word nach Volage einer Word-Dokumentenvorlage erstellt wird.

Die Datenübergabe ist noch nicht implementiert.

procedure TForm1.BerichtNeuClick(Sender: TObject);
var
Template: OleVariant;
begin
Template:=('D:\Main.dot');
if wordapplication1.Visible=true then
WordDocument1.ConnectTo(WordApplication1.ActiveDoc ument)
else
wordapplication1.Connect;
wordapplication1.Visible:=true;
wordapplication1.Documents.Add(Template,EmptyParam ,EmptyParam,EmptyParam);
end;

Nun zu meinen Problemen:
1. Ich möchte den Dateipfad allgemein gestalten. Das heißt, die Template Datei wird im selben Ordner wie die exe Datei sein, vielleicht in einem Unterordner. Ich habe es in einem anderen Programm mit folgendem Code erreicht: ".\Unterordner\Datei.dat" Das funktioniert aber leider in dem oben beschrieben Code nicht.

2. Wenn die ButtonClick Prozedur das erste Mal ausgeführt, klappt alles wunderbar. Schließe ich Word dann und klicke nocheinmal auf den Button, bricht alles ab mit der Info, Dieser Befehl sei nicht verfügbar, weil keine Dokument geöffnet sei...

Könnt ihr mir helfen? Vielen Dank schon mal. :?:

3_of_8 29. Dez 2006 23:40

Re: Allgemeine Pfadangabe unter Delphi
 
Also den Pfad deiner Anwendung holst du dir mit ExtractFilePath(ParamStr(0)). ;)

Ykcim 30. Dez 2006 00:10

Re: Allgemeine Pfadangabe unter Delphi
 
Hallo 3_of_8
erst einmal danke für Deine schnelle Antwort. Aber ich glaube, dass sie nicht zu meinem Problem passt, daher versuche ich es verständlicher zu erklären.

Wenn Das Programm fertig ist, dann soll es weitergegeben werden. Und da ich nicht weiß, wo der Anwender es dann speichert, weiß ich auch nicht den Pfad der Main.dot und kann ihn somit nicht im Programm hinterlegen. Also möchte ich ihn allgemein gestalten, wie zum Beispiel: Die Datei ist im gleichen Verzeichnis wie die Programm exe Datei meines Programms.

So habe ich es in einem anderen Programm gemacht, in dem Zeichnungen angezeigt werden, die in dem gleichen Ordner wie meine exe Datei ist - im Unterordner Images:

Delphi-Quellcode:
procedure TVolumensberechnung.KoerperChange(Sender: TObject);
begin
if Koerper.Items.Strings[Koerper.ItemIndex]='Zylinder' then
Image1.Picture.LoadFromFile('.\images\ZylinderNEU.bmp')
else
.
.
.
Vielen Dank

EDatabaseError 30. Dez 2006 00:13

Re: Allgemeine Pfadangabe unter Delphi
 
Ich verstehe dein Problem immer noch nicht ;-) das was 3_of_8 gesagt hat liefert dir doch den Pfad in dem deine Exe liegt was brauchst du denn noch ?!?

Ykcim 30. Dez 2006 00:22

Re: Allgemeine Pfadangabe unter Delphi
 
Hi,
vielleicht bin ich auch nur zu doof es zu verstehen.

Wenn ich DIr mein Programm geben würde, dann würde ich die Datei Main.dot in dem Progammordner speichern. z.B.: C:\Programme\Test
Die Pfadangabe im Programmcode für die Main.dot wäre also: C:\Programme\Tets\Main.dot
Wenn Du das Programm aber woanders speicherst z.B.: D:\Anwendungen\Test dann funktioniert mein Programm ja nicht mehr, denn die Pfadangabe müsste lauten D:\Anwendungen\Test\Main.dot

Und deshalb kann ich den Dateipfad nicht so angeben.

Habe hier mal den kompletten Code der Procedure kopiert...

Delphi-Quellcode:
procedure TForm1.BerichtNeuClick(Sender: TObject);
var
Template: OleVariant;
begin
Template:=('D:\Privat\Software Entwicklung\Main.dot');
if wordapplication1.Visible=true then
WordDocument1.ConnectTo(WordApplication1.ActiveDocument)
else
wordapplication1.Connect;
wordapplication1.Visible:=true;
wordapplication1.Documents.Add(Template,EmptyParam,EmptyParam,EmptyParam);
end;
Aber an dieser Stelle nochmal: Ich bin ein Newby und vielleicht nur zu doof die Antwort zu verstehen!

Vielen Dank

EDatabaseError 30. Dez 2006 00:25

Re: Allgemeine Pfadangabe unter Delphi
 
ahh...

du müsstest den pfad der Main.dot z.b. in der Registry speichern und eben einmal zuweisen - sobald dein Programm sie nicht mehr findet sagst du dem benutzer das er (via Opendialog) den Pfad der Main.dot angeben soll - dann speicherst du ihn wieder und hast ihn so als variable

Ykcim 30. Dez 2006 00:32

Re: Allgemeine Pfadangabe unter Delphi
 
Danke für die Antwort! Aber bis ich die verstanden habe, muss ich mich erst mal drei Tage mit dem, was dafür nötig beschäftigen...

Ich hatte gehofft, dass es einfacher ginge, so, wie ich es oben mit den Images gemacht habe. Da hatte ich das gleiche Problem und habe es mit ./ in den Griff bekommen, dass das Programm im eigenen Ordner die Datei sucht...

Gibt es soetwas nicht auch für andere Pfads.

Habe die Procedur meiner vorherigen Antwort noch zugefügt.

Danke

EDatabaseError 30. Dez 2006 00:33

Re: Allgemeine Pfadangabe unter Delphi
 
Zitat:

Zitat von Ykcim
Danke für die Antwort! Aber bis ich die verstanden habe, muss ich mich erst mal drei Tage mit dem, was dafür nötig beschäftigen...

Ich hatte gehofft, dass es einfacher ginge, so, wie ich es oben mit den Images gemacht habe. Da hatte ich das gleiche Problem und habe es mit ./ in den Griff bekommen, dass das Programm im eigenen Ordner die Datei sucht...

Gibt es soetwas nicht auch für andere Pfads.

Habe die Procedur meiner vorherigen Antwort noch zugefügt.

Danke

schau dich hier ein bisschen im forum um da wirst du alles was nötig ist finden... ;-)

Ykcim 30. Dez 2006 00:48

Re: Allgemeine Pfadangabe unter Delphi
 
Okay, okay, ich habe es geschnallt... :wall:

Ich hätte doch mal 5 Minuten länger über die Antwort von 3_of_8 nachdenken sollen.

Hier die Lösung:

Delphi-Quellcode:
procedure TForm1.BerichtNeuClick(Sender: TObject);
var
Template: OleVariant;
Pfad:string;
begin
Pfad:=ExtractFilePath(ParamStr(0));
Template:=(Pfad+'Main.dot');
if wordapplication1.Visible=true then
WordDocument1.ConnectTo(WordApplication1.ActiveDocument)
else
wordapplication1.Connect;
wordapplication1.Visible:=true;
wordapplication1.Documents.Add(Template,EmptyParam,EmptyParam,EmptyParam);
end;
Vielen Dank für die Hilfe.

Ykcim

Christian Seehase 30. Dez 2006 01:14

Re: Allgemeine Pfadangabe unter Delphi
 
Moin Ykcim,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Zitat:

Zitat von Ykcim
dass es einfacher ginge, so, wie ich es oben mit den Images gemacht habe.

mit dem relativen Pfad ('.\images\ZylinderNEU.bmp') hast Du aber einen sehr gefährlichen Weg beschritten, denn dieser wird relativ zum Arbeitsverzeichnis gesehen.
Legt sich jemand einen Link an, und gibt dort ein anderes Arbeitsverzeichnis an, würde die Datei nicht mehr gefunden werden.
In diesem Falle könnte man sagen:
Prima, dann kann man durch ein anderes Arbeitsverzeichnis verschiedenen Sätze von Daten verwenden.

Leider kann sich das Arbeitsverzeichnis aber auch durch die Verwendung von Open-/Savedialogen ändern, was bei der Verwendung von relativen Pfaden zu recht "interessanten" (;-)) Ergebnissen führen kann.
Sobald also die Gefahr besteht, dass sich das Arbeitsverzeichnis während des Programmlaufes ändert, sollte man auf relative Pfad verzichten.
(Und da das auch im Nachhinein durch eine Programmänderung geschehen kann, würde ich prinzipiell auf relative Pfade verzichten)

Ykcim 30. Dez 2006 09:57

Re: Allgemeine Pfadangabe unter Delphi
 
Hallo Chris

vielen Dank für Deine Erklärungen. Das waren Infos, die jemand, der Delphi durch learning by doing und in Fornen lesen (das war mein erstes Post-vielen Dank für das willkommen heißen) lernt, nie herausgefunden hätte.

Aber was sagst Du denn zu der Lösung, die ich jetzt zum Schluß beschrritten habe. Ist nicht sicher?

Vielen Dank

Ykcim

3_of_8 30. Dez 2006 10:21

Re: Allgemeine Pfadangabe unter Delphi
 
Doch, die letzte dürfte eigentlich passen.

Jedenfalls von den Pfaden her. Nur bin ich mir nicht so ganz sicher, was das OLE-Zeug betrifft, damit hab ich mich noch nie beschäftigt.

Christian Seehase 30. Dez 2006 14:12

Re: Allgemeine Pfadangabe unter Delphi
 
Moin Ykcim,

Die Problematik mit relativen Pfaden und Arbeitsverzeichnis ist unabhängig von der verwendeten Programmiersprache.

jbg 30. Dez 2006 14:49

Re: Allgemeine Pfadangabe unter Delphi
 
Zitat:

Zitat von Ykcim
Pfad:=ExtractFilePath(ParamStr(0));
Template:=(Pfad+'Main.dot');

Viel Spaß bei Windows Vista bzw. Win2000/XP ohne Schreibrechte auf das Verzeichnis.

Folgender Code liefert dir das "C:\Dokumente und Einstellungen\BENUTZER\Anwendungsdaten\MYAPPNAME" Verzeichnis.
Delphi-Quellcode:
uses
  Windows, ShlObj;

function GetAppDataDir: string;
var
  Malloc: IMalloc;
  pidl: PItemIDList;
  Buffer: string;
begin
  Result := '';
  { Windows 95 compatible way, Win98 supports SHGetSpecialFolderPath() }
  SHGetMalloc(Malloc);
  if SHGetSpecialFolderLocation(Application.Handle, CSIDL_APPDATA, pidl) = S_OK then
  begin
    try
      SetLength(Buffer, MAX_PATH + 1);
      if SHGetPathFromIDList(pidl, PChar(Buffer)) then
        Result := ExcludeTrailingPathDelimiter(Copy(Buffer, 1, StrLen(PChar(Buffer))));
    finally
      Malloc.Free(pidl);
    end;
  end;
end;

function GetMyAppDataDir(const AppName: string): string;
begin
  Result := GetAppDataDir;
  if AppName <> '' then
    Result := Result + '\' + AppName;
  ForceDirectories(Result); // create directory structure
end;


...
begin
  Template := GetMyAppDataDir('MyAppName') + '\Main.dot';
end;

phXql 30. Dez 2006 15:16

Re: Allgemeine Pfadangabe unter Delphi
 
Zitat:

Zitat von jbg
Viel Spaß bei Windows Vista bzw. Win2000/XP ohne Schreibrechte auf das Verzeichnis.

Für was brauch ein normaler User Schreibrechte auf ein Template?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz