Autor |
Beitrag |
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Zuletzt bearbeitet von Symbroson am Di 28.11.17 22:40, insgesamt 1-mal bearbeitet
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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
wenn ich dir zu schnell bin sag bitte Bescheid ja?
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
Lena00
Beiträge: 65
Erhaltene Danke: 4
|
Verfasst: 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
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Di 28.11.17 23:16
Das sieht ja schonmal ganz gut aus.
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
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
Lena00
Beiträge: 65
Erhaltene Danke: 4
|
Verfasst: Di 28.11.17 23:25
Klingt alles so easy, aber bin leicht überfordert
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
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
Lena00
Beiträge: 65
Erhaltene Danke: 4
|
Verfasst: Di 28.11.17 23:43
Das hätte ich eigentlich sogar wissen müssen
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
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
Lena00
Beiträge: 65
Erhaltene Danke: 4
|
Verfasst: 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
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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.
(100. Beitrag Prämiere )
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
Lena00
Beiträge: 65
Erhaltene Danke: 4
|
Verfasst: Mi 29.11.17 00:31
Glückwunsch!
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
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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 ^^)
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
Lena00
Beiträge: 65
Erhaltene Danke: 4
|
Verfasst: Mi 29.11.17 00:51
Achja....result, da war ja was
Um die Uhrzeit ist mein brain am Ende
Muss ja aber werden
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Mi 29.11.17 00:54
Jup alles gut ^^
Wenn du sonst noch was wissen wolltest zu diesem Thema frag einfach
Ansonsten : Gute Nacht 😴
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
Lena00
Beiträge: 65
Erhaltene Danke: 4
|
Verfasst: Mi 29.11.17 00:59
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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
ja sorry mein Fehler - hatte eben ausgeschalten ^^
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Zuletzt bearbeitet von Symbroson am Mi 29.11.17 01:07, insgesamt 1-mal bearbeitet
|
|
Lena00
Beiträge: 65
Erhaltene Danke: 4
|
Verfasst: Mi 29.11.17 01:06
unit2.pas(623,6) Error: identifier idents no member "items"
Diese Fehlermeldung wird nun angezeigt...
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Zuletzt bearbeitet von Symbroson am Mi 29.11.17 01:13, insgesamt 1-mal bearbeitet
|
|
Lena00
Beiträge: 65
Erhaltene Danke: 4
|
Verfasst: Mi 29.11.17 01:12
So sieht das jetzt aus
Gute Frage, aber das mit dem '.' und warten funtioniert bei mir auch ^^
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von Lena00 am Mi 29.11.17 01:16, insgesamt 1-mal bearbeitet
|
|
|