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







  • Shell Klemens Klarhoelter
    • Re: Shell Klemens Klarhoelter
      • Re: Shell Christian Dorn

Antwort per Email an