Theard Window / Chatfenster / Nachrichtenemfang

Für allgemeine Fragen zur Programmierung mit PureBasic.
SpecialDXX
Beiträge: 29
Registriert: 08.07.2007 17:52
Kontaktdaten:

Theard Window / Chatfenster / Nachrichtenemfang

Beitrag 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 ; )
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Theard Window / Chatfenster / Nachrichtenemfang

Beitrag 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....
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
SpecialDXX
Beiträge: 29
Registriert: 08.07.2007 17:52
Kontaktdaten:

Re: Theard Window / Chatfenster / Nachrichtenemfang

Beitrag 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?
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Theard Window / Chatfenster / Nachrichtenemfang

Beitrag 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)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
SpecialDXX
Beiträge: 29
Registriert: 08.07.2007 17:52
Kontaktdaten:

Re: Theard Window / Chatfenster / Nachrichtenemfang

Beitrag 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$)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Theard Window / Chatfenster / Nachrichtenemfang

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
SpecialDXX
Beiträge: 29
Registriert: 08.07.2007 17:52
Kontaktdaten:

Re: Theard Window / Chatfenster / Nachrichtenemfang

Beitrag 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$)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Theard Window / Chatfenster / Nachrichtenemfang

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Theard Window / Chatfenster / Nachrichtenemfang

Beitrag 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
a²+b²=mc²
SpecialDXX
Beiträge: 29
Registriert: 08.07.2007 17:52
Kontaktdaten:

Re: Theard Window / Chatfenster / Nachrichtenemfang

Beitrag von SpecialDXX »

Doch sie ließt jeden Parameter richtig aus.

Hat jemand noch eine Idee zum Problem 2. ?
Antworten