Steuerung mehrerer Fensterinhalte

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

danibert

Betreff: Steuerung mehrerer Fensterinhalte

BeitragDo, Mai 27, 2010 22:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich schreibe an einem Programm, das mit einem Server kommuniziert.
Das Hauptprogramm:
Code: [AUSKLAPPEN]
Import maxgui.drivers
Strict

' Include-Dateien einbinden
Include "include/httpPost.bmx"


' Fenster anzeigen

Local mainWindow:TGadget=CreateWindow("Fenstertitel", 500,500,700,450, Null, WINDOW_TITLEBAR)
Local panel_Logo:TGadget=CreatePanel(0,0,700,68, mainWindow)

   ' Panel 1
   Global panel_1:TGadget=CreatePanel(10,78,674,330, mainWindow)   
   HideGadget panel_1      
   Local labelAppStart01:TGadget=CreateLabel("Programm wird gestartet. Bitte warten", 10, 120, 664, 100, panel_1, LABEL_CENTER)
   
   ' Panel 2
   Global panel_2:TGadget=CreatePanel(10,78,674,330, mainWindow)   
   HideGadget panel_2      
   Local labelAppStart02:TGadget=CreateLabel("Programm läuft", 10, 120, 664, 100, panel_2, LABEL_CENTER)


' Server-Verbindung
Function httpSend$(srvIn00:String, srvIn01:String, srvIn02:String)
      
   Local http:THTTP = New THTTP
   If http.Open("localhost")    
            
      Local arr:String = Trim(http.Post("/entwicklung/test1.php", ["in00", "in01", "in02"] , [srvIn00, srvIn01, srvIn02] ))      
         
      Return arr
      
   End If
   http.Close()
End Function


' Fenster-Steuerung
Function setNewPage:Int(newPage:Int)

   ' Alle Seiten verstecken
      HideGadget panel_1; HideGadget panel_2

   ' Angegebene Seite sichtbar machen
   Select newPage
      
      Case 1   ' Panel 1
         ShowGadget panel_1      
      
      Case 2   ' Panel 2
         ShowGadget panel_2            

   End Select
End Function


' Programmstart

   setNewPage(1)
   
   Local fromServer:String = httpSend("variable 1", "variable 2", "variable 3" )
   If fromServer
      setNewPage(2)
   EndIf
         

Repeat
  WaitEvent()
  Select EventID()
  Case EVENT_WINDOWCLOSE
     End
   End Select
Forever


Die HTTP POST Schnittstelle zum Server
Code: [AUSKLAPPEN]
Type Thttp
   Field sock:TSocket
   Field stream:TStream
   Field host:String
   Field agent:String = "exThttp/1.0"
   Field autoClose:Int
   
   Method Open:Int(host:String, autoClose:Int = False)
      Self.sock = CreateTCPSocket()
      If ConnectSocket(Self.sock, HostIp(host), 80)
         Self.host = host
         Self.stream = CreateSocketStream(Self.sock)
         Self.autoClose = autoClose
         Return True
      Else
         Return False
      End If
   End Method
   
   Method Post:String(page:String = "", keys:String[] , values:String[] )
      Local buffer:String
      Local data:String
      Local i:Int
      For i = 0 To keys.Length - 1
         data:+UrlEncode(keys[i] ) + "=" + UrlEncode(values[i] ) + "&"
      Next
      data = Left(data, Len(data) - 1)
      WriteLine(stream, "POST /" + page + " HTTP/1.0~nHost: " + Self.host + "~nUser-Agent: " + Self.agent + "~nContent-Length: " + Len(data) + "~nContent-Type: application/x-www-form-urlencoded~n~n" + data)
      While Not Eof(stream)
         buffer:+ReadLine(stream) + "~n"
      Wend
      If autoClose Close()
      Return Left(buffer, Len(buffer) - 1)
   End Method
   
   Method Close()
      If Self.stream CloseStream(Self.stream)
      If Self.sock CloseSocket(Self.sock)
   End Method

   Function UrlEncode:String(url:String)
      Local buffer:String
      Local Char:Int
      Local i:Int
      For i = 1 To Len(url)
         Char = Asc(Mid(url, i, 1))
         If(Char >= 48 And Char <= 57) Or (Char >= 65 And Char <= 90) Or (Char >= 97 And Char <= 122) Or Char = 43 Or Char = 45 Or Char = 46 Or Char = 95
            buffer = buffer + Chr(Char)
         Else
            buffer = buffer + "%" + Right(Hex(Char), 2)
         End If
      Next
      Return buffer
   End Function
   
   Function UrlDecode:String(url:String)
      Local sHex:String = "0123456789ABCDEF"
      Local buffer:String
      Local i:Int
      For i = 1 To Len(url)
         If Mid(url, i, 1) = "%"Then
            buffer = buffer + Chr(Instr(sHex, Mid(url, i + 1, 1)) Shl 4 + Instr(sHex, Mid(url, i + 2, 1)) - 17)
            i:+2
         Else
            buffer = buffer + Mid(url, i, 1)
         End If
      Next
      Return buffer
   End Function   
End Type


Hierzu habe ich 2 Fragen
1.) Ich starte das Programm und rufe meine Funktion setNewPage(1) auf. Der entsprechende Inhalt soll nun angezeigt werden, bis die Kommunikation mit dem Server abgeschlossen ist. Anschließend soll Panel 2 angezeigt werden. Panel 1 wird aber nicht angezeigt. Wenn ich das Script auf dem Server zum Testen so einstelle, dass es erst nach einigen Sekunden antwortet, bleibt mein Programmfenster für diese Zet leer, obwohl der Aufruf von setNewPage(1) vor der Serverkommunikation stattfindet. Ich verstehe nicht, warum das so ist. Ich war der Meinung, das Programm wird der Reihe nach abgearbeitet..... Wie lässt sich das Problem beheben?

2.) Ich würde gerne einen Timeout einbauen, damit das Programm - wenn der Server nich antwortet - nach einigen Sekunden eine Fehlermeldung ausgibt. Ich habe hierzu schon einige Experimente mit dem Timer und auch mit While Wend-Schleifen gemacht. Irgendwie bekomme ich das nicht hin. Ich finde nicht die richtige Stelle, an der ich hier ansetzen soll.

Danke im Voraus für alle Tipps

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group