Seite 2 von 3

Verfasst: 11.06.2006 20:48
von mk-soft
Trage in die ListViewGadet die ClientID mir der Breite 0 ein und suche bei Disconnect die ClientID.
Oder einfacher die ganze ListView löschen und neu alles eintragen. "ClearGadgetItemList(#Gadget)"

FF :wink:

P.S.
Break 2

Code: Alles auswählen

count.l = CountGadgetItems(#ListPlayer) - 1
        ForEach PlayerS()
          For i = 0 To count
            If acc_name = GetGadgetItemText(#ListPlayer, i, 0)
              RemoveGadgetItem(#ListPlayer, i)
              count - 1
              Break 2
            EndIf
          Next i 
        Next
        

Verfasst: 11.06.2006 21:11
von cofter
Wie meinst du das mit ClientID in das ListViewGagdget mit Breite 0? :?
Kann ich dort verschiedene Spalten erstellen?

:coderselixir:

Verfasst: 11.06.2006 21:40
von mk-soft
Ops,

Habe es mit ListIcon verwechselt. Packe den Eintrag mit #TAB$ nach hinten.

Verfasst: 12.06.2006 13:08
von cofter
Hi,
ich habe mir gestern schon den ganzen Tag den Kopf zerbrochen und heute scheint es auch wieder Kopfschmerzen zu geben.
Ich bekomme ich einfach nicht hin. :(

Ich habe eine Nickliste erstellen und möchte jetzt die jeweiligen Nicks aus meiner Liste entfernen sobald diese diconnecten.
Dafür habe ich eine Schleife innerhalb einer Procedure geschrieben.
Die Foreach soll die Liste PlayerS() durchlaufen, count.l zählt wieviel einträge im ListVewGadget enthalten sind.
Daraus mache ich eine For-Schleife und gehe die PlayerS()\PlayerID durch bis zu dem Punkt wo eine übereinstimmung auftritt.
Und entferne das Item aus dem ListViewGadget und danach das Element aus der LinkedList.
So war jedenfalls der Plan.
Leider funktioniert das nicht so wie es soll.
Ich hoffe mir kann noch jemand einen Tip geben, so langsam bin ich wirklich verzweifelt. :cry:

Code: Alles auswählen

        count.l = CountGadgetItems(#ListPlayer) - 1  
          ForEach PlayerS()    
           For i = 0 To count
             If Str(PlayerS()\PlayerID) = StringField(GetGadgetItemText(#ListPlayer, i, 0),2,";")
               If PlayerS()\PlayerName = StringField(GetGadgetItemText(#ListPlayer, i, 0),1,";")
                DeleteElement(PlayerS())
               EndIf
               RemoveGadgetItem(#ListPlayer, i)
               count - 1
               Break 2
             EndIf
           Next i         
          Next 
 

Verfasst: 12.06.2006 14:57
von Karl
Dein Problem ist dein ListIterator. Der ist nicht nur falsch implementiert, sondern auch unnütz. Wenn du den nur verwenden willst, um eine Position im ListIconGadget ausfindig zu machen, dann lass den lieber weg.

Wenn du nun nämlich einen User aus dem Listenanfang oder mittendrin entfernen willst, dann musst du deine Dinger schön umhängen bzw. umnummerieren. Dann kannst du die LL auch gleich weglassen und alles hübsch im ListIconGadget ablegen.

Übrigens: count.l = CountGadgetList(..)

Gruß Karl

[edit]

Mist! Wieder nicht die Brille aufgehabt. (CountGadgetItems(..))

Verfasst: 12.06.2006 18:12
von cofter
Hi Karl,
das mit den ListIconGadget werde ich ausprobieren aber CountGadgetList(..) steht bei mir garnet in der Hilfe. :?

Verfasst: 12.06.2006 18:15
von edel
Bei mir auch nicht , aber ich wuerd es mit countgadgetitems versuchen ;-)

Wenn du ein ListIconGadget nimmst und z.b. die ID dort speicherst,
kannst du mit LVM_FINDITEM bequem das Item loeschen.

Beispiel :

Code: Alles auswählen

  Structure LVFINDINFO
    flags.l
    psz.s
    lParam.l
    pt.point
    vkDirection.l
  Endstructure
  
  Enumeration 
    #Window  
  EndEnumeration
  
  Enumeration 
    #ListIcon  
  EndEnumeration
  
  OpenWindow(#Window,10,10,320,240,"")
 
  CreateGadgetList(WindowID(#Window))
  ListIconGadget(#ListIcon,0,0,320,240,"ID",100)
 
  For i = 12345 To 12348
    AddGadgetItem(#ListIcon,-1,Str(i)) 
  Next

  LVF.LVFINDINFO
  LVF\flags       = #LVFI_STRING
  LVF\psz         = "12346"
 
  Item = SendMessage_(GadgetID(#ListIcon),#LVM_FINDITEM,-1,LVF)
 
  RemoveGadgetItem(0,Item)
 
  Repeat
    uMsg = WaitWindowEvent()   
  Until uMsg = #WM_CLOSE 

Verfasst: 12.06.2006 19:33
von cofter
Würde deinen Code gern übernehmen aber so ganz verstehe ich ihn leider nicht.

Verfasst: 12.06.2006 19:48
von edel
Die Message 'LVM_FINDITEM' sucht , je nachdem welche flags angegeben
wurden, nach dem String und gibt, wenn gefunden, den Index des Items aus.

Werde den Code oben noch einmal anpassen.

Verfasst: 12.06.2006 20:00
von cofter
Ja bloss reagiere ich doch wenn jemand disconnected.

Revieve_all() wird in der Hauptschleife aufgerufen.

Code: Alles auswählen

Procedure recieve_all()
  *Buffer = AllocateMemory(3072) 
  Global SEvent = NetworkServerEvent()
  ExamineIPAddresses()

  If SEvent
    Global ClientID = EventClient()
    
    Select SEvent    
      Case 1
       
         AddElement(PlayerS())    
         PlayerS()\PlayerID = ClientID 
         PlayerS()\Index = ListIndex(PlayerS())
         PlayerS()\PlayerName = acc_name
         PlayerS()\PlayerOnline = 1
        
        Global CountList = CountList(PlayerS()) -1   
        AddGadgetItem(#ConsoleEditorGadged,a,"Neuer Client Connectet! " +Str(PlayerS()\PlayerID) +Chr(13))
        AddGadgetItem(#ConsoleEditorGadged,a,"PlayerIndex " +Str(PlayerS()\Index) +Chr(13))
        AddGadgetItem(#ConsoleEditorGadged,a,"PlayerCountList " +Str(CountList) +Chr(13))

        ;AddGadgetItem(#ConsoleEditorGadged,a,"ListenID: " +Str(ListCount)+ Chr(10))
      Case 2
        ReceiveNetworkData(PlayerS()\PlayerID, *Buffer, 3072)
        neuText.s = PeekS(*Buffer)
        
        Global username.s = StringField(neuText.s, 1, ";")
        Global password.s = StringField(neuText.s, 2, ";")
        
        SQL_Login(username.s,password.s,ClientID)
      Case 3
        SetGadgetText(#ConsoleEditorGadged,"Client " +Str(PlayerS()\PlayerID)+ " versucht Datei zu schicken!"+ Chr(10))
      Case 4
        AddGadgetItem(#ConsoleEditorGadged,a,"Client " +Str(PlayerS()\PlayerID)+ " verlässt den Server"+ Chr(10))
        AddGadgetItem(#ConsoleEditorGadged,a,"ListenID_out: " +Str(count)+ Chr(10))
        AddGadgetItem(#ConsoleEditorGadged,a,"PlayerName: " +acc_name+ Chr(10))
        AddGadgetItem(#ConsoleEditorGadged,a,"PlayerIndex_out: " +Str(PlayerS()\Index)+ Chr(10))
        
        count.l = CountGadgetItems(#ListPlayer) - 1
       
       
           ForEach PlayerS()    
            For i = 0 To count
              If Str(PlayerS()\PlayerID) = StringField(GetGadgetItemText(#ListPlayer, i, 0),2,";")
              
                RemoveGadgetItem(#ListPlayer, i)
;                 DeleteElement(PlayerS())
                count - 1
                Break 2
              EndIf
            Next i
;           AddGadgetItem(#ListPlayer,-1,PlayerS()\PlayerName+";"+Str(PlayerS()\PlayerID))
           Next 
        
   
        If ListCount_out = 0
          AddGadgetItem(#ConsoleEditorGadged,a,"Es ist niemand Online"+ Chr(10))
        Else
          AddGadgetItem(#ConsoleEditorGadged,a,"Es sind noch "+Str(ListCount_out)+" Player in der Liste"+ Chr(10))
        EndIf
    
    EndSelect
  EndIf
  
FreeMemory(*Buffer)
EndProcedure
Case 1 wenn jemand connected
Case 4 wenn jemand disconnected

Procedure SQL_login prüft ob die Zugansdaten stimmen.
Stimmen die Daten dann wird ein neues Item in die Liste gesetzt mit dem Namen und der ClientID

Code: Alles auswählen

Procedure SQL_Login(username.s,password.s,ClientID)

  If OpenDatabase(1, "xxx", "xxx", "xxx") 
    If DatabaseQuery(1,"SELECT * FROM accounts WHERE acc_name LIKE '"+username+"'")
   
        Global COUNTcols = DatabaseColumns(1)
        While NextDatabaseRow(1)
          Global     sql_id.l    = GetDatabaseLong  (1, 3)
          Global     acc_name.s  = GetDatabaseString(1, 1)
          Protected  acc_pwd.s   = GetDatabaseString(1, 2)
        Wend 
      
        If username = acc_name And password = acc_pwd
           
          SendNetworkString(ClientID, "Lo1")
          Global PlayerList = AddGadgetItem(#ListPlayer,PlayerS()\Index,acc_name+";"+Str(ClientID))
                   
        Else
          SendNetworkString(ClientID, "Lo2")
          CloseDatabase(1)
     
        EndIf
        
    Else
      MessageRequester("QUERY","Tabelle nicht gefunden")
      CloseDatabase(1)
    EndIf
  Else
    MessageRequester("DB","Datenbank geschlossen")
    CloseDatabase(1)
  EndIf
EndProcedure
Jetzt weiss ich nicht wie ich deinen Code benutzen könnte.
Sitze an dem Problem schon 3 Tage. :cry:
mfg
Cofter