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 Narses: Titel erweitertModeriert von Narses: 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!
Lena00 hat folgendes geschrieben : |
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:
@
Lena00: 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 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:
| 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; begin list := TStringList.Create; list.Assign(ListBox1.Items); 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; begin list := TStringList.Create; list.Assign(ListBox1.Items); 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; begin list := TStringList.Create; list.Assign(ListBox1.Items); list.CustomSort(Vergleiche); listbox1.Items.Assign(list); 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 ; if Index1 > Index2 then Item:=-1; if Index1 < Index2 then Item:=+1; end;
procedure TForm2.Button13Click(Sender: TObject); var list: TStringList; begin list := TStringList.Create; list.Assign(ListBox1.Items); list.CustomSort(Vergleiche); 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:
|
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+1] then 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 ; if Index1 > Index2 then result:=-1; if Index1 < Index2 then result:=+1; end;
procedure TForm2.Button13Click(Sender: TObject); var list: TStringList; begin list := TStringList.Create; list.Assign(ListBox1.Items); list.CustomSort(Vergleiche); 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
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
Symbroson eingeschlagen hat, oder möchtest du eventuell eine Alternative kennenlernen, die u.U. „leichter“ sein könnte (für den Anfang)?
Symbroson 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!
Lena00 hat folgendes geschrieben : |
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: ;)
Lena00 hat folgendes geschrieben : |
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) [Random(1000)] Format('%.04d', [Random(1000)]) |
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)+1, 4)); |
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
Symbroson hat folgendes geschrieben : |
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
Lena00 hat folgendes geschrieben : |
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:
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?
- Wir bauchen die Anzahl der Elemente in der ersten Listbox: Listbox1.Count
- Wir brauchen eine for-Schleife, die über alle Elemente der ersten Listbox läuft.
- Wir brauchen einen Befehl, der ein Element an einer bestimmten Position einer Listbox einfügt (und nicht einfach immer ans Ende stellt): Listbox2.Items.Insert(<position>, <element>)
- Wir brauchen Zugriff auf ein Element einer Listbox: Listbox1.Items.Strings[<position>]
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)+1, 4)+' ' + Edit3.Text); 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 for - to - do - Listbox2.Items.Insert(<position>, <element>) ListBox2.Clear; Listbox1.Items.Strings[<position>] |
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
Lena00 hat folgendes geschrieben : |
Alles klar, genau das mit dem Button passt so, habe mein Spiel dementsprechend gestaltet |
:zustimm:
Lena00 hat folgendes geschrieben : |
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
Lena00 hat folgendes geschrieben : |
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 ListBox2.Clear; for Anfang Liste to Ende Liste do Ausgabe in Liste 2 ? Listbox2.Items.Insert(<position>, <element>) Listbox1.Items.Strings[<position>] |
Soweit so gut
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
Symbroson hat folgendes geschrieben : |
Eigeltlich ist es egal wie lang die liste ist. Wenn du Low und high nimmst bist du auf der sicheren Seite |
@
Symbroson: 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
Lena00 hat folgendes geschrieben : |
Wie wird meine umganssprachlich formulierte Schleife jetzt zu einer von Delphi |
Indem du die bereits genannten Code-Stücke korrekt zusammenfügst. :idea:
Lena00 hat folgendes geschrieben : |
und wo die -1 integriert? |
Lena00 hat folgendes geschrieben : |
Delphi-Quelltext 1: 2:
| ListBox2.Clear; for Anfang Liste to Ende Liste do Ausgabe in Liste 2 ? | |
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; for i :=0 to Listbox1.Count-1 do Listbox2.Items.Insert(<position>, <element>) Listbox1.Items.Strings[<position>] |
ist position = listbox 2??? --> macht ja keinen Sinn bei Listbox2.Items.Insert(<position>, <element>)
und element??
Narses - Mi 29.11.17 20:39
Lena00 hat folgendes geschrieben : |
Delphi-Quelltext 1: 2:
| ListBox2.Clear; for i :=0 to Listbox1.Count-1 do | |
Na geht doch! :zustimm:
Lena00 hat folgendes geschrieben : |
Delphi-Quelltext 1:
| Listbox2.Items.Insert(<position>, <element>) | |
Bis hier erstmal OK, nur noch die Platzhalter ersetzen.
Lena00 hat folgendes geschrieben : |
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:
Lena00 hat folgendes geschrieben : |
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) Listbox1.Items.Strings[Listbox1-1] |
wobei ich nicht glaube dass das stimmt
Narses - Mi 29.11.17 20:52
Lena00 hat folgendes geschrieben : |
wobei ich nicht glaube dass das stimmt |
Jup, ist aber auf dem richtigen Weg. ;)
Lena00 hat folgendes geschrieben : |
Delphi-Quelltext 1:
| Listbox2.Items.Insert(Listbox2+1, i) | |
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; ListBox2.Clear; for i :=0 to Listbox1.Count-1 do Listbox2.Items.Insert(Listbox2-1, i) Listbox1.Items.Strings[Listbox1-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
Lena00 hat folgendes geschrieben : |
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:
Lena00 hat folgendes geschrieben : |
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; for i :=0 to Listbox1.Count-1 do Listbox2.Items.Insert((0, i)); Listbox1.Items.Strings[i] |
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; for i :=0 to Listbox1.Count-1 do 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!
Delphi-Laie hat folgendes geschrieben : |
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
Symbroson 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
Symbroson (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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!