Seite 1 von 2

Theard Window / Chatfenster / Nachrichtenemfang

Verfasst: 04.01.2012 00:46
von SpecialDXX
Hallöle,

mein Problem ist derzeit, dass ich beim programmieren eines Chat-Clients Probleme mit dem eigentlichen Chat-Fenster und dem Nachrichten emfang habe.
1. Problem: Beim schließen vom "Chat-Fenster", schließt auch das "Haupt-Fenster" wo die Liste der Chatpatner enthalten ist. Trotz das jedes Fenster mit #PB_Any geöffnet wird.
2. Problem: Nachrichtenemfang von mehreren Nachrichten auf verschiedenen "Chat-Fenster"'n gleichzeitig. Da bei jedem Kontakt ein eigenes "Chat-Fenster" geöffnet wird und dies in einem Theard, weiß ich nicht genau wie ich einen "zentralen" Emfang einrichten kann und wie ich die Nachrichten in das entsprechende Fenster bekomme. Senden ist schließlich kein Problem, da dies jedes Fenster einzell machen kann. Aber es müssen alle Nachrichten vom Server emfangen werden, da mehrere gleichzeitig auf abgeschicken nachrichten antworten könnten. Zudem müssen sowieso steuerungssignal emfangen werden.
3. Problem: Wenn in einem Nachrichten- ("Chat-Fenster") eine neue Nachricht eingegangen ist sieht man diese nicht, wenn das Fenster nicht geöffnet ist. Wie bringe ich das Fenster bzw. Windows dazu es in der Taskleiste (bzw. Programmleiste) blicken zu lassen?

Code: Alles auswählen

Procedure PvtMessSend(Para$)
  ConnID = Val(StringField(Para$, 1, "/"))
  RUID$  = StringField(Para$, 2, "/")
  ENC$   = StringField(Para$, 3, "/")
  AESKey$= StringField(Para$, 4, "/")
  Debug "CLT PvtMessSend :: ConnID: "+Str(ConnID)
  Debug "CLT PvtMessSend :: RUID$: "+RUID$
  Debug "CLT PvtMessSend :: ENC$: "+ENC$ 
  Debug "CLT PvtMessSend :: AESKey$: "+AESKey$
  
  pri = OpenWindow(#PB_Any, 0, 0, 550, 300, clientname$+" Privat ("+RUID$+")", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If pri
    EditorGadget   (  1,   5,   5, 540, 170, #PB_Editor_ReadOnly)
    Frame3DGadget  (  2,   5, 175, 540,  30, "")
    CheckBoxGadget (  3,  10, 183, 220,  20, "Mit ENTER eine Nachricht abschicken."): SetGadgetState(3, #PB_Checkbox_Checked)
    CheckBoxGadget (  4, 240, 183, 150,  20, "Fenster beim Emfang öffnen."): SetGadgetState(4, #PB_Checkbox_Checked)
    EditorGadget   (  5,   5, 210, 450,  80)
    
    ButtonGadget   ( 10, 460, 210,  85,  25, "Senden")
    ButtonGadget   ( 12, 460, 275,  85,  15, "Encode")
    
    SetGadgetColor (  1, #PB_Gadget_BackColor, RGB(00, 11, 15))
    SetGadgetColor (  1, #PB_Gadget_FrontColor, RGB(255, 255, 255))
    SendMessage_(GadgetID(1),#EM_SETTARGETDEVICE,#Null,#False)
    SetGadgetColor (  5, #PB_Gadget_BackColor, RGB(00, 11, 15))
    SetGadgetColor (  5, #PB_Gadget_FrontColor, RGB(255, 255, 255))
    SendMessage_(GadgetID(5),#EM_SETTARGETDEVICE,#Null,#False)
    
    AddKeyboardShortcut(pri, #PB_Shortcut_Return, 110)
    *eBuffer = AllocateMemory(2401)
    bef$ = "#NULL"
    Repeat
      Event = WindowEvent()
      NetEvent = NetworkClientEvent(ConnID)
      
     ; If GetActiveWindow() <> pri And blk = 2
     ;   blk = 0
     ;   WinBlink(pri, "", 0)
     ; EndIf
              
      If NetEvent
        Select NetEvent
          Case 2
            ReceiveNetworkData(ConnID, *eBuffer, 2401)
            emfTEMP$ = PeekS(*eBuffer, -1, #PB_Ascii)  
            incTemp$ = Mid(emfTEMP$, 4, Len(emfTEMP$)-3)
            If StringField(emfTEMP$, 1, Chr(HEADStart)) = "MES"

            
              HEADER$  = StringField(StringField(incTemp$,2,Chr(HEADStart)),1,Chr(HEADEnde))
              Text.s   = StringField(StringField(incTemp$,2,Chr(TEXTStart)),1,Chr(TEXTEnde))
              CtrlNmb  = Val(StringField(StringField(StringField(HEADER$,1,Chr(BLOCKStart)), 2,Chr(HEADStart)), 1, "/"))
              GroupNmb = Val(StringField(StringField(StringField(HEADER$,1,Chr(BLOCKStart)), 2,Chr(HEADStart)), 2, "/"))
              MDCE$    = StringField(StringField(HEADER$,2,Chr(BLOCKStart)),1,Chr(BLOCKEnde))
              SUID$    = StringField(StringField(incTEMP$, 2, Chr(HEADEnde)), 1, Chr(TEXTStart))
              
              Editor_Color( 1, RGB(255, 255, 255))
              AddGadgetItem( 1, -1, SUID$+" ("+FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss", Date())+"):")
              Editor_Color( 1, RGB(200, 200, 200))
              AddGadgetItem( 1, -1, Text.s)
              SendMessage_(GadgetID(1),#EM_SCROLL,#SB_BOTTOM,0)
         ;     If GetActiveWindow() <> pri
         ;       WinBlink(pri, "F", 0)
         ;       blk = 2
         ;     EndIf
            EndIf
            
          Case 3 ;File
        EndSelect
      EndIf
      Delay(5)
      Select Event
        Case #PB_Event_Menu  
          Select EventMenu()
            Case 110
              Event = #PB_Event_Gadget
              gd = 1
              egid = 10
          EndSelect
          
        Case #PB_Event_Gadget
          If gd <> 1
            egid = EventGadget()
          Else
            egid = 10
            gd = 0
          EndIf        
        
        
          Select egid
            Case 10
              If GetGadgetText(5) <> ""
                SendMESS(ConnID, GetGadgetText(5), RUID$)
              Else

                 
                 
                Editor_Color( 1, RGB(255, 255, 255))
                AddGadgetItem( 1, -1, "Client ("+FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss", Date())+"):")
                ;SetGadgetItemColor(1, -1, #PB_Gadget_FrontColor, RGB(255, 255, 255))
                Editor_Color( 1, RGB(100, 100, 100))
                AddGadgetItem( 1, -1, "Du kannst keine leeren Nachrichten verschicken!")
                SendMessage_(GadgetID(1),#EM_SCROLL,#SB_BOTTOM,0)
                ;SetGadgetItemColor(1, -1, #PB_Gadget_FrontColor, RGB(100, 100, 100))
              EndIf
              ClearGadgetItems(5) 
          
          
          EndSelect
          
      EndSelect
      
      
      
    Until Event = #PB_Event_CloseWindow

  EndIf
Liebe Grüße
Bernd ; )

Re: Theard Window / Chatfenster / Nachrichtenemfang

Verfasst: 04.01.2012 01:08
von Bisonte
Wenn du nur das entsprechende Fenster schliessen willst, das auch das "CloseWindow" Event abgefeuert hat, solltest du

Code: Alles auswählen

Until Event = #PB_Event_CloseWindow and EventWindow(pri)
einfliessen lassen. Dann ein CloseWindow(pri) und fertig ist die Laube...

Zu dem Blinkenden Fenster in der Taskleiste ist in RSBasics WinAPI Library was gewesen... ah da isses :

Code: Alles auswählen

If OpenWindow(0,0,0,500,250,"Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  FlashWindow_(WindowID(0),1)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
und zu dem Nachrichtenempfang... wie sieht es aus, für jeden Thread eine eigene Linklist für die Nachrichten zu nehmen...
so kommen die sich auch nicht in die Quere...

Also ich meine eine zentrale "Empfangsstation" die es dann, je nach Header, in die Listen der einzelnen Threads schmeisst....

Re: Theard Window / Chatfenster / Nachrichtenemfang

Verfasst: 04.01.2012 01:31
von SpecialDXX
Mit Linklist ist eine Idee... aber ich weiß zuvor ja nicht, wieviele "Chat-Fenster" es werden! Je nach dem wie wieviele Freunde er in seiner Buddy Liste hat bzw. er gerade schreibt.

Wo bekomme ich die RSBasics WinAPI Library her?

Re: Theard Window / Chatfenster / Nachrichtenemfang

Verfasst: 04.01.2012 03:28
von Bisonte
Diese "Library" ist keine Userlib, sondern eine Sammlung diverser Windows API Funktionen.

Zu finden auf http://www.rsbasic.de/winapi-library/

Auch als externes Programm (mit Templateübertragung an die IDE) erhältlich ;) (auf selbiger Site)

Re: Theard Window / Chatfenster / Nachrichtenemfang

Verfasst: 04.01.2012 18:05
von SpecialDXX
Aso, dankeschön erstmal. Problem 1 u. 3 sind gelöst! Jetzt weiß ich nur noch net wie ich das mit dem Nachrichtenemfang auf die einzellen Fenster hin bekomme!?

Und er gibt mir sowieso immer wieder ein "Fehler" bzw. der Debugger stopt bei:
Zeile: 665
Die in '@ProcedureName()' angegebene Prozedur hat nicht das benötigte Argument bzw. den Rückgabetyp
Allerdings gibt es keinen Rückgabewert!

Code: Alles auswählen

PvtMeTh$ = Str(ConnID)+"/"+temp2$+"/"+UID$+""+""
                  SendPvtTh= CreateThread(@PvtMessSend(), @PvtMeTh$)

Re: Theard Window / Chatfenster / Nachrichtenemfang

Verfasst: 04.01.2012 19:24
von RSBasic
@SpecialDXX
Bei deiner Thread-Prozedur wird ein Parameter benötigt, also zum Beispiel so:

Code: Alles auswählen

EnableExplicit

Define EventID

Procedure Thread(z)
  
EndProcedure

If OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  CreateThread(@Thread(),0)
  
  Repeat
    EventID=WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf

Re: Theard Window / Chatfenster / Nachrichtenemfang

Verfasst: 04.01.2012 23:04
von SpecialDXX
In meinem letzten Beitrag sieht man, dass ein Parameter übergeben wird!

Code: Alles auswählen

PvtMeTh$ = Str(ConnID)+"/"+temp2$+"/"+UID$+""+""
SendPvtTh= CreateThread(@PvtMessSend(), @PvtMeTh$)

Re: Theard Window / Chatfenster / Nachrichtenemfang

Verfasst: 04.01.2012 23:19
von RSBasic
@SpecialDXX

Code: Alles auswählen

Procedure PvtMessSend(Para$)
Wenn du einen Thread erstellt, dann darf in der Parameterliste deiner Prozedur keinen String als Parameter vorhanden sein. Du kannst nur eine Ganzzahl übergeben. Entweder erstellst du eine globale Zeichenkette (String) oder per Pointer: http://www.purebasic.fr/german/viewtopi ... 16&t=17375

Re: Theard Window / Chatfenster / Nachrichtenemfang

Verfasst: 05.01.2012 01:11
von Kiffi
SpecialDXX hat geschrieben:In meinem letzten Beitrag sieht man, dass ein Parameter übergeben wird!
und wie sieht Deine Thread-Prozedur aus? Ich wette,
dass sie keinen Parameter entgegennimmt: http://goo.gl/A9Slf

Grüße ... Kiffi

Re: Theard Window / Chatfenster / Nachrichtenemfang

Verfasst: 05.01.2012 01:49
von SpecialDXX
Doch sie ließt jeden Parameter richtig aus.

Hat jemand noch eine Idee zum Problem 2. ?