Autor Beitrag
chris_davidi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76

Windows 98 SE
Delphi 3
BeitragVerfasst: 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...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
 ShellExecute(Application.Handle, 'open',  'getcurrentdir\transfer.bat'nilnil, SW_SHOW);
end;


Danke im Voraus. :)
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Suche in: Delphi-Forum, Delphi-Library EXTRACTFILEPATH schlau.

Gruß.
chris_davidi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76

Windows 98 SE
Delphi 3
BeitragVerfasst: 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



BeitragVerfasst: 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? :roll:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 222



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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76

Windows 98 SE
Delphi 3
BeitragVerfasst: 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



BeitragVerfasst: Do 11.09.03 10:16 
Sicher geht das. Zeig mal Code.
chris_davidi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76

Windows 98 SE
Delphi 3
BeitragVerfasst: Do 11.09.03 12:08 
ausblenden 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'nilnil, SW_SHOW); 
end;
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 11.09.03 12:17 
Autsch. Paß auf, dass dich keiner wegen Körperverletzung anzeigt. :mrgreen:

Strings konkateniert man mit dem Plus-Operator:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
var
  s, t: String;
begin
  s := t + 'Hello world';
JustusJonas
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 222



BeitragVerfasst: Do 11.09.03 14:12 
Würde bei dir dann so aussehen:

ausblenden 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'nilnil, 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76

Windows 98 SE
Delphi 3
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Do 11.09.03 15:36 
Versuch es mal so:

ausblenden 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'), nilnil, 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:

ausblenden 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