| 
| 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 21: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 21: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 21: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 21: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 22: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 22: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 22: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 22: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 22: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 22: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: Di 28.11.17 23: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: Di 28.11.17 23: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: Di 28.11.17 23: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: Di 28.11.17 23: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: Di 28.11.17 23: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: Di 28.11.17 23: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: Di 28.11.17 23:59 
 |  |  |  
| Symbroson 
          Beiträge: 382
 Erhaltene Danke: 67
 
 Raspbian, Ubuntu, Win10
 C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
 
 | 
Verfasst: Mi 29.11.17 00: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 00:07, insgesamt 1-mal bearbeitet
 |  |  |  
| Lena00  
          Beiträge: 65
 Erhaltene Danke: 4
 
 
 
 
 | 
Verfasst: Mi 29.11.17 00: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 00: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 00:13, insgesamt 1-mal bearbeitet
 |  |  |  
| Lena00  
          Beiträge: 65
 Erhaltene Danke: 4
 
 
 
 
 | 
Verfasst: Mi 29.11.17 00: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 00:16, insgesamt 1-mal bearbeitet
 |  |  |  |