Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Verschieben von Lines im Memofeld (https://www.delphipraxis.net/125046-verschieben-von-lines-im-memofeld.html)

Imhotep 29. Nov 2008 20:57


Verschieben von Lines im Memofeld
 
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

Delphi-Quellcode:
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 ... ::.

Sir Rufo 29. Nov 2008 21:03

Re: Verschieben von Lines im Memofeld
 
Wie wäre es denn, wenn du eine separate Highscore-Liste nimmst (also für die Daten), dort die Sortierung vornimmst, und dann in das Memo-Feld schreibst (Trennung von Daten, Code und Anzeige)

cu

Oliver

Imhotep 29. Nov 2008 21:06

Re: Verschieben von Lines im Memofeld
 
also ich habe ja 2 verschiedene listen :

eine die angezeigt wird, also Punkte Spieler,
und eben eine wo nur die punkte drin sind mit der ich arbeite, die angezeigte Liste wird nur indirekt über die andere Liste verändert, da diese ja parallel laufen.

oder habe ich dich falsch verstanden ...

Sir Rufo 29. Nov 2008 21:13

Re: Verschieben von Lines im Memofeld
 
Ja, ich denke schon ...

Die Daten-Liste sollte alle Informationen in seperaten Feldern (Punkte, Name, etc.) haben.
Die kann man jetzt recht einfach durchsortieren.

Wenn die dann sortiert ist, dann das Memo-Feld komplett aus der Daten-Liste neu aufbauen (in der gewünschten Reihenfolge)

cu

Oliver

Imhotep 29. Nov 2008 21:19

Re: Verschieben von Lines im Memofeld
 
das problem ist aber, dass ich selbst bei dem memofeld wo nur die zahlen drin sind es nicht schaffe das einmal durchzusortieren ohne das plötzlich irgendwelche lines überschrieben werden, die ich im Code nicht mal angesprochen habe ...

.:: edit: ohh man ich hab den Fehler gefunden .... ich hab die falsche Laufvariable genutzt ich Hammel ..

trotzdem danke ::.


greetz


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 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