Ich habe schon lange nichts mehr mit Shells gemacht – und noch nie
unter Windows! Wenn mich die Erinnerung nicht täuscht, löst eine
interaktive Shell den DataAvailable-Event aus, wenn Sie Dir Daten
liefert, bzw. auf eine Eingabe wartet. D. h. Du musst die Write-
Befehle dort unterbringen. Die Write-Befehle werden in deinem Code
nicht ausgeführt, weil die Zeile [app.mshell(0).execute "cmd"] noch
nicht abgearbeitet ist, d. h. die Shell arbeitet noch den Cmd-Befehl
ab. Und wenn dieser auf eine Eingabe deinerseits wartet, kannst Du
warten, bis Du schwarz wirst ;-)
Ah, ich sehe gerade, dass Du das Beispiel aus der Sprachreferenz
herumspielst. Nun, ich glaube nicht dass der Code da richtig ist. Ich
kann mich zwar auch irren, aber es wäre leider nicht das erste Mal,
dass in der Sprachreferenz veraltete/nicht lauffähige Beispiele
auftauchen...
Und noch ein Tipp:
Die plattformspezifischen Codeteile solltest Du in ein #if-Statement
einbetten, nicht in einen normalen if-Block. Letzteres funktioniert
zwar auch, allerdings wird der gesamte Code in sowohl der Windows- als
auch der Mac-Anwendung vorhanden sein. Nutzt Du aber einen #if-Block,
wird in die Mac-Anwendung nur der Mac-spezifische Code eingebaut,
entsprechen das Gleiche für die Windows-Anwendung.
Also, anstatt
if TargetMacOS = true then
...
elseif TargetWin32 = true then
...
end if
schreibst Du einfach
#if TargetMacOS = true then
...
#elseif TargetWin32 = true then
...
#endif
Beachte die leicht andere Schreibweise beim Schließen des Blocks ("end
if" vs. "#endif"). Und wo wir schon mal dabei sind: das "= true" ist
in beiden Versionen eigentlich überflüssig, im #if-Statement kannst Du
zusätzlich auch die "then" weglassen. Aber das ist im Endeffekt nur
eine Frage des persönlichen Geschmacks. Ich tippe immer so wenig wie
möglich ;-)
Am 26.10.2009 um 09:09 schrieb Klemens Klarhoelter:
Hi folks,
ich habe die Routine wie folgt angepasst:
If Key = Chr(13) Then
if TargetMacOS = true then // v0.1.4
If Not app.mshell(0).IsRunning Then
app.mshell(0).Execute "sh"
End If
elseif TargetWin32=true then
If Not app.mshell(0).IsRunning Then
app.mshell(0).Execute "cmd"
End If
end if
app.mshell(0).Write ShellInput.text
app.mshell(0).Write Chr(13)
ShellInput.Text = ""
Return True
Else
Return False
End If
und nun wird der "cmd" Befehl ausgeführt aber nicht die folgenden
write Befehle. Warum?
Klemens
Am 26.10.2009 um 08:25 schrieb Klemens Klarhoelter:
Hi folks,
ich finde in der RB Beschreibung keinen Hinweis zu Interactive
Shells, dass diese nicht unter WindowsXP funktioniert.
Unter MAC OS funktioniert es ohne Probleme:
mShell = New Shell
mShell.Mode = 2
If Key = Chr(13) Then
If Not mShell.IsRunning Then
mShell.Execute "sh"
End If
mShell.Write InputField.Text
mShell.Write Chr(13)
InputField.Text = ""
Return True
Else
Return False
End If
Hat einer Erfahrungen damit gemacht?
Klemens
Gruß
Christian
----------------------------------------
Christian Dorn
realbasic {a} online.de
REALbasic 2009r3 Studio
iMac 3.06 GHz Intel Core 2 Duo, 4 GB RAM
PowerMac G5 2x2GHz, 1.5 GB RAM
Mac OS X 10.6.1
Ubuntu Linux 9.04 on Parallels Desktop 4.0
Kernel 2.6.28-15-generic
----------------------------------------