Autor Beitrag
Goggl
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 15.01.06 05:08 
Hi. Ich bin neu hier und habe auch nicht soooo viel Ahnung von Delphi.
Ich soll für die Schule ein Reaktionstest schreiben.
Soweit bin ich auch damit fertig geworden, nur ich habe mir als Ziel gesetzt eine Highscore zu machen.
jetzt meine Frage :
Kann ich eine Highscore mit einer Listbox mit Array machen?
also auf Deutsch : das die einzelnen einträge untereinander stehen.
bsp. :

PersonA 300 ms(reaktions-zeit)
PersonB 340 ms
PersonC 500 ms
usw...

Bitte um hilfe
thx schonmal im vorraus

mfg Goggl
der_zaehe
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 317

WinXP SP2
D6 Pers, D2005 Prof, VS2005
BeitragVerfasst: So 15.01.06 13:50 
ich hab zwar gerade kein delphi zur hand, aber soviel ich weiß, besitzt die listbox eine eigenschaft vom typ TStringList. benutze doch einfach die, über "add" kannst du neue einträge hinzufügen.

_________________
[inspirationslos]
Goggl Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 15.01.06 15:49 
hm danke, nur kann ich damit nicht soviel anfangen weil wie benutze ich diese eigenschaft?!
wie man einträge hinzufügt weiß ich.
mein problem ist ja das er die einträge , unabhängig von der größe, untereinander-sortiert.
Ich will ja die einzelnen Einträge sortiert nach größer der reaktionszeit in die listbox kriegen.

mfg goggl
Marco D.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: So 15.01.06 16:09 
Hallo,

wie wäre es damit?

ausblenden Delphi-Quelltext
1:
listbox1.sorted:=true;					


Alternatov kannst du die Property auch direkt im Objektinspektor auf true setzen.

_________________
Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
Goggl Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 15.01.06 16:19 
wow, es hat fast geklappt ^^
ich habe nun das problem das ich ja in der Highscore nicht nur eine zahl angebe , sondern auch einen Namen, der sich in die listbox einträgt also sieht dann ja so aus Name + Reaktionszeit ( zb : PersonA 600ms)
bin ich da auf dem totalen holzweg und sollte es lieber mit was anderem als einer listbox probieren oder geht das irgendwie anders ?

mfg goggl


Zuletzt bearbeitet von Goggl am So 15.01.06 16:27, insgesamt 1-mal bearbeitet
Marco D.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: So 15.01.06 16:22 
Wie wäre es, wenn du zuerst die Zahl schreibst, und dann den Namen? Dann sollte es eigentlich geben.

_________________
Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
Goggl Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 15.01.06 16:45 
es klappt und was mich wundert, das er sogar die kleinste zahl nach oben setzt :)
super danke an alle die sich bemüht haben mir zu helfen :)

mfg goggl

************************************************************************************
Leider noch ein fehler ;(


Zuletzt bearbeitet von Goggl am So 15.01.06 17:25, insgesamt 1-mal bearbeitet
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 15.01.06 16:45 
Moin und :welcome: im Forum!

Wenn ich mir das so ansehe, dann hast du zwei Möglichkeiten:

a) [einfacher, wenn du im Umgang mit den VCLs noch nicht so gut drauf bist] Sortiere die Einträge vorher in deinem Array oder wo auch immer du sie speicherst und dann überträgst du die Daten bereits vorsortiert in die Listbox, die behält dann ja die Reihenfolge bei.

b) ["eleganter", aber setzt etwas Übung im Umgang mit den VCLs voraus] Du verwendet eine eigene Datenvergleichsprozedur, die du der Listbox zum Sortieren mitgibst (CustomSort), oder noch besser: du nimmst ein ListView im ViewStyle vsReport, dann hast du auch gleich noch Spalten.

Genauer kann ich´s grad nicht sagen, hab kein Delphi zur Hand. Vielleicht entscheidest du dich erstmal für eine Variante, dann können wir genauer zur Sache gehen. :wink:

cu
Narses

//EDIT: war zu langsam... :| naja, dir ist schon klar, dass das nur dann klappt, wenn die Zahlen alle die gleiche Anzahl Stellen haben?!
Goggl Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 15.01.06 17:29 
nein, das habe ich leider erst zu spät erfahren :( .
also rückfruf. frage besteht weiterhin.

@Narses. also ich würde mich für die einfachere variante entscheiden, wir haben auch arrays in der schule behandelt, aber nur wenn die zahlen in einer reihe stehen (in einer listbox) und nicht untereinander.
das kann ich leider nicht.
P.S. danke für die freundlichen grüße :)

Hoffe auf weitere hilfe.

mfg Goggl

edit: um mal ein wenig code reinzusetzten damit es nicht zu theoretisch wird :

Speichern von einer Listbox:
Listbox1.Items.SaveToFile(SaveDialog1.FileName);

laden von einer Listbox:
Listbox1.Items.LoadFromFile(form2.OpenDialog1.filename);

sortieren der Listbox:
Listbox1.sorted:=true;
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 15.01.06 23:31 
Moin!

Dein Code ist leider zu fragmenthaft, um damit was anfangen zu können. IMHO hast du gerade folgenes Problem:
- Du hast einen Vorgang, der Namen und Zahlen erzeugt (Spiel, Test, was auch immer)
- Du möchtest eine Bestenliste (Highscore) realisieren
- Du schreibst im Moment die Namen/Zahlen direkt in die Listbox (was auch immer), heißt, du benutzt die Komponente also faktisch zur Datenhaltung.

Korrekt bis hier? :wink:

Dann ist leider die zweite Variante doch die "bessere", weil du damit leichter das Datenspeicherproblem in den Griff kriegst. :| Bei Variante a) brauchst du nämlich noch zusätzliche Datenstrukturen, und wenn du die nicht bereits jetzt schon im Programm hast, dann wäre das mehr Aufwand.

Ich zeig´s dir mal anhand eines ListViews: aaalso:
- ListView auf das Formular ziehen, falls nicht aktiviert, aktivieren (durch anklicken)
- ViewStyle auf vsReport setzen
- SortType auf stData
- Columns anklicken und auf den kleinen Button mit den Punkten klicken (Property-Editor öffnen)
- Auf das "Neu"-Symbol klicken (gelben Funkelzettel)
- Bei Caption der neuen Listenspalte "Name" eingeben
- Noch eine Spalte anlegen, Caption "Zeit" und Alignment "taRightJustify"
- Wieder das Listview anklicken, auf die Ereigniss-Seite im Inspector gehen
- Doppelklick auf "OnCompare", es wird ein Ereignishandler angelegt
- Folgenden Code reintun:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
// Vergleichsprozedur zum Sortieren des ListView
procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
  Data: Integer; var Compare: Integer);
begin
  if (Item1.Data = Item2.Data) then
    Compare := 0
  else if (Integer(Item1.Data) > Integer(Item2.Data)) then
    Compare := 1
  else
    Compare := -1;
end;

- Dann noch einen Button anlegen, um zum Testen neue Einträge zu erzeugen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
// neuen Eintrag zum Testen anlegen
procedure TForm1.Button1Click(Sender: TObject);
  var
    Zeit: Integer;
begin
  with ListView1.Items.Add do begin // neuen Eintrag erzeugen
    Caption := 'Ich'// Name eintragen
    Zeit := Random(1000); // zufällige Zeit erzeugen
    SubItems.Add(IntToStr(Zeit)); // Zeit zum Anzeigen als Text
    Data := Pointer(Zeit); // Zeit zum Vergleichen binär speichern (.Data ist vom Typ Pointer, deshalb die typecasts)
  end;
end;

Schau mal, ob zu damit klar kommst. Du wirst feststellen, dass hier das automatische Sortieren super klappt! :D

Das ganze hat allerdings auch noch einen (kleinen) Nachteil: Du kannst nicht mehr so schön einfach mit .SaveToFile() den Inhalt speichern. Hier würde ich dir dann INI-Dateien empfehlen; such mal ein bischen hier im Forum danach, wenn´s gar nicht klappt, dann kannste dich ja nochmal melden.

cu
Narses
Goggl Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 16.01.06 00:31 
<<<Speechless!
Geil Geil Geil :) .
Habs an einer anderen Form schonmal ausprobiert und klappt echt total super.
Jetzt muss ich das ganze nurnoch einbauen.
Aber nichtmehr heute ;) .

nochmals 1000x THX

mit freundlichen grüßen

Goggl


Edit : wegen dem speichern guck ich auch morgen. wenns ein problem gibt starte ich nochmal ein extra thread :)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 16.01.06 00:47 
Moin!

Fein, wenn´s klappt. :D

Markierst du dann den Thread noch entsprechend, wenn dein Problem gelöst ist? Danke. :wink:

cu
Narses
Abu36
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59



BeitragVerfasst: Mo 27.03.06 17:38 
hab auch noch mal eine frage zum abspeichern und laden einer listbox.

Listbox1.Items.SaveToFile(saveDialog1.filename);


bei mir kommt jetzt ein fehler, weil der computer 'savedialog1' nicht kennt und den filename.
ich müsste doch erst die datei erstellen??? und was mach ich mit dem 'savedialog1' ?????
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Mo 27.03.06 17:46 
es gibt eine komponente namens savedialog unter der kategorie "dialogs"
du musst diesen savedialog zuvor erst aufrufen, bevor du von diesem eine eigenschaft verwenden kannst :P
ziehe dazu einfach die komponente auf dein formular!
ausblenden Delphi-Quelltext
1:
2:
 savedialog1.Execute;
 listbox1.Items.LoadFromFile(savedialog1.FileName);


;)
Abu36
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59



BeitragVerfasst: Mo 27.03.06 17:55 
das hatte ich auch schon einmal probiert, kommt aber trotzdem fehlermeldung: undefinirter bezeichner: savedialog1 bzw. opendialog1?????

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm33.speichernClick(Sender: TObject); //speichern
begin
 savedialog1.Execute;
 Listbox1.Items.SaveToFile(saveDialog1.highscore);
end;

procedure TForm33.ladenClick(Sender: TObject);    //laden
begin
 OpenDialog1.Execute;
 Listbox1.Items.LoadFromFile(OpenDialog1.highscore)
end;
Abu36
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59



BeitragVerfasst: Mo 27.03.06 18:48 
och, hab das problem gelöst, mir fehlt jetzt nur, dass ich den inhalt dieser datei auch wieder löschen. bis jetzt lösch ich immer nur den inhalt der listbox