Einzelnen Beitrag anzeigen

Imhotep

Registriert seit: 21. Nov 2008
6 Beiträge
 
#1

Verschieben von Lines im Memofeld

  Alt 29. Nov 2008, 21:57
Hallo,

ich weiß, dass es wohl eher ungern gesehen wird, aber ich bin mit meinem Latein vollkommen am Ende. ich sitze nun seit ca 2 Stunden an einem Programmteil, welches in ein 5 zeilengroßes Memofeld Zahlen, bzw. Strings einordnen soll (und zwar richtig ^^ )

Zur Theorie:

es soll eine Highscoreliste sein, welche 5 Spieler enthält und immer wenn jemand mehr Punkte gemacht hat, erst alle Zeilen 1 nach unten verschiebt und dann in die freigewordene Zeile, die neue Punktzahl einträgt.

Gegebener Fall der Spieler hat genug Punkte für Platz 3 geworfen, so wird line 5 nach line 6 (also ins Nirvana) geschoben, 4 nach 5 und 3 nach 4 danach wird line 3 mit der neuen Punktzahl versehen.

Technisch realisiert habe ich das zum einen über eine for-schleife mit 5 downto X und in der forschleife dann

Memo1.Lines.Strings[i]:=Memo1.Lines.Strings[i-1]; zum tauschen.

was auch seperat für sich sehr gut funktioniert hat, nur in meinem quelltext eingebunden kommt wirklich nur Müll herraus .... ich erkenne nicht ein mal eine Regelmäßigkeit ...

hier der gesamte Code-Teil, der noch sehr roh ist:

Delphi-Quellcode:
  for i:=1 to 6 do //bei 6 spielern wird jeder spieler einzeln durchgegangen
    begin
          if (ASP[i]>Ahcp[5]) and (ASP[i]<Ahcp[4]) then // ASP sidn die aktuellen spielerpunkte | Ahcp sind die Punkte der highscoreliste
            begin
              mb:=MessageDlg('Highscore speichern, Spieler ' + inttostr(i) + '?', mtInformation, [mbYes,mbNo], 0);
                if mb=6 then
                  begin
                    Ahcp[5]:=ASP[i]; // die scorepunkte werden durch die spielerpunkte ersetzt
                    for j:=5 downto 4 do
                      begin
                        Memo1.Lines.Strings[i]:=Memo1.Lines.Strings[i-1]; //der tausch von den lines (Anzeige)
                        Memo2.Lines.Strings[i]:=Memo2.Lines.Strings[i-1]; //tausch der lines nur die punkte (damit komm ich um ein aueinandernehmen des strings herum, nicht besonders schön, da man 2 Dateien benötigt, aber es funktioniert ^^ )
                      end;
                    Memo1.Lines.Strings[4]:=('5. ' + inttostr(ASP[i]) + ' Punkte ' + Name.text);
                    Memo2.Lines.Strings[4]:=inttostr(ASP[i]);
                  end;
            end;
          if (ASP[i]>Ahcp[4]) and (ASP[i]<Ahcp[3]) then
            begin
              mb:=MessageDlg('Highscore speichern, Spieler ' + inttostr(i) + '?', mtInformation, [mbYes,mbNo], 0);
                if mb=6 then
                  begin
                    Ahcp[4]:=ASP[i];
                    for j:=5 downto 3 do
                      begin
                        Memo1.Lines.Strings[i]:=Memo1.Lines.Strings[i-1];
                        Memo2.Lines.Strings[i]:=Memo2.Lines.Strings[i-1];
                      end;
                    Memo1.Lines.Strings[3]:=('4. ' + inttostr(ASP[i]) + ' Punkte ' + Name.text);
                    Memo2.Lines.Strings[3]:=inttostr(ASP[i]);
                  end;
            end;
          if (ASP[i]>Ahcp[3]) and (ASP[i]<Ahcp[2]) then
            begin
              mb:=MessageDlg('Highscore speichern, Spieler ' + inttostr(i) + '?', mtInformation, [mbYes,mbNo], 0);
                if mb=6 then
                  begin
                    Ahcp[3]:=ASP[i];
                    for j:=5 downto 2 do
                      begin
                        Memo1.Lines.Strings[i]:=Memo1.Lines.Strings[i-1];
                        Memo2.Lines.Strings[i]:=Memo2.Lines.Strings[i-1];
                      end;
                    Memo1.Lines.Strings[2]:=('3. ' + inttostr(ASP[i]) + ' Punkte ' + Name.text);
                    Memo2.Lines.Strings[2]:=inttostr(ASP[i]);
                  end;
            end;
          if (ASP[i]>Ahcp[2]) and (ASP[i]<Ahcp[1]) then
            begin
              mb:=MessageDlg('Highscore speichern, Spieler ' + inttostr(i) + '?', mtInformation, [mbYes,mbNo], 0);
                if mb=6 then
                  begin
                    Ahcp[2]:=ASP[i];
                    for j:=5 downto 1 do
                      begin
                        Memo1.Lines.Strings[i]:=Memo1.Lines.Strings[i-1];
                        Memo2.Lines.Strings[i]:=Memo2.Lines.Strings[i-1];
                      end;
                    Memo1.Lines.Strings[1]:=('2. ' + inttostr(ASP[i]) + ' Punkte ' + Name.text);
                    Memo2.Lines.Strings[1]:=inttostr(ASP[i]);
                  end;
            end;
          if (ASP[i]>Ahcp[1]) then
            begin
              mb:=MessageDlg('Highscore speichern, Spieler ' + inttostr(i) + '?', mtInformation, [mbYes,mbNo], 0);
                if mb=6 then
                  begin
                    Ahcp[1]:=ASP[i];
                    for j:=5 downto 0 do
                      begin
                        Memo1.Lines.Strings[i]:=Memo1.Lines.Strings[i-1];
                        Memo2.Lines.Strings[i]:=Memo2.Lines.Strings[i-1] ;
                      end;
                    Memo1.Lines.Strings[0]:=('1. ' + inttostr(ASP[i]) + ' Punkte ' + Name.text);
                    Memo2.Lines.Strings[0]:=inttostr(ASP[i]);
                  end;
            end;
    end;
Wenn es jemand haben möchte, schick ich auch gerne die ganze dpr etc .. bzw wenn zusatzinfos noch gebraucht werden

.::edit 1: Mit dem Befehl lines.move(j-1,j) habe ich es auch schon probiert, da kam allerdings noch mehr Müll bei raus irgendwie ... ::.
  Mit Zitat antworten Zitat