| Autor |
Beitrag |
chris_davidi
      
Beiträge: 76
Windows 98 SE
Delphi 3
|
Verfasst: Di 09.09.03 12:51
Warum funktioniert das nicht. Kann mir jemand helfen? Es geht mir in diesem Fall um die GetCurrentDir Funktion. Direkter Pfad klappt, aber dies nicht, habe schon vieles probiert...
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.SpeedButton1Click(Sender: TObject); begin ShellExecute(Application.Handle, 'open', 'getcurrentdir\transfer.bat', nil, nil, SW_SHOW); end; |
Danke im Voraus. 
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 09.09.03 13:05
Vielleicht weil "GetCurrentDir" der Name einer Funktion ist, in deinem Beispiel aber als String (und damit als Verzeichnisname) miss-interpretiert wird?
Darüber hinaus kann "GetCurrentDir" in die Hose gehen, weil das aktuelle Verzeichnis (= ermittelt mit der Funktion) nicht mit dem Ordner identisch sein muss, in dem sich die Batchdatei befindet. Liegt diese BAT-Datei zufällig im Ordner deines Programms, das den gezeigten ShellExecute-Befehl benutzt? Dann mach dich mal bitte über EXTRACTFILEPATH schlau.
Gruß.
|
|
chris_davidi 
      
Beiträge: 76
Windows 98 SE
Delphi 3
|
Verfasst: Do 11.09.03 08:55
Hi...
Ich bekomme ExtractFile Pfad so angewendet, dass ich es verschieden einsetzen kann, jedoch kann ich den Pfad, welchen ich damit festgelegt habe nicht als Variable in ShellExecute einbinden.
Kannst du mir ein Beispiel geben, wie du es machen würdest?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 11.09.03 09:06
| chris_davidi hat folgendes geschrieben: | Ich bekomme ExtractFile Pfad so angewendet, dass ich es verschieden einsetzen kann,
|
Muß ich diesen Teilsatz verstehen?
| Zitat: |
jedoch kann ich den Pfad, welchen ich damit festgelegt habe nicht als Variable in ShellExecute einbinden.
|
Warum nicht? Falls Delphi eien Fehlermeldung ausspuckt, verrat sie uns ja nur nicht, könnte ja helfen dein Problem zu lösen.
|
|
JustusJonas
      
Beiträge: 222
|
Verfasst: Do 11.09.03 09:31
Versuch's einfach mit ExtractFilePath oder ExtractFileDir und schreibe das dann in eine Variable. Am Ende musst du im ShellExecute nur noch die beiden Strings zusammenführen!
Wenn du eine Batch starten möchtest, die eh im selben Verzeichnis steht, musst du nur den Dateinamen angeben, sonst nichts!
Greetz
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 11.09.03 09:59
Ich hab egerade meine Glaskugel beschwört. ShellExecute mag den String wohl nicht. Caste in mal zu einem PChar oder zu einen Zeiger auf einen String.
|
|
chris_davidi 
      
Beiträge: 76
Windows 98 SE
Delphi 3
|
Verfasst: Do 11.09.03 10:14
Sorry, habe mich komisch ausgedrückt.
Also, ich habe mit ExtractPfad ein Verzeichniss bestimmt. Dieses ist als CurrentDir festgelegt. Ich kann zum Beispiel bei der Komponente ZIP-Master das CurrentDir einbinden und es funktioniert.
Bei ShellExecute kann ich es einbinden, jedoch funktioniert nichts. Es kommt kein Fehler von Delphi, aber es wird nicht gefunden. Kann es also sein, dass dies allgemein nicht funktioniert, sprich, dass man in ShellExecute nur direkte Angaben zum Verzeichnis (C:\Test) machen muss und dies also nicht durch eine Varibale wie CurrentDir, welche man vorher per ExtractPfad festgelegt hat bestimmen?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 11.09.03 10:16
Sicher geht das. Zeig mal Code.
|
|
chris_davidi 
      
Beiträge: 76
Windows 98 SE
Delphi 3
|
Verfasst: Do 11.09.03 12:08
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.SpeedButton1Click(Sender: TObject); var CurrentDir: String; begin CurrentDir := ExtractFilePath('C:\test'); ShellExecute(Application.Handle, 'open', '+ CurrentDir\transfer.bat', nil, nil, SW_SHOW); end; |
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 11.09.03 12:17
Autsch. Paß auf, dass dich keiner wegen Körperverletzung anzeigt.
Strings konkateniert man mit dem Plus-Operator:
Delphi-Quelltext 1: 2: 3: 4:
| var s, t: String; begin s := t + 'Hello world'; |
|
|
JustusJonas
      
Beiträge: 222
|
Verfasst: Do 11.09.03 14:12
Würde bei dir dann so aussehen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.SpeedButton1Click(Sender: TObject); var CurrentDir: String; begin CurrentDir := ExtractFilePath('C:\test'); ShellExecute(Application.Handle, 'open', CurrentDir + '\transfer.bat', nil, nil, SW_SHOW); end; |
Aber irgendwie verstehe ich das nicht so ganz! In der DelphiHilfe steht zu ExtractFilePath folgendes:
| Zitat: | | ExtractFilePath extrahiert die Laufwerks- und Verzeichnisinformationen aus einem Dateinamen. |
Wenn du eh nur "C:\Test" an ExtractFilePath übergibst, wieso schreibst du das dann nicht gleich in die ShellExecute????
Greetz
|
|
chris_davidi 
      
Beiträge: 76
Windows 98 SE
Delphi 3
|
Verfasst: Do 11.09.03 14:16
Ich schreibe es nicht in ShellExecute, weil ich später auch noch andere Programme starten will... Sonst müsste ich es bei 10 zu startende Programme 10 mal den Pfad ändern, so nur die Variabe... Das mit einmal ShellExecute ist nur als Beispiel gedacht...
|
|
Popov
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: Do 11.09.03 15:36
Versuch es mal so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.SpeedButton1Click(Sender: TObject); var CurrentDir: String; begin CurrentDir := ExtractFilePath('C:\test\test.txt'); ShellExecute(Application.Handle, 'open', PChar(CurrentDir + 'transfer.bat'), nil, nil, SW_SHOW); end; |
Das PChar ist sehr wichtig. ShellExecute (und auch andere API Funktionen) benötigen in der Regel einen nullterminierten String. Mit einem normalen Szting können die nichts anfangen. Also immer mit PChar konvertieren.
Wobei ExtractFilePath immer den Pfad mit einem Backslash zurückliefert. ExtractFileDir gibt den Pfad ohne Backslash.
Wenn du aber nicht weißt ob der Backslash bereits vorhanden ist oder nicht, dann kannst du es so prüfen und, wenn kein vorhanden, einfügen:
Delphi-Quelltext 1:
| if CurrentDir[Length(CurrentDir)] <> '\' then CurrentDir := CurrentDir + '\'; |
Und gewöhn dir an den Backslash nur an einer Stelle anzufügen, d.h. nicht vor einen FileName, sondern immer hinter einen Pfad. Ein Backslash gehört immer zu dem Pfad und nicht zu dem Dateinamen. Der Dateiname enthällt immer nur den Namen der Datei. Wenn du es nicht so machst, dann weißt du irgendwann nicht mehr wo der Backslash zu finden ist und baust eventuell zwei ein. Das könnte dann so aussehen:
C:\test\\test.txt
_________________ Popov
|
|