Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - [Tutorial] Bestenliste


Lena00 - Di 28.11.17 19:28
Titel: [Tutorial] Bestenliste
Hi! Möchte für mein Spiel eine Art Bestenliste/Score erstellen, der nur für einmal starten/kompilieren "gespeichert" ist. Im Anhang ist mein bisheriger Quelltext, wobei a1,a2,a3 & a4 die Plätze 1,2,3,& 4 darstellen und Punkte die erreichten Punkte, bei denen die höchsten natürlich Platz eins sind. Bei gleicher Punktzahl soll auch der Platz "danach" belegt werden, da man ja zum Beispiel Platz 2 nicht überbietet aber jedoch Platz 3 trotzdem...
Hoffe auf Hilfe! :D

Moderiert von user profile iconNarses: Titel erweitert
Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 28.11.2017 um 20:09


Narses - Di 28.11.17 19:36

Moin!

Ein kleiner Tipp am Rande: du kannst den Quelltext hier auch direkt in den Beitrag einfügen, sogar hübsch formatiert, wenn du die Delphi-Tags drum rum setzt. :idea: Das macht es deutlich einfacher deine Beiträge zu lesen, weil man nicht immer erst das Bild runterladen muss. ;)

Was du möchtest, ist eine Liste sortieren. Habt ihr im Unterricht sowas schon behandelt? :lupe:

cu
Narses


Lena00 - Di 28.11.17 19:44

Vielen Dank für den Tipp! :wink:
Nein haben wir bisher nicht, aber etwas das im Unterricht noch keine Rolle spielte ist sogar verlangt! Also etwas "Neues".


Narses - Di 28.11.17 19:51

Moin!

Aha, na dann. :? Habt ihr denn schon Felder (array) und Schleifen (for, repeat, while) besprochen oder hast du dich eventuell schon selbst damit beschäftigt? Man kann eine 4-Platz-Liste zwar auch mit statischen if-Anweisungen „sortieren“, aber das grenzt schon an Folter... :zwinker:

Kurz: das könnte (noch) etwas schwierig für dich sein. Sicher, dass du das angehen willst? :nixweiss:

cu
Narses

PS: wo ich so drüber nachdenke, es gäbe natürlich auch eine halbgemogelte Variante über die VCL-Komponenten... :idea:


Lena00 - Di 28.11.17 19:59

Ja Schleifen und Arrays waren schon einmal Thema! Dachte bloß das wäre so die einfachste Möglichkeit, aber damit lag ich wohl dann falsch! :D


Narses - Di 28.11.17 20:09

Moin!

Also, was darf es sein: die Variante über ein VCL-Control, dass das Sortieren für dich übernimmt oder selbst sortieren?

cu
Narses


Lena00 - Di 28.11.17 20:18

Gute Frage :nixweiss:
Aber VCL-Control hört sich gut an wenn es verständlich ist :)


Narses - Di 28.11.17 20:28

Moin!

Dann probieren wir das mal. :zustimm:

Zieh doch bitte mal eine ListBox auf das Formular. Im Objekt-Inspektor stellst du die Eigenschaft .Sorted auf TRUE. Dann legst du noch einen weiteren Button mit auf das Formular (nur zum Testen, der kommt später wieder raus). Doppelklick auf den Button, um den Ereignishandler zu öffnen, dann schreibst du da rein: Listbox1.Items.Add(IntToStr(Random(100));
Programm starten und ein paar mal auf den Test-Button klicken. Was passiert? :lupe:

cu
Narses


Lena00 - Di 28.11.17 20:41

Hat soweit alles geklappt und es erscheinen nun für mich auf den ersten Blick wahllose Zahlen in der Box :)


Narses - Di 28.11.17 20:45

Moin!

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
es erscheinen nun für mich auf den ersten Blick wahllose Zahlen in der Box :)
Schön. Die Zahlen sind tatsächlich „wahllos“, weil mit dem Random() Zufallszahlen erzeugt werden. :idea:

Wenn du statt der 100 mal nur 20 angibst (die Obergrenze für die Zufallszahlen), dann sollte sich nach ein paar Buttonklicks (ruhig mal so 20x klicken) was erkennen lassen. :lupe: Oder? :D

cu
Narses


Lena00 - Di 28.11.17 20:53

Es lässt sich erkennen, dass ausschließlich Zahlen von 0 bis 20 ausgegeben werden... :)


Narses - Di 28.11.17 20:57

Moin!

Der war gut! :lol: OK, ich drücke mich offensichtlich nicht gut aus. Also: bitte 10x Zahlen einfügen und dann den Inhalt der Listbox hier reinstellen. ;) Bis gleich... :zustimm:

cu
Narses


Lena00 - Di 28.11.17 21:07

Ich schreib die jetzt einfach mal fix so hier rein von oben nach unten: 11, 19, 2, 3, 4, 5, 6, 7, 8, 9


Narses - Di 28.11.17 21:09

Und dir fällt echt nix auf? ;)


Lena00 - Di 28.11.17 21:24

Naja sie sind schon sortiert, wobei aber 11 und 19 aus der Reihe fallen


Narses - Di 28.11.17 21:26

Moin! (im wahrsten Sinne des Wortes :lol:)

Ich muss hier für „heute“ vertagen, weil es da, wo ich mich grade aufhalte, bereits mitten in der Nacht ist... :gaehn: Vielleicht kann ja einer der erfahreneren Helfer solange übernehmen. :zustimm:

@user profile iconLena00: wenn du nicht direkt drauf kommst, dann gib als Obergrenze 10, dann 100 und dann nochmal 1000 ein. Wird es dann klarer? :les: :think:

cu
Narses


Symbroson - Di 28.11.17 21:30

Ein kleiner Tipp meinerseits: Schau dir nicht nur die Zahlen an, sondern die Ziffern - Stelle für Stelle ;)


Lena00 - Di 28.11.17 21:37

:idea: :idea: :idea: :idea:
Oh man :D danke füt den Tipp, wie konnte man das übersehen :lol:


Lena00 - Di 28.11.17 21:57

So schonmal gecheckt!
Wie verbinde ich das jetzt mit der Punktzahl aus einem Editfeld und was mache ich bei Punkten über 100? Ist nämlich auch möglich :lol:


Symbroson - Di 28.11.17 21:58

Moment ich glaube ich weiß jetzt worauf Narses hinaus wollte. kleinen Moment bitte :)
continue [https://www.entwickler-ecke.de/viewtopic.php?t=116734&postorder=asc&start=20]


Symbroson - Di 28.11.17 22:08

Also das Problem hast du erkannt. Wir brauchen jetzt also irgendwas zum richtigen Sortieren der Zahlen. Leider stellt die ListBox keine solche Methode bereit. Narses wollte aber jetzt bestimmt keine Sortieralgorithmen einführen - deswegen glaube ich, dass er auf TStringList.CustomSort hinaus möchte.

Zunächst solltest du dir für die Anschaulichkeit einen zweiten Knopf 'Sortieren' anlegen und die Event-Prozedur OnKlick anlegen.

Dann brauchst du eine sogenannten TStringList. also legst du dir in der prozedur eine Variable list vom Typ TStringList an:


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.btnSortClick(Sender: TObject);
var list: TStringList;
begin
  {}
end;

die TStringList muss jetzt erstmal initialisiert werden, das geht folgendermaßen:

Delphi-Quelltext
1:
list := TStringList.Create;                    

Als nächstes muss unsere String-Liste die Items aus der ListBox zugewiesen bekommen:

Delphi-Quelltext
1:
list.Assign(ListBox1.Items);                    

Dann passiert etwas Magie, die ich gleich erläuern werde, und danach weisen wir die Sortierte Liste wieder auf unsere ListBox zu:

Delphi-Quelltext
1:
2:
{Magie}
listbox1.Items.Assign(list);

soweit kannst du ja erstmal abschreiben ;)


Symbroson - Di 28.11.17 22:21

die TStringList hat eine tolle Funktion namens CustomSort. Dieser muss als Argument eine Funktion übergeben werden, mithilfe der die Werte aus der Liste verglichen werden.
Der Unterschied zwischen einer Prozedur und einer Funktion ist der, dass eine Funktion einen Wert zurückgibt, wenn man sie aufruft.
Einfaches Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
function add(a, b:integer): integer;
begin
  Result := a + b;
end;

im Funktionskopf stehen die Argumente und deren Typ, und hinter den Klammern steht der Typ dessen, was zurückgegeben wird - in diesem Falle ist beides ein Integer. Result ist die 'Variable' die den Wert trägt der zurückgegeben werden soll. Man muss sie nicht extra anlegen, sie wird automatisch angelegt und hat logischerweise denselben Typ wie die Funktion.

Jetzt zur Vergleichsfunktion für die TStringList.
Diese funktion muss eine bestimmte Struktur haben, die da wäre:

Delphi-Quelltext
1:
2:
3:
4:
function Vergleiche(Liste: TStringList; Index1, Index2: integer): Integer;
begin
  {...}
end;

Wie du siehst gibt diese Funktion einen Integer-Wert zurück. Dafür folgende Regel:
- Ist die zurückgegebene Zahl -1 wird der Wert nach vorn geschoben (Richtung Listenanfang)
- Ist die zurückgegebene Zahl 1 wird der Wert nach hinten geschoben (Richtung Listenende)
- Ist die zurückgegebene Zahl 0 wird der Wert nicht verschoben.

Wenn du also absteigend sortieren willst, musst du -1 zurückgeben, wenn Liste[Index1] > Liste[Index2]

Kannst du damit etwas anfangen? Scheint erstmal etwas kompliziert, ist es aber eigentlich nicht ;)


Symbroson - Di 28.11.17 22:29

Ich habe eben bemerkt, dass es nicht wichtig ist, ob der Rückgabewert genau 1 oder -1 ist, es reicht schon wenn er positiv, null oder negativ ist. Das macht den Vergleich sehr einfach. Aber versuch erst einmal die Vergleichsfunktion richtig zu implementieren - Dann können wir immernoch optimieren :roll:

wenn ich dir zu schnell bin sag bitte Bescheid ja?


Lena00 - Di 28.11.17 23:05

Auf jeden Fall schonmal vielen vielen Dank für die große Mühe!!!!
Soweit habe ich das übernommen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm2.Button12Click(Sender: TObject);
begin
  Listbox1.Items.Add(IntToStr(Random(20)));
end;

procedure TForm2.Button13Click(Sender: TObject);
var list: TStringList;       // Variable list vom Typ TStringList
begin
list := TStringList.Create; //TStringList wirdinitialisiert
list.Assign(ListBox1.Items); //String-Liste werden Items aus der ListBox zugewiesen
listbox1.Items.Assign(list);

function Vergleiche(Liste: TStringList; Index1, Index2: integer): Integer;
begin

end;

end;
[/search][/delphi]

Bin jetzt bloß noch verwundert was in die function rein muss und was die "Magie" bewirkt


Symbroson - Di 28.11.17 23:16

Das sieht ja schonmal ganz gut aus. :zustimm:

Um den Sortiervorgang zu starten musst du der CustomSort Prozedur von TCustomSort unsere Vergleichs-Funktion übergeben. und zwar nachdem du der TStringList die ListBox.Items zugewiesen hast. Also

Delphi-Quelltext
1:
list.CustomSort(Vergleiche);                    

Die CustomSort prozedur Implementiert einen Sortieralgorithmus (ich weiß leider nicht welchen) und ruft deine Funktion auf um zu wissen, wie sie sortieren soll.
du bekommst in der Vergleichs-Funktion die Liste und die zwei Indizes die gerade verglichen werden sollen als Argument - das Vergleichen selbst solltest du hoffentlich allein herausbekommen.
Schick dann deinen Code wieder hier rein :D


Lena00 - Di 28.11.17 23:25

:lol: Klingt alles so easy, aber bin leicht überfordert :les:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm2.Button13Click(Sender: TObject);
var list: TStringList;       // Variable list vom Typ TStringList
begin
list := TStringList.Create; //TStringList wirdinitialisiert
list.Assign(ListBox1.Items); //String-Liste werden Items aus der ListBox zugewiesen
listbox1.Items.Assign(list);
list.CustomSort(Compare);

function Vergleiche(Liste: TStringList; Index1, Index2: integer): Integer;
begin

end;


Richtig dass das: list.CustomSort(Compare); über die Funktion muss?
Und in die Funktion dann der "Vergleich"?


Symbroson - Di 28.11.17 23:28

Ja so ungefähr ^^

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function Vergleiche(Liste: TStringList; Index1, Index2: integer): Integer;
begin

end;

procedure TForm2.Button13Click(Sender: TObject);
var list: TStringList;       // Variable list vom Typ TStringList
begin
  list := TStringList.Create;  //TStringList wirdinitialisiert
  list.Assign(ListBox1.Items); //String-Liste werden Items aus der ListBox zugewiesen
  list.CustomSort(Vergleiche); //liste sortieren
  listbox1.Items.Assign(list); //sortierte Liste der ListBox zuweisen
end;

Beachte, dass du erst die Vergleichs-Funktion deklarieren musst, und die erst danach nutzen kannst, weil der Compiler sonst die Funktion noch gar nicht kennt aber schon verwenden will.
Alternativ kannst du sie auch zu einem Kind von TForm1 machen - aber das verwirrt bestimmt erstmal mehr als sie vorher zu deklarieren


Lena00 - Di 28.11.17 23:43

Das hätte ich eigentlich sogar wissen müssen :lol: :idea:
Bei mir wirft sich nun aber die Frage auf, ob in der Funktion mit if --> then gearbeitet werden muss, oder anderen Befehlen bzw. fällt mir kein anderer Ansatz ein


Symbroson - Di 28.11.17 23:47

'If then' ist ein Ansatz, es gibt aber noch einen Anderen der ausnutzt, dass das Ergebnis nur Positiv, Null oder Negativ sein muss. Vielleicht kommst du darauf - wenn nicht mach erstmal 'if then' sodass das Sortieren überhaupt funktioniert


Lena00 - Mi 29.11.17 00:07


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function Vergleiche(Liste: TStringList; Index1, Index2: integer): Integer;
begin
 if Index1 = Index2 then   TStrinList:= ;
 if Index1 > Index2 then    TStrinList:=;
 if Index1 < Index2 then    TStrinList:=;
end;


Gut, ich weiß das ist erstmal absolut primitiv, aber ich weiß nicht was in den Fällen mit der Box passiert´bzw wie das im Quelltext angegeben wird, die Liste ist echt Neuland
Sorry dass ich mega planlos erscheine :flehan:


Symbroson - Mi 29.11.17 00:11

Du musst in der Vergleichs-Funktion nichts mit der ListBox anstellen, das macht TStringList.CustomSort für dich. Du musst ihm nur sagen, wohin du das Item vom Index1 hin haben willst. Also nur -1, 0 oder 1 zurückgeben
Zitat:
Wie du siehst gibt diese Funktion einen Integer-Wert zurück. Dafür folgende Regel:
- Ist die zurückgegebene Zahl -1 wird der Wert nach vorn geschoben (Richtung Listenanfang)
- Ist die zurückgegebene Zahl 1 wird der Wert nach hinten geschoben (Richtung Listenende)
- Ist die zurückgegebene Zahl 0 wird der Wert nicht verschoben.

Wie gesagt du selbst musst durch TList.CustomSort überhaupt nichts mit der Liste machen. Nur der TList zuweisen, sortieren lassen und wieder zurückkopieren. Das einzige was CustomSort nicht weiß ist, wie du sortieren möchtest - deswegen übergibst du den Vergleich als Funktion.

Du musst dich auch nicht für deine Unwissendheit entschuldigen - schließlich hat jeder mal angefangen. :lol:

(100. Beitrag Prämiere :beer: )


Lena00 - Mi 29.11.17 00:31

Glückwunsch! :wink:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function Vergleiche(Liste: TStringList; Index1, Index2: integer): Integer;
begin
 if Index1 = Index2 then   Item:=0 ;  //keine Versschiebung
 if Index1 > Index2 then    Item:=-1//Verschiebung Richtung Listenanfang
 if Index1 < Index2 then    Item:=+1//Verschiebung Richtung Listenende
end;

procedure TForm2.Button13Click(Sender: TObject);
var list: TStringList;       // Variable list vom Typ TStringList
begin
list := TStringList.Create; //TStringList wirdinitialisiert
list.Assign(ListBox1.Items); //String-Liste werden Items aus der ListBox zugewiesen
list.CustomSort(Vergleiche); //Vergleichs-Funktion
listbox1.Items.Assign(list);
end;


Der Zusammenhang ist noch unklar zwischen Index, Item, list, box


Symbroson - Mi 29.11.17 00:42

CustomSort nutzt einen Sortieralgorithmus - egal welchen. Die meisten Sortieralgorithmen sind Vergleichsbasiert - das heißt sie vergleichen zwei Elemente einer Liste und tauschen diese wenn sie nicht der Sortiervorschrift entsprechen.

Beispiel BubbleSort:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
{list: array of integer}
{arrLen := length(list)}
procedure bubbleSort;
var i, j: integer;
begin
  for i := arrLen - 2 downto 0 do
    for j := 0 to i do
      if list[j] > list[j+1then swapI(j, j+1);
end;

Hier wird verglichen, ob list[j] größer als list[j+1] ist - falls ja, werden beide Elemente getauscht. Das swapI ist eine externe Prozedur die mir das Tauschen übernimmt - das soll jetzt aber nicht im Vordergrund stehen.

Aber anstatt die Bedingung selber zu implementieren kannst du CustomSort eine eigene Funktion übergeben. Der werden die Liste selber und die beiden Indizes übergeben, die miteinander verglichen werden sollen.
Durch diesen Rückgabewert kann dann CustomSort entscheiden ob er die beiden Indizes tauschen soll, oder nicht.

Ich weiß jetzt allerdings nicht, wie du auf die Variable Item gekommen bist - Ich hatte eigentlich von der 'Result' Variable gesprochen. das ist dann der Rückgabewert der Funktion.

Ich hoffe jetzt ist alles klar :)

(entschuldige die Tippfehler - meine BT Tastatur ist manchmal etwas komisch. Ich sollte vielleicht erst korrigieren und dann senden und nicht umgekehrt ^^)


Lena00 - Mi 29.11.17 00:51

Achja....result, da war ja was
Um die Uhrzeit ist mein brain am Ende :D
Muss ja aber werden


Symbroson - Mi 29.11.17 00:54

Jup alles gut ^^
Wenn du sonst noch was wissen wolltest zu diesem Thema frag einfach :D

Ansonsten : Gute Nacht 😴


Lena00 - Mi 29.11.17 00:59


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function Vergleiche(Liste: TStringList; Index1, Index2: integer): Integer;
begin
 if Index1 = Index2 then result:=0 ;  //keine Versschiebung
 if Index1 > Index2 then result:=-1//Verschiebung Richtung Listenanfang
 if Index1 < Index2 then result:=+1//Verschiebung Richtung Listenende
end;

procedure TForm2.Button13Click(Sender: TObject);
var list: TStringList;       // Variable list vom Typ TStringList
begin
list := TStringList.Create; //TStringList wirdinitialisiert
list.Assign(ListBox1.Items); //String-Liste werden Items aus der ListBox zugewiesen
list.CustomSort(Vergleiche); //Vergleichs-Funktion
listbox1.Items.Assign(list);
end;


So sieht es aus. Auch wenn das noch nicht funtioniert, wie wird die Punktzahl aus dem Edit-Feld in die Liste übernommen?

Will das eigentlich noch funktionsfähig fertigstellen und dann: Gute Nacht :lol: :D


Symbroson - Mi 29.11.17 01:02

Wenn du die Punktzahlen in editfeldern hast, musst du diese natürlich erst in die StringList reinkopieren. Das geht mit

Delphi-Quelltext
1:
list.Add(Editn.Text)                    

ja sorry mein Fehler - hatte eben ausgeschalten ^^


Lena00 - Mi 29.11.17 01:06

unit2.pas(623,6) Error: identifier idents no member "items"

Diese Fehlermeldung wird nun angezeigt... :(


Symbroson - Mi 29.11.17 01:12

Welche Delphi Version hast du eigentlich? Wäre gut wenn du die in dein Profil eintragen könntest. Ich hab zB. D7 und dessen IDE zeigt mir immer alle verfügbaren Operatoren an wenn ich einen '.' tippe und warte oder tab drücke. Das hilft oft herauszufinden welche Funktionen eine Bestimmte Komponente hat. Die Schriftart aus deinen Bildern sieht etwas älter aus - ich kenn mich da nicht so aus


Lena00 - Mi 29.11.17 01:12

So sieht das jetzt aus :?

Gute Frage, aber das mit dem '.' und warten funtioniert bei mir auch ^^


Symbroson - Mi 29.11.17 01:15

Uff das tut mir leid - da bin ich überfragt. Mir ist aber nochwas anderes aufgefallen - du vergleixhst die indizes - musst aber die Werte aus der liste bei diesen Indizes vergleichen.


Lena00 - Mi 29.11.17 01:18

"musst aber die Werte aus der liste bei diesen Indizes vergleichen."
Okay, bin eindeutig überfordert
Ich glaub ich belss es dabei
Langsam verlässt mich der Ehrgeiz -.-


Symbroson - Mi 29.11.17 01:22

Na es macht doch keinen sinn die Indizes zu vergleichen - die sind ja schon sortiert. Du möchtest doch die Werte ais der Liste Sortieren oder nicht? Also musst du auch die Werte der Liste vergleichen.

Wegen dem komischen Fehler da: probier mal '{$mode delphi}' irgendwo am Anfang der Unit - nach dem program hinzuzufügen. KA ob das funktioniert - aber ein Versuch ist es wert


Lena00 - Mi 29.11.17 01:24

was sind Indizes denn eigentl überhaupt ?


Symbroson - Mi 29.11.17 01:25

der Index. mehrzahl Indizes.
list[i] : list ist die Liste, i ist der Index

Frag doch gleich wennn du es nicht weißt - das hätte einiges an Verwirrung erspart ;)


Symbroson - Mi 29.11.17 01:27

Hier ich hab dir mal mein Projektordner gezippt in den Anhang gepackt - schau mal ob das funktioniert. Wenn nicht - ka


Lena00 - Mi 29.11.17 01:30

Also durch was genau muss ich jetzt die Indizs ersetzen?
Es müssen ja die Zahlen aus dem edit-Feld verglichen werdem, die vorher in die Liste übernommen wurden


Symbroson - Mi 29.11.17 01:32

so wie du normalerweise auf eine Liste zugreifst: Liste[Index1]


Lena00 - Mi 29.11.17 01:45

Okay alles klar!
Dann wirklich vielen vielen Dank für die mega Hilfe, die große Mühe, Geduld und den Zeitaufwand!!!
Und Respekt vor den skills! 8) :wink: :wink:


Symbroson - Mi 29.11.17 01:48

Kein Problem :) Immer gerne :zustimm:

Hat denn jetzt der Funktionsaufruf doch noch funktioniert? Wenn ja - wo war der Fehler?


Lena00 - Mi 29.11.17 01:56

Ehrlich? Nein, hat es nicht
Nicht dass du denkst es war umsonst, hast wirklich mega geholfen, aber meine Nerven sind am Ende :lol:
Also dann, Gute Nacht !! :)


Symbroson - Mi 29.11.17 02:00

Hm ok. Kannst ja mal schauen ob du heute Nachmittag deine Delphi-Version herausbekommst. Die muss ja irgendeo in der IDE stehen. Hängt bestimmt damit irgendwie zusammen.
Gute Nacht dann - wird langsam Zeit :lol:

Heut Nachmittag könnten wir ja versuchen einfache Sortieralgorithmen zu besprechen. Dann machst du dich nicht von hunderten verschiedenen Komponenten abhängig (und verstehst die Hintergründer mancher Prinzipien besser. BubbleSort hab ich ja schon ohne einen Kommentar gezeigt. Bis dahin ist Narses bestimmt auch wieder am Start ^^ vielleicht ist er der bessere Erklärbär


Lena00 - Mi 29.11.17 02:20

Ja die Version dürfte ich herausbekommen!
Das wäre supi, ansonsten lass ich es einfach komplett
Habe mich mittlerweile damit abgefunden 😅


Narses - Mi 29.11.17 09:53

Moin!

Soo, wieder frisch am Start. :gaehn: ;)

Holla, hier ist es ja gestern Abend noch richtig abgegangen... :shock: Respekt, dass du da so lange noch mitgehalten hast. :hair: :zustimm:

Mein Ansatz wäre anders (leichter) weitergegangen, aber das ist auch etwas Geschmacksache. :nixweiss:

Du hast jetzt (schon wieder :lol:) die Quahl der Wahl: möchtest du den Weg weiter verfolgen, den user profile iconSymbroson eingeschlagen hat, oder möchtest du eventuell eine Alternative kennenlernen, die u.U. „leichter“ sein könnte (für den Anfang)?

user profile iconSymbroson hat sicher recht, wenn man Sortieralgorithmen beherrscht, ist das ein klarer Vorteil. :) Ich könnte mir allerdings vorstellen, dass es hier darum gar nicht geht. :P Das „Problem“ ist in diesem Fall wohl eher ein kleines Gimmick in einem Programm-Projekt unterzubringen, ohne dabei großen Aufwand zu betreiben. :zwinker: Vor allem wäre mir wichtig, dass ich dich beim „Helfen“ nicht abhänge (überfordere), weil du sonst eigentlich nichts gelernt hast, wenn du es später nicht selbst reproduzieren kannst. :?

Also, du entscheidest: wie geht’s weiter?

cu
Narses


Lena00 - Mi 29.11.17 14:52

Ja da hast du Recht, ich will bzw muss es auch verstehen, deswegen würde ich deine Alternative, die vielleicht für mich verständlicher/einfacher scheint, bevorzugen.
Genau! Möglichst wenig Aufwand, um mein Projekt aufzupimpen. :D 8)


Narses - Mi 29.11.17 16:20

Moin!

OK, dann spulen wir geistig auf den Stand des Projektes zurück, an dem du festgestellt hast, dass die Zahlen in der Listbox zwar sortiert, aber leider als „Text“ (zeichenweise) und nicht numerisch (nach dem Zahlenwert). Das müssen wir jetzt erstmal lösen. Ideen, wie man das hinkriegt? (ignorier erstmal, dass da auch noch Spielernamen mit rein müssen)

cu
Narses


Lena00 - Mi 29.11.17 16:33

Alles klar, genau!
Nee ich habe da wirklich keine Idee :?
Spielernamen hatte ich bisher nicht mit vorgesehen, aber wenn es dann nicht zu aufwendig ist bestimmt eine gute Idee


Narses - Mi 29.11.17 16:39

Moin!

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
Nee ich habe da wirklich keine Idee :?
Woran liegt es denn (genau), dass die "Zahlen" nicht richtig sortiert werden, wenn man sie als Text (=Zeichenkette) liest? :gruebel: ;)

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
Spielernamen hatte ich bisher nicht mit vorgesehen, aber wenn es dann nicht zu aufwendig ist bestimmt eine gute Idee
Kleinkram, das machen wir nebenbei. :zustimm:

cu
Narses


Lena00 - Mi 29.11.17 16:42

Vielleicht dass beim Sortieren immer nur der erste "Wert" verglichen wird und die anderen Stellen vernachlässsigt werden


Narses - Mi 29.11.17 16:45

Ja, sehr gut. Die restlichen Stellen einer "Zahl" als Text werden zwar nicht vernachlässigt (=ignoriert), aber "an der falschen Stelle" oder "nicht mit den richtigen Stellen der anderen Zahlen" verglichen, um rauszufinden, ob diese Zahl größer oder kleiner ist. :idea:

Ne Idee, wie man das ändern könnte? (muss ja nicht gleich als Delphi-Code sein, mehr so konzeptionell) :lupe:


Lena00 - Mi 29.11.17 16:48

Du meintest ja sie werden als "Zeichenkette" gelesen, vielleicht gibt es ja eine andere Möglichkeit


Narses - Mi 29.11.17 16:51

Zeichenkette statt Zahl ist schon das, was wir wollen. Zum einen kann die Listbox gar nix anderes (:lol:, naja, das mit den TObjects geht schon noch, aber das hattest du ja schon, ist erstmal zu schwer), zum anderen wollen wir später ja auch noch die Spielernamen mit dazu tun. :idea:

OK, kleiner Schubs: wie ist das denn so mit rechts- und linksbündig, hilft das vielleicht was? :zwinker:


Lena00 - Mi 29.11.17 17:05

Das wirft ejtzt noch eher ein Fragezeichen auf... aber theoretisch müssten die Zahlen ja schon "linksbündig" sein, weil man sie ja "von links liest", heißt, die Anzahl der Stellen der Zahl und das "von links geordnet" gibt die Reihenfolge an
Hoffentlich etwas verständlich was ich mein


Narses - Mi 29.11.17 17:08

Ich versteh dich schon, sonst frag ich einfach. ;) Und das tue ich auch gleich: sicher, dass du nicht zufällig Links und Rechts im Kopf "vertauscht" hast beim Schreiben? :zwinker:


Symbroson - Mi 29.11.17 17:15

Hast du schonmal schriftlich Zahlen addiert? Das hilft vielleicht


Lena00 - Mi 29.11.17 17:18

Ja klar! :D
okay, mein Denkfehler


Lena00 - Mi 29.11.17 17:19

Aber kein Plan wie das bei Delphi umgesetzt wird


Symbroson - Mi 29.11.17 17:21

welchen Wert hat denn die Hunderterstelle von 64?


Lena00 - Mi 29.11.17 17:33

Die existiert nicht


Narses - Mi 29.11.17 17:35

Und welcher Ziffer entspricht "nix"? :zwinker:


Lena00 - Mi 29.11.17 17:36

einer 0


Narses - Mi 29.11.17 17:40

Na, war doch gar nicht so schwer. :zustimm: Wenn man also die Text-Zahlen "vorne" mit Nullen "auffüllt", dann werden die bei einem Textvergleich trotzdem korrekt sortiert. :idea:

Aber wie macht man das? Kein Rätselraten, das geht so: :les:

Delphi-Quelltext
1:
ListBox1.Items.Add(Format('%.04d', [Random(1000)]));                    

Was passiert da? :lupe: Das schreibe ich dir in den nächsten Beitrag, inzwischen probiert du das einfach mal aus. ;)


Narses - Mi 29.11.17 17:46

Zerlegen wir mal die Zeile:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
ListBox1.Items.Add(Format('%.04d', [Random(1000)]));
// -->
Random(1000// Zufallszahl zwischen 0..999 auswürfeln
[Random(1000)] // die Klammern machen aus der Zufallszahl ein konstantes Array mit einem Wert (ist nicht weiter wichtig jetzt, aber die Format()-Funktion will das so haben, kannst ja mal in der Online-Hilfe nachlesen
Format('%.04d', [Random(1000)]) // die Format()-Funktion gibt (hier: eine Zahl; allgemein: die Parameter in den eckigen Klammern) im gewünschten "Format" (hier: .04d) aus
// das %-Zeichen leitet eine Variable ein
// der Punkt steht für die Stellenanzahl
// die 0 für "mit führenden Nullen" ausgeben
// die 4 für die Anzahl der Stellen, eben 4
// das d für eine Dezimalzahl (Integer)

// den Rest kennst du schon, der fügt eine Zeile in die Listbox ein


Ausprobiert? Klappt? ;)


Lena00 - Mi 29.11.17 17:53

Ausprobiert und ja es funktioniert, jetzt müssen sie noch sortiert werden und meine Zahlen müsssen aus einem Edit-Feld entnommen werden


Narses - Mi 29.11.17 17:55

Ähm, sortiert sollten sie doch schon sein, oder hast du die Eigenschaft .Sorted der Listbox wieder auf FALSE gestellt? :gruebel:


Lena00 - Mi 29.11.17 18:00

Im Objektinspektor ist sorted auf true gestellt


Narses - Mi 29.11.17 18:03

Du bist etwas spärlich mit den Rückmeldungen, ich kann deinen Bildschirm ja nicht sehen... :lupe: :les: ;)

Werden die Zufallszahlen jetzt korrekt sortiert in der Listbox angezeigt, wenn du den Button ein paar mal angeklickt hast (klar, "falsch" rum, du willst ja absteigend haben, kommt noch)?


Lena00 - Mi 29.11.17 18:08

Nein sie werden nicht geordnet angezeigt
Bild der Box im Anhang


Symbroson - Mi 29.11.17 18:11

darf ich nochmal dazwischengrätschen ;)
Zitat:
Zahlen müsssen aus einem Edit-Feld entnommen werden

Die Zahlen aus dem Edit-Feld zu holen sollte kein Problem sein. Du musst nur anstatt den Zufallszahlen die Zahlen aus den TextEdits in die ListBox hinzufügen.
Die zu Formatieren geht umständlich nach der eben von Narses beschriebenen Methode:

Delphi-Quelltext
1:
ListBox.Items.Add(Format('%.04d', [strtoint(Edit.Text)]);                    

oder effizient:

Delphi-Quelltext
1:
ListBox.Items.Add(Copy('0000'+Edit.Text, length(Edit.Text)+14));                    

Dabei fügen wir einfach unserer Zahl, die ja schon als Zeichenkette vorliegt, vorne vier nullen hinzu, und kopieren dann sozusagen die letzten vier stellen der neuen Zeichenkette in die ListBox.
Wir umgehen somit die Umwandlung einer Zeichenkette in einen Integerwert und die Formatierung


Narses - Mi 29.11.17 18:13

OK, kann es sein, dass du noch Code(-Reste) von dem vorigen Versuch drin hast (mit den TObjects), so dass die Listbox nicht wie erwartet funktioniert? :lupe:

Mach mal folgendes: lösche die Listbox wieder aus dem Formular, dann kommentierst du die Zeile mit dem Zahl-Einfügen in der Button-Methode aus (einfach zwei Schrägstriche an den Anfang der Zeile machen). Jetzt versuchen zu compilieren: falls es noch Rest vom ersten Versuch gibt, sollten die jetzt als Fehler aufploppen: rauslöschen, bis sich das Programm wieder kompilieren lässt. :idea:


Narses - Mi 29.11.17 18:14

user profile iconSymbroson hat folgendes geschrieben Zum zitierten Posting springen:
darf ich nochmal dazwischengrätschen ;)
Ehrlich gesagt: nein. :| Das stört grade etwas. :?

@Lena: Die Hinweise von Symbroson sind sicher korrekt, aber z.Zt. nicht wichtig oder relevant. Ich würde dir empfehlen, den Beitrag erstmal zu ignorieren. Wir sollten die Listbox jetzt wieder richtig ans Laufen kriegen.


Lena00 - Mi 29.11.17 18:23

funktioniert ganz normal ohne Fehler wenn ich die Liste lösche und die Anweisung kommentiere


Narses - Mi 29.11.17 18:25

Gut, dann wieder eine neue Listbox auf das Formular legen, .Sorted auf TRUE stellen, den Code im Button-Handler wieder aktivieren und neu probieren. Sind die Zahlen jetzt (ja, aufsteigend) sortiert? :lupe:


Lena00 - Mi 29.11.17 18:27

oh man, ich habe meinen Fehler gefunden!
Die liste nimmt ein selbst geschriebenes true im Objektinspektor nicht an, man muss es mit der Maus auswählen
Klappt jetzt!


Narses - Mi 29.11.17 18:33

Sehr schön, gut gemacht! :zustimm:

Dann kümmern wir uns jetzt darum, dass nicht irgendwas, sondern das Gewünschte in die Listbox eingetragen wird. Erstmal der Spielername:

Delphi-Quelltext
1:
ListBox1.Items.Add(Format('%.04d %s', [Random(1000), EditX.Text]));                    

Ich habe die neuen Text-Teile markiert. Was passiert: mit dem %s sagen wir der Format()-Funktion, dass noch ein String ausgegeben werden soll (nach der Zahl). Den String müssen wir dann noch im konstanten Parameter-Array ergänzen. Das "X" musst du natürlich noch auf dein Projekt anpassen. :idea:

Die Format()-Funktion ist also sowas wie eine Text-Schablone, in die man nachträglich noch was einfügen kann. :think:

Testen und Rückmelden. :zustimm:


Lena00 - Mi 29.11.17 18:35

Alles klar, ich versuche es so


Lena00 - Mi 29.11.17 18:42

Durch was muss ich die Random(1000) bei mir ersetzen? Ein Edit2.Text wird wohl nicht funktionieren


Narses - Mi 29.11.17 18:44

Kein Thema, mach so, wie du möchtest, ist dein Projekt, du entscheidest, was du erklären möchtest. ;)

Oh, jetzt hast du es schon geändert. :?

Also, welche Version soll es sein (spielt letztlich keine Rolle)?

//Edit: du brauchst in dem Fall noch ein IntToStr() StrToInt() drum rum.


Lena00 - Mi 29.11.17 18:46

die Version nicht von dir ist für mich verständlicher/nachvollziehbarer
Funktioniert das mit dem string hier auch?


Narses - Mi 29.11.17 18:49

Also dann, Rolle rückwärts. ;)

Dann kannst du auch gleich diese Zeile an die passende Stelle im Programm verschieben, wo der neue Highscore erfasst werden soll.

Den Button und den Handler brauchen wir noch, kannste drin lassen.


Narses - Mi 29.11.17 18:51

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
Funktioniert das mit dem string hier auch?
Du meinst den Spielernamen? Ne, das geht anders, einfach mit einem Plus dranhängen. Probier mal einfach selbst. Sonst sag Bescheid. ;)


Lena00 - Mi 29.11.17 18:59

Super hat funktioniert!! 8)


Lena00 - Mi 29.11.17 19:01

Endspurt: Jetzt müssen die Zahlen noch von Hoch nach Tief geordnet werden


Narses - Mi 29.11.17 19:02

Jup. ;) Vorher noch die Begrenzung der Anzahl oder weglassen?


Lena00 - Mi 29.11.17 19:05

Würde ich mittlerweile weglassen :)


Narses - Mi 29.11.17 19:12

Dann also Endspurt: wie kriegt man die Liste umgedreht... 8) Da gibt es mehrere Versionen, manche davon "eleganter" als Andere, ich schlage mal diese vor. Ist sicher nicht die beste Variante, weil die Datenhaltung in der GUI generell keine gute Idee ist, aber ich rate mal: das ist dir grade ziemlich egal, oder? :lol:

Wir werden jetzt einfach noch eine Listbox auf das Formular legen (erstmal einfach daneben), in der wir die Einträge aus der sortierten Liste umgekehrt für die Anzeige auf dem Bildschirm einfügen. Diese Listbox darf dann natürlich nicht automatisch sortieren! Die "originale" (erste) Listbox blenden wir dann einfach später aus (.Visible auf FALSE setzen, dann sieht man die nicht mehr, fertig).

In den Button-Handler kommt erstmal einfach nur rein:

Delphi-Quelltext
1:
ListBox2.Clear;                    

Vor dem Ausgeben der Liste in der neuen Listbox muss natürlich der alte Inhalt raus.

Sag bescheid, wenn du das soweit hast.


Lena00 - Mi 29.11.17 19:24

Bin soweit
Und jetzt muss in die neue Liste die alte andersrum ausgegeben werden


Narses - Mi 29.11.17 19:30

Konzept: Wir werden jetzt einfach alle Einträge aus der ersten Listbox immer wieder vorne (an der ersten Position) in der zweiten Listbox einfügen. Dabei dreht sich die Reihenfolge der Elemente automatisch um. Was brauchen wir dafür?Damit solltest du alle "Bausteine" für die aktuelle Aufgabe beisammen haben. Was in spitzen Klammern oben angegeben ist, muss natürlich passend ersetzt werden.

Probier mal, dann sehen wir weiter. :zustimm:


Lena00 - Mi 29.11.17 19:38


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm2.Button12Click(Sender: TObject);
begin
ListBox1.Items.Add(Copy('0000'+Edit2.Text, length(Edit2.Text)+14)+' ' + Edit3.Text);
//Zahl, die ja als Zeichenkette vorliegt, werden vorn vier nullen hinzugefügt,
//kopieren der letzten vier stellen der neuen Zeichenkette in die ListBox
Listbox1.Count
for ----
Listbox2.Items.Insert(<position>, <element>)
ListBox2.Clear;
Listbox1.Items.Strings[<position>]


Bei dem was in die Klammer muss, welcher Ausdruck,[/quote] und wie die for-Schleife aussehen muss bin ich echt überfragt... :(


Narses - Mi 29.11.17 19:46

Zunächstmal hast du noch die Zeile im Button-Handler drin, die einen neuen Highscore einträgt. Die sollte eigentlich bereits an die "richtige" Stelle in deinem Programm verschoben sein, nämlich da hin, wo das Spiel beendet wird. Der Button-Handler ist ja nur ein Test. :idea:

Allerdings könnte es sein, dass dein Spiel etwas aufwändiger ist und es deshalb unpraktisch zum testen, immer wieder eine Runde zu spielen, nur um einen Highscore-Test zu machen... :P Ist OK, in dem Fall brauchst du aber noch einen weiteren Test-Button, in dem wir dann jetzt die Übertragung von der ersten in die zweite Listbox programmieren.

Ansonsten ist dein "Code-Vorschlag" recht wenig... sagen wir mal "strukturiert". :? Sagtest du nicht, du hast bereits die for-Schleife im Unterricht gehabt? :gruebel:


Lena00 - Mi 29.11.17 19:54

Alles klar, genau das mit dem Button passt so, habe mein Spiel dementsprechend gestaltet

Delphi-Quelltext
1:
2:
3:
4:
5:
Listbox1.Count  //Anzahl der Elemente in der ersten Listbox
for - to - do -      //läuft über alle Elemente der ersten Listbox
Listbox2.Items.Insert(<position>, <element>)  //fügt Element an einer bestimmten Position in Listbox
ListBox2.Clear;   //Box leeren
Listbox1.Items.Strings[<position>]  //Zugriff auf ein Element Listbox 1


Wie sie im allgemeinen aufgebaut ist ja aber was genau jetzt überall rein muss angepasst auf die Box, kein Plan, ist schon ein STück her


Narses - Mi 29.11.17 19:58

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
Alles klar, genau das mit dem Button passt so, habe mein Spiel dementsprechend gestaltet
:zustimm:

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
Wie sie im allgemeinen aufgebaut ist ja aber was genau jetzt überall rein muss angepasst auf die Box, kein Plan, ist schon ein STück her
OK, dann eben Pseudocode: du beschreibst einfach in Umgangssprache (habt ihr in der Schule sicher auch schon so mal gemacht), was da passieren soll. Dann kümmern wir uns im zweiten Schritt darum, wie man das in Delphi korrekt aufschreibt. :idea:

Auf geht´s! :D


Lena00 - Mi 29.11.17 20:01

for Anfang Liste to Ende Liste do Ausgabe in Liste 2 ?

:D :D :D


Narses - Mi 29.11.17 20:07

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
for Anfang Liste to Ende Liste do Ausgabe in Liste 2
Ja, konzeptionell ist es genau das. In meinem Testprojekt hier ist das auch nur ein Zweizeiler (naja, eigentlich ein Dreizeiler).

Aber da war doch noch was, hatte ich oben schon geschrieben: bevor wir die Liste in die 2. Box ausgeben, müssen wir sie erstmal leer machen. Das muss vor dem Kopieren der Einträge passieren. Dafür hatte ich dir sogar schon den kompletten Befehl genannt. Den bitte mal richtig "anordnen".

Weiterhin: Listen fangen in Delphi immer mit der Position 0 an. Und wenn Listbox1.Count die Anzahl der Elemente in der Box ist, welchen Index hat dann das letzte Element?


Lena00 - Mi 29.11.17 20:13

Also das "leeren" vor die Schleife ?
das letzte Element dann -1 ???

sorry aber bin gerade an der Stelle an der ich es so schnell wie möglich abschließen muss.
Muss dringend noch anderes zeitaufwendiges für die Schule machen, deswegen bin ich so kurz angebunden, muss ständig auf die Uhr schauen :( :( :(


Lena00 - Mi 29.11.17 20:13

Denke es ist ja nicht mehr viel, Lücken füllen und richtige Anwendung :cry:


Lena00 - Mi 29.11.17 20:15


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Listbox1.Count  //Anzahl der Elemente in der ersten Listbox
ListBox2.Clear;   //Box leeren
for Anfang Liste to Ende Liste do Ausgabe in Liste 2 ?      //läuft über alle Elemente der ersten Listbox

Listbox2.Items.Insert(<position>, <element>)  //fügt Element an einer bestimmten Position in Listbox
Listbox1.Items.Strings[<position>]  //Zugriff auf ein Element Listbox 1


Soweit so gut


Narses - Mi 29.11.17 20:17

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
Denke es ist ja nicht mehr viel, Lücken füllen und richtige Anwendung :cry:
Ja, klar, jetzt aufgeben wäre doch echt schade... :nixweiss: Das schaffst du jetzt auch noch! :zustimm:

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
Also das "leeren" vor die Schleife ?
Jap.

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
das letzte Element dann -1 ???
Genau so!

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
sorry aber bin gerade an der Stelle an der ich es so schnell wie möglich abschließen muss.
Muss dringend noch anderes zeitaufwendiges für die Schule machen, deswegen bin ich so kurz angebunden, muss ständig auf die Uhr schauen :( :( :(
Hm, das tut mir leid, allerdings ist es eben dein Projekt, du solltest es also auch selbst fertigstellen. :(


Symbroson - Mi 29.11.17 20:18

[edit] sorry - hätte das vorher ausprobieren sollen :/


Lena00 - Mi 29.11.17 20:19

Wie wird meine umganssprachlich formulierte Schleife jetzt zu einer von Delphi
und wo die -1 integriert?

... do ListBox 1od2? := ListBox 1od 2? -1 ???


Narses - Mi 29.11.17 20:22

user profile iconSymbroson hat folgendes geschrieben Zum zitierten Posting springen:
Eigeltlich ist es egal wie lang die liste ist. Wenn du Low und high nimmst bist du auf der sicheren Seite
@user profile iconSymbroson: Also mein D7 streikt bei sowas: for i := Low(Listbox1) to High(Listbox1) do :nixweiss: Bist du sicher, dass dein Beitrag hier grade konstruktiv wirkt? :gruebel:


Narses - Mi 29.11.17 20:28

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
Wie wird meine umganssprachlich formulierte Schleife jetzt zu einer von Delphi
Indem du die bereits genannten Code-Stücke korrekt zusammenfügst. :idea:

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
und wo die -1 integriert?

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
ListBox2.Clear;   //Box leeren
for Anfang Liste to Ende Liste do Ausgabe in Liste 2 ?      //läuft über alle Elemente der ersten Listbox
Das erste Element hat den Index 0, das hatte ich ja schon erwähnt, das letzte den Index Listbox1.Count-1, wie du bereits korrekt festgestellt hast.

Einfach einsetzen, fertig. :zustimm:


Lena00 - Mi 29.11.17 20:32


Delphi-Quelltext
1:
2:
3:
4:
ListBox2.Clear;   //Box leeren
for i :=0 to Listbox1.Count-1 do      //läuft über alle Elemente der ersten Listbox
Listbox2.Items.Insert(<position>, <element>)  //fügt Element an einer bestimmten Position in Listbox
Listbox1.Items.Strings[<position>]  //Zugriff auf ein Element Listbox 1


ist position = listbox 2??? --> macht ja keinen Sinn bei Listbox2.Items.Insert(<position>, <element>)
und element??


Narses - Mi 29.11.17 20:39

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
ListBox2.Clear;   //Box leeren
for i :=0 to Listbox1.Count-1 do      //läuft über alle Elemente der ersten Listbox
Na geht doch! :zustimm:

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
Listbox2.Items.Insert(<position>, <element>)  //fügt Element an einer bestimmten Position in Listbox                    
Bis hier erstmal OK, nur noch die Platzhalter ersetzen.
user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
ist position = listbox 2??? --> macht ja keinen Sinn
So ist es, das macht keinen Sinn. Position steht für die erste Stelle in der 2. Listbox. Wie war das grade noch, welchen Index hat die erste Position in einer Delphi-Liste? :zwinker:

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
bei Listbox2.Items.Insert(<position>, <element>)
und element??
Dieses Position haben wir jetzt geklärt, also noch das Element. Das soll ja aus Listbox1 kommen, und zwar das Element an der Stelle, auf die der Schleifenindex zeigt. :idea: (die beiden Positionen sind also offensichtlich unterschiedliche Indizes)

Durchhalten, gleich geschafft! :dance2:


Lena00 - Mi 29.11.17 20:46


Delphi-Quelltext
1:
2:
Listbox2.Items.Insert(Listbox2+1, i)  //fügt Element an einer bestimmten Position in Listbox
Listbox1.Items.Strings[Listbox1-1]


wobei ich nicht glaube dass das stimmt


Narses - Mi 29.11.17 20:52

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
wobei ich nicht glaube dass das stimmt
Jup, ist aber auf dem richtigen Weg. ;)

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
Listbox2.Items.Insert(Listbox2+1, i)  //fügt Element an einer bestimmten Position ein                    
Hier soll doch die Position hin, an der eingefügt werden soll. Und grade haben wir bereits festgestellt, dass Delphi-Listen immer mit 0 starten. Ist das echt so undurchsichtig?

Das „i“ als zweiter Parameter ist schon fast richtig, aber da fehlt nochwas... :zwinker:


Lena00 - Mi 29.11.17 20:57


Delphi-Quelltext
1:
2:
3:
4:
5:
Listbox1.Count;  //Anzahl der Elemente in der ersten Listbox
ListBox2.Clear;   //Box leeren
for i :=0 to Listbox1.Count-1 do      //läuft über alle Elemente der ersten Listbox , -1 weil 0 mitgezählt wird
Listbox2.Items.Insert(Listbox2-1, i)  //fügt Element an einer bestimmten Position in Listjavascript:PostEdit.editorInsertEmoticon(':)')box
Listbox1.Items.Strings[Listbox1-1]  //Zugriff auf ein Element Listbox 1


Ganz ehrlich, ich steh auf dem Schlauch und kann nach der Anzahl an Stunden nicht mehr klar denken, meine Nerven sind am Ende :) :)
Kein Plan was nach i fehlt, ob das nach dem do so passt und wie position und element genau aussehen muss, sorry...
Auch wenn du mir das für dich absolut primitiv erklärst


Symbroson - Mi 29.11.17 21:04

Darf ich nochmal auf die Code-Hilfe zuweisen?
Genauso wie nach etwas warten nachdem man einen '.' schreibt eine Liste von verfügbaren Operationen angezeigt wird, wird nach dem Schreiben einer '(' nach einem Funktionsnamen eine Liste der Argumentnamen inklusive Typ angezeigt.
Was stehen da bei 'Listbox.Items.Insert(' für Typen?
Zitat:

Delphi-Quelltext
1:
Listbox2.Items.Insert(Listbox2-1, i)                    

Zudem ist ListBox eine Klasse und man kann von einer Klasse keinen integer abziehen.


Lena00 - Mi 29.11.17 21:07

Okay... das verwirrt noch mehr


Narses - Mi 29.11.17 21:08

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
Ganz ehrlich, ich steh auf dem Schlauch und kann nach der Anzahl an Stunden nicht mehr klar denken, meine Nerven sind am Ende :) :)
Ja, Respekt, das war schon ein Stück. :beer: Vielleicht sollten wir auch einfach ne Pause machen. ;) Du siehst die Bäume nicht mehr... :zwinker:

user profile iconLena00 hat folgendes geschrieben Zum zitierten Posting springen:
Kein Plan was nach i fehlt, ob das nach dem do so passt und wie position und element genau aussehen muss, sorry...
Die erste Zeile Listbox1.Count; kannst du löschen, die bringt so nix.

Hier Listbox2.Items.Insert(Listbox2-1, i); hast du den mittleren Teil meines letzten Beitrags nicht beachtet.

Und zu guter letzt: das „i“ muss natürlich hier eingesetzt werden: Listbox1.Items.Strings[Listbox1-1];

Noch ein Versuch für heute? :?


Lena00 - Mi 29.11.17 21:12


Delphi-Quelltext
1:
2:
3:
4:
ListBox2.Clear;   //Box leeren
for i :=0 to Listbox1.Count-1 do      //läuft über alle Elemente der ersten Listbox , -1 weil 0 mitgezählt wird
Listbox2.Items.Insert((0, i));  //fügt Element an einer bestimmten Position in Listbox
Listbox1.Items.Strings[i]  //Zugriff auf ein Element Listbox 1


Ich möchte es gern jetzt abschließen, und mich nicht nohmal ransetzen müssen
Ich weiß auch es ist mein Projekt aber bitte helft mir das zu beenden, verzweifel langsam wirklich


Narses - Mi 29.11.17 21:16

95%... ;) nur noch zwei Sachen, dann sollte das laufen:

Die doppelten runden Klammern sind überflüssig, da reichen einfache.

Da wo jetzt das einzelne „i“ steht muss die letzte Zeile hin (da hin ist das i ja gewandert). :idea:


Lena00 - Mi 29.11.17 21:20


Delphi-Quelltext
1:
2:
3:
ListBox2.Clear;   //Box leeren
for i :=0 to Listbox1.Count-1 do      //läuft über alle Elemente der ersten Listbox , -1 weil 0 mitgezählt wird
Listbox2.Items.Insert(0,Listbox1.Items.Strings[i]);


So? Richtig verstanden?


Narses - Mi 29.11.17 21:21

:party:

Müsste doch jetzt laufen, oder? :D


Symbroson - Mi 29.11.17 21:25

Ich glaube es ist das beste, wenn du einfach mal den ganzen Code (bzgl des Sortierens) hier rein postest. Bei so vielen Codeschnipseln kann man leicht den Überblick verlieren

Im Anhang ist nochmal meine Version


Lena00 - Mi 29.11.17 21:35

Das war für mich echt harte Arbeit!
Aber es läuft, und das auch noch richtig, bin mega mega erleichert!
Super großes Dankeschön und es muss wirklich gesagt werden, dass die Hilfe sehr freundlich und auch nicht genervt klang trotz eventueller primitiver/offensichtlicher Fragen. Respekt für das Durchhaltevermögen und wirklich die krasse Hilfbereitschaft! Echt coole Plattform! DANKE!


TarantelFaser47 - Sa 02.12.17 22:15

Danke an alle die an diesem Thema gearbeitet haben, dadurch habe ich auch vieles verstanden...

Also nochmal DANKE!!!


Delphi-Laie - So 03.12.17 00:57

Was mich ein wenig irritiert, ist, daß Symbroson ein wenig "schroff angegangen" wurde. Das ist für dieses auffällig freundliche Forum eher atypisch. Gut, es steht "Tutorial", wie seinerzeit in Ninis Tuturial: https://www.entwickler-ecke.de/viewtopic.php?t=114059. Daß Tutorials Sperrzone sind, weiß nicht jeder, Jungmitglieder wie Symbroson wohl eher nicht, und mir wäre es auch nicht mehr bewußt gewesen.

Deshalb rege ich ganz vorsichtig an, in Fällen, in denen Dritthilfe wenig oder nicht erwünscht ist, die Schreibrechte rechtzeitig zu begrenzen, wie eben seinerzeit in o.g. Diskussion, um Irritationen zu vermindern oder zu vermeiden.


Narses - So 03.12.17 03:43

Moin!

user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Daß Tutorials Sperrzone sind, weiß nicht jeder, Jungmitglieder wie Symbroson wohl eher nicht, und mir wäre es auch nicht mehr bewußt gewesen.
Es gibt einen PN-Wechsel zwischen user profile iconSymbroson und mir, in dem dieser Thread Gegenstand ist und er im Vorfeld bereits von mir unter Verweis auf den Nini-Thread und die darauf folgende Diskussion informiert wurde, wie wir diese „Spezialfälle“ behandeln wollen. Insofern darf user profile iconSymbroson (was du aber nicht wissen konntest) durchaus als voll und rechtzeitig informiert angesehen werden.

Wir hatten auch im Team Gespräche zu dem Thema und wie wir weiter damit umgehen wollen.

cu
Narses

PS: Es gab im Nini-Thread keine Einschränkung der Schreibrechte, das kann die Forensoftware (zumindest noch) nicht.