Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - 3 Bedingungen in ein Array speichern


Basti1207 - Mi 13.05.09 12:51
Titel: 3 Bedingungen in ein Array speichern
Guten Tag, ich sitze jetzt schon fast seit einer Woche an einem Problem, welches eigenlich einfach klingt.. Dies ist es wahrscheinlich aber aber irgendwie stehe ich aufm Schlauch..

Also kurze Einweisung ;)
Ich möchte ein (oder eventuell auch 2 wenn dadurch besser lösbar..) Arry(s) erstellen, in denen Folgendes abgespeichert werden soll:
- Benutzername
- Passwort
- Berechtigung (integer Wert: 1,2 oder 3)
Bis dahin kein Problem. Doch nun soll hinzugefügt werden können, Wer (also welcher Benutzername) an welchen Datum wie viele Punkte gemacht hat.
Bis jetzt habe ich versucht das Folgendermaßen zu lösen

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
TPunkte =record
        datum : Tdate;
        points : integer;
        end;
TUsers = record
    benutzername : string[64];
    passwort : string[64];
    rechte : integer;
    punkte : TPunkte;
    end;

Jedoch kann ich damit nur speichern Wer an einem bestimmten Datum wie viele Punkte gemacht hat und nich für mehrer Daten..
Die Lösung wäre etwas wie dieses hier

Delphi-Quelltext
1:
Benutzername[id].Datum[130509] := 5000;                    

Aber das geht ja leider nicht und dient nur dazu euch zu erklären wie ich dies Meine..
Also das ich sagen kann Benutzer123 hat am 13.05.09 5000 Punkte gemacht, Benutzer312 hat am 12.05.09 2000 Punkte gemacht etc..

Ich hoffe ihr habt verstanden was ich meine weil irgendwie weiß ich nicht so richtig wie ichs erklären soll :/

mfg und schonmal danke ;)


BenBE - Mi 13.05.09 12:58


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type TBenutzer = record
    Name:String;
    PasswordHash:packed array[0..63of Byte; //SHA512 Hash
    Punkte:Integer;
    //...
end;

var
    UserData : array of TBenutzer;


HTH


Narses - Mi 13.05.09 13:35

Moin!

user profile iconBasti1207 hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
TPunkte =record
        datum : Tdate;
        points : integer;
        end;
TUsers = record
    benutzername : string[64];
    passwort : string[64];
    rechte : integer;
    punkte : array of TPunkte;
    end;
Wenn ich das richtig verstanden habe, sollte das schon reichen. :idea: ;)

cu
Narses


Basti1207 - Mi 13.05.09 16:23

Guten Nachmittag ;)
Ja, das sollte genau die Lösung des Problem sein :)
Doch nun taucht ein weiteres Problem auf wenn ich TUsers auf die Festplatte schreiben will

Delphi-Quelltext
1:
[Fehler] Unit1.pas(47): Typ 'TUsers' benötigt Finalization - nicht im Dateityp erlaubt                    

So sieht atm meine Definition der Records aus sowie die Varibalen

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
TPunkte =record
        points : integer;
        end;
TUsers = record
    benutzername : string;
    passwort : string;
    rechte : integer;
    punkte : array of TPunkte;
    end;


Delphi-Quelltext
1:
2:
3:
4:
var
  Form1: TForm1;
  Users : array of TUsers;
  datei : file of TUsers;


Hoffe ihr habt auch darauf so ne schnelle und tolle Antwort :)


Narses - Mi 13.05.09 16:37

Moin!

user profile iconBasti1207 hat folgendes geschrieben Zum zitierten Posting springen:
Doch nun taucht ein weiteres Problem auf wenn ich TUsers auf die Festplatte schreiben will
Tja, dieses Konstrukt kann man allerdings (in deinem Fall leider) nicht mehr in eine typisierte Datei schreiben. :nixweiss:

Lösung: Eigenes Dateiformat mit TFileStream bauen. :idea:

cu
Narses


Delete - Mi 13.05.09 16:42

Bessere Lösung: eine Datenbank verwenden ;), aber das hängt vom eigenen Wissensstand sowie der Delphi-Edition ab.


delfiphan - Do 14.05.09 16:40

Bei einem file of Konstrukt muss die Grösse eines einzelnen Eintrages fix sein. Du möchtest aber für einen Eintrag eine Variable Menge an Daten (Punktestände) speichern. Ich würde dir dazu die Verwendung von XML empfehlen.

Generell empfehle ich, über die Verwendung einer Datenbank, sowie objektorientierteres Design und gehashte Passwortspeicherung nachzudenken.