Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Betriebssysteme (https://www.delphipraxis.net/27-betriebssysteme/)
-   -   Eingabeaufforderung starten (https://www.delphipraxis.net/5247-eingabeaufforderung-starten.html)

S - tefano 29. Mai 2003 15:34


Eingabeaufforderung starten
 
Hi,

ich schreib zur Zeit an einem Programm, mit dem ich java- Klassen über einen Java- Interpreter starten lasse. (normalerweise mach ich das von dem Java- Editor heraus, den ich benutze. Ich würd die aber auch gerne so starten, ohne zuerst den Editor zu öffnen)
Diese Klassen verhalten sich wie DOS- Programme (also keine GUI, einfach nur Konsolenanwendung- in nem Dosfenster).
Wenn ich die Klassen vom Editor aus starte, dann ruft der die Eingabeaufforderung auf, übergibt als einen Parameter den Dateinamen des Interpreters, und dahinter dann für den Interpreter als Parameter wo er die Klasse findet.
Wenn die Klassen durchgelaufen sind (z.B. ne kleine Zinsrechnung), dann gehn sie einfach aus und das Dosfenster is noch da, zurückgekehrt zum Ordner in dem es vorher war.
Ich habe jetzt mal ausprobiert ob man nicht einfach nur den Interpreter mit seinen nötigen Parametern ausführen kann. Klappt auch soweit ganz gut. Wenn allerdings bei dieser Variante die Klasse zu Ende ist, dann verschwindet das Fenster sofort, und der User kann z.B. nicht mehr die letzte Ausgabe lesen.
Das ist mein Problem.
Um dies zu lösen müsste ich entweder dem Fenster des Interpreters sagen, dass es nach Beendigung der Klasse auf nen Befehl zum Schließen warten soll (z.B. Klick aufs X), oder ich muss den Interpreter- Aufruf der Eingabeaufforderung übergeben, weil die ja nach Beendigung der Klasse offen bleibt.
Bei ersterem hab ich partout keine Ahnung wie das gehen soll, und bei zweiterem stehe ich vor dem Problem dass ich nicht weiß, wie ich gewährleisten kann dass mein Programm auf jedem Windows- Rechner die Eingabeaufforderung findet.
Das könnte man einerseits dadurch lösen dass man immer den Systemordner ermittelt und dann die Datei aufruft, aber die Eingabeaufforderung heißt ja -wenn ich mich recht erinnere- nicht auf jeder Windows- Version gleich.
Dann gäbs noch die Möglichkeit einfach "ein keyword", wie z.B. "command" oder "cmd" auszuführen. Das klappt unter Windows XP, aber gibt es diese keywords auch unter Win98, Me, NT und 2000?

Habt ihr andere Lösungsansätze, oder wisst ihr mehr über diese keywords oder wie man den Pfad zur Eingabeaufforderung unter den verschiedenen WindowsVersionen herausfindet?
Wenn ihr eine der anderen Windosen außer XP habt, könntet ihr die keywords ja auch mal ausprobieren und mir dann sagen, welche klappen und welche nicht.

Danke schonmal,

S - tefano

Christian Seehase 29. Mai 2003 15:51

Moin Stefano,

die Umgebungsvariable COMPSEC sollte auf jedem Windowssystem den Pfad zum Commandoprozessor enthalten.
(genaugenommen gilt dies i.d.R. schon seit DOS)

Da dieser normaler Weise aber auch immer im Suchpfad liegt, könntest Du diesen auch mit einem Aufruf von COMMAND.COM, ohne Pfadangabe (!), starten.
Für XP weiss ich es nicht, aber ansonsten gibt es auch bis incl. W2K die COMMAND.COM. Es muss nicht zwingend die CMD.EXE sein, voraussetzt, man kann auf die NT spezifischen Erweitrungen verzichten.

Eine dritte Variante, ähnlich der zweiten:
Du prüfst beim Programmstart die Windowsversion (NT oder nicht) und trägst dann, in Abhängigkeit der Version, den Namen des jeweiligen Commandoprozessors (COMMAND.COM oder CMD.EXE) in eine globale Variable/Feld ein. Die Pfadangabe sollte ja grundsätzlich entfallen können.

chris 29. Mai 2003 18:14

hi,

du könntest auch die konsolenausgabe abfangen und sie in deinem programm anzeigen

S - tefano 29. Mai 2003 19:12

Hi,

habs jetz mal auf Christian Seehases Art ausprobiert. Die Methode an sich is bestimmt ganz gut, aber irgendwie krieg ich das mit dem Starten mit Parametern nicht hin:

Delphi-Quellcode:
Param:= ' -java.exe -classpath "' + strpath + '" "' + strname + '"'; //alles hinter "java.exe" sind Parameter für den Interpreter
ShellExecute(application.Handle, 'open', PChar(commandedit.text), PChar(param), PChar(extractfilepath(interpretedit.Text)), SW_ShowNormal); //in commandedit steht der Shortcut zur Eingabeaufforderung drin (cmd.exe), param siehe oben, und interpretedit.text entält den kompletten Pfad zum Interpreter
Dachte es hilft vielleicht was wenn ich der Eingabeaufforderung sage, in welchem Ordner sie die java.exe findet. Hab vorher kein Verzeichnis übergeben, dafür vor java.exe den kompletten Pfad angegeben.
Aber irgendwie passiert bei diesem Aufruf nix.
Die Eingabeaufforderung geht an, und das wars dann auch. Ich befinde mich dann entweder im Programmordner (wenn ich kein default directory mitgegeben hab) oder im Verzeichnis des Interpreters.
Aber kein Interpreter und kein Java- Programm starten.
Mach ich irgendwas falsch? K, das is wohl klar. Aber wie übergibt man der Eingabeaufforderung denn dann Parameter?

Bis dann,

S - tefano

chris 29. Mai 2003 19:45

hi,

ich habe mal die erfahrung gemacht das ShellExecute die parameter einfach übergangen hat.
ich habe sie dann einfach mit in den 'executablestring' (bei dir commandedit.text) gepackt und die params leer gelassen, danach klappte es dann.
ich habe allerdings keine ahnung mehr unter welchen umständen das damals war, vielleicht hilft es dir ja.

Christian Seehase 29. Mai 2003 20:28

Moin Stefano,

wenn die Java.exe nicht im Suchpfad steht, muss der Pfad mit angegeben werden.
Das - vor der java.exe sollest Du auch mal weglassen, ausserdem braucht der cmd.exe noch ein /c bzw. /k vor dem zu startenden Programm.

S - tefano 29. Mai 2003 20:49

@chris:
Auch ne Idee, werds mal ausprobieren.
@Seehase:
Wofür steht dann das /c oder /k? Gibts noch andere "Schalter" die man übergeben kann/muss?

S - tefano

Christian Seehase 29. Mai 2003 20:53

Moin Stefano,

bei /c wird der Befehl ausgeführt, und die Konsole anschliessend geschlossen, bei /k bleibt sie anschliessend weiter offen.
Das hattest Du doch selber schon geschrieben ;-)

BTW: Ein Blick in die Windows Hilfe zum Thema CMD.EXE kann auch ganz hilfreich sein :mrgreen:

S - tefano 29. Mai 2003 22:05

Hi,

das mit dem /k hat geklappt, den Parameter konnte ich auch seperat übergeben.
Der Aufruf ist fehlgeschlagen, weil die Namen der Verzeichnisse irgendwie zu lang waren. Ich hab sie dann mit ExtractShotPathName ins 8.3 Format gekürzt, jetzt klappt alles.
Danke nochmal!
Ach übrigens, dieses "k" hab ich ja laut dir, Seehase, schon geschrieben... ich glaub du meintest das in meinem ersten Post ;-)
Sollte eigentlich nur Kurzform von "ok" sein, sodass dann der letzte Satz den vorherigen relativiert, wo ich frage ob ich was falsch mache. Aber das war ja klar, sonst hättes ja geklappt.
Aber jetz gehts ja zum Glück.
Vielen Dank :dancer2: :dancer: :bounce1: :dancer: :dancer2:

Bis dann,

S - tefano

S - tefano 29. Mai 2003 22:08

Achja:
Meine Windows- Hilfe hatte zu dem Thema nix parat. Holt die sich solfe Infos aus dem Internet? Das hab ich ihr nämlich verboten...


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:56 Uhr.
Seite 1 von 2  1 2      

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