ListIndex bzw allgemeines Verständisproblem [gelöst]

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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
        
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag von cofter »

Wie meinst du das mit ClientID in das ListViewGagdget mit Breite 0? :?
Kann ich dort verschiedene Spalten erstellen?

:coderselixir:
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Ops,

Habe es mit ListIcon verwechselt. Packe den Eintrag mit #TAB$ nach hinten.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag 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 
 
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
Benutzeravatar
Karl
Beiträge: 520
Registriert: 21.07.2005 13:57
Wohnort: zu Hause

Beitrag 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(..))
Zuletzt geändert von Karl am 13.06.2006 08:49, insgesamt 1-mal geändert.
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag von cofter »

Hi Karl,
das mit den ListIconGadget werde ich ausprobieren aber CountGadgetList(..) steht bei mir garnet in der Hilfe. :?
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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 
Zuletzt geändert von edel am 12.06.2006 19:52, insgesamt 2-mal geändert.
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag von cofter »

Würde deinen Code gern übernehmen aber so ganz verstehe ich ihn leider nicht.
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag 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
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
Antworten