Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem bei schleife (https://www.delphipraxis.net/137818-problem-bei-schleife.html)

RedShakal 29. Jul 2009 00:02


Problem bei schleife
 
Hallo zusammen, ich habe in meinen Programm eine ListBox mit 2 Spalten. Die erste Spalte gibt den Namen an und die zweite Spalte den Authoren.

Die Strings werten von einem MasterServer direkt zum Client übertragen.

Masterserver:

Delphi-Quellcode:
[Maplist]
Anzahl=8
1=CYT_vs_unfair|D-FENS
2=area_Fayt_51|D-FENS
3=Die_Sanduhr|D-FENS
4=Krossfire|D-FENS
5=newm_01|-
6=newm_02|-
7=newm_03|-
8=newm_04|-
Dieser schickt es in einem String in folgendem Schema zum Client:

CYT_vs_unfair|D-FENS|area_Fayt_51|D-FENS|Die_Sanduhr|D-FENS usw.

Der Client zerteilt das | wieder in Einzeleile und wertet diese aus.

Das Problem liegt jetzt in einer Schleife bei der übernahme in die Listbox

Delphi-Quellcode:
  if (StrArr[0] = 'Maplist') and (AUser.Nick = 'KKND|Masterserver') then
    begin
      Form6.Maplist.Clear;
      Anzahl := StrtoInt(StrArr[1]);

      for i := 2 to Anzahl do
        begin
          LI := Form6.Maplist.Items.Insert(i);
          LI.Caption := StrArr[i];
          LI.SubItems.Add(StrArr[i+1]);
        end;
    end;
I fängt aus dem Grund bei 2 an, weil die 0 den Befehl "Maplist" enthält, an dem sich die Clients orientieren und wissen, welcher Befehl gerade kommt. Die 1 ist vergeben, weil sie die Anzahl der verschickten Maps mitsich bringt.

Wenn ich das so Starte, ist immer nur jeder Zweite Eintrag in der Listview korrekt.

Die Listview sieht dann so aus:
CYT_vs_unfair D-FENS
D-FEN area_Fayt_51
area_Fayt_51|D-FENS

usw.

Kann mir jemand helfen?

ich2 29. Jul 2009 07:40

Re: Problem bei schleife
 
Hallo RedShakal

in der Schleife passiert folgendes (wenn ich das richtig entnommen habe):
du erstellt für jeden Eintrag in deiner Stringliste ein neues Item in der Listview und erstellst dazu
ein Subitem mit dem direkt folgendem Eintrag in der Stringliste....so weit so gut...
du willst jetzt aber bestimmt nur jeden zweiten Eintrag bekommen?

schau dir mal das hier an:

Delphi-Quellcode:
if (StrArr[0] = 'Maplist') and (AUser.Nick = 'KKND|Masterserver') then
    begin
      Form6.Maplist.Clear;
      Anzahl := StrtoInt(StrArr[1]);

      for i := ( Anzahl - 2 ) div 2 do
        begin
          LI := Form6.Maplist.Items.Insert ( 2 * i - 1 );
          LI.Caption := StrArr [ 2 * i - 1 ];
          LI.SubItems.Add ( StrArr [ 2 * i ] );
        end;
    end;
mfg

RedShakal 29. Jul 2009 11:39

Re: Problem bei schleife
 
ich hab jetzt auf deinem code basierend ein bisschen rumprobiert und so klappt es soweit, aber leider fehlt der letzte eintrag :/

Delphi-Quellcode:
  if (StrArr[0] = 'Maplist') and (AUser.Nick = 'KKND|Masterserver') then
    begin
      Form6.Maplist.Clear;
      Anzahl := StrtoInt(StrArr[1]);

    for i := 2 to Anzahl do
        begin
          LI := Form6.Maplist.Items.Insert ( 2 * i - 1 );
          LI.Caption := StrArr [ 2 * i - 2];
          LI.SubItems.Add ( StrArr [ 2 * i - 1 ] );
        end;
    end;

DeddyH 29. Jul 2009 12:14

Re: Problem bei schleife
 
Natürlich fehlt der letzte Eintrag. In Anzahl steht 8, Du durchläufst die Schleife von 2 bis 8 einschließlich, d.h. 7 mal.

RedShakal 29. Jul 2009 12:23

Re: Problem bei schleife
 
Ah super Denkfehler! Danke :love:

RedShakal 29. Jul 2009 12:58

Re: Problem bei schleife
 
Ich nochmal: Ich habe jetzt eine 3te Spalte hinzugefügt die das Upload Datum enthällt.

Delphi-Quellcode:
if (StrArr[0] = 'Maplist') and (AUser.Nick = 'KKND|Masterserver') then
    begin
      Form6.Maplist.Clear;
      Anzahl := StrtoInt(StrArr[1]);

    for i := 1 to Anzahl do
        begin
          LI := Form6.Maplist.Items.Insert(3*i-1);
          LI.Caption := StrArr[3*i-1];
          LI.SubItems.Add ( StrArr[3*i] );
          LI.SubItems.Add ( StrArr[3*i-2] );
        end;
    end;

Leider muss ich gestehen das ich nicht weiß warum das so funktioniert aber ich hoff es kann mir jemand erklären.

Der Code funktioniert soweit Prima, leider ist aber in der ersten Spalte ein kleiner Fehler. ( Irgentwo ist das auch logisch weil i = 1 enthält ja eigentlich die Anzahl der übermittelten Maps. Aber leider fehlt die erste Zeile komplett wenn ich I = 2 mache.

http://i27.tinypic.com/30j45ew.jpg

hoika 29. Jul 2009 13:13

Re: Problem bei schleife
 
Hallo,

und beim 4. Eintrag geht alles wieder von vorne los.
Du machst es dir aber auch künstlich schwer.

entwder Explode (hier mal suchen) oder zu Fuss über eine StringList

IniList ist eine Liste aller "Zeilen"

Delphi-Quellcode:
sl: TStringList;

  sl:= TStringList.Create;

  for iList:= 0 to IniList.Count-1 do
  begin
    sl.Delimiter:= '|';
    sl.DelimitedText:= 'CYT_vs_unfair|D-FENS'

   // jetzt ist in sl[0] 'CYT_vs_unfair' und in sl[1] 'D-FENS'



    ListView.Items.Add;
    ListView.Caption:= sl[0];
  end;

Heiko

RedShakal 29. Jul 2009 13:33

Re: Problem bei schleife
 
ich benutze doch bereits die explode funktion


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz