Autor Beitrag
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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:

ausblenden 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:
ausblenden Delphi-Quelltext
1:
list := TStringList.Create;					

Als nächstes muss unsere String-Liste die Items aus der ListBox zugewiesen bekommen:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
{Magie}
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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?

_________________
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65
Erhaltene Danke: 4



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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
ausblenden 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

_________________
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65
Erhaltene Danke: 4



BeitragVerfasst: Di 28.11.17 23:25 
:lol: Klingt alles so easy, aber bin leicht überfordert :les:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Di 28.11.17 23:28 
Ja so ungefähr ^^
ausblenden 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

_________________
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65
Erhaltene Danke: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65
Erhaltene Danke: 4



BeitragVerfasst: Mi 29.11.17 00:07 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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: )

_________________
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65
Erhaltene Danke: 4



BeitragVerfasst: Mi 29.11.17 00:31 
Glückwunsch! :wink:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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:
ausblenden 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 ^^)

_________________
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65
Erhaltene Danke: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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 😴

_________________
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65
Erhaltene Danke: 4



BeitragVerfasst: Mi 29.11.17 00:59 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
list.Add(Editn.Text)					

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65
Erhaltene Danke: 4



BeitragVerfasst: Mi 29.11.17 01:06 
unit2.pas(623,6) Error: identifier idents no member "items"

Diese Fehlermeldung wird nun angezeigt... :(
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65
Erhaltene Danke: 4



BeitragVerfasst: 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