![]() |
Daten organisieren
Hallo, dies ist mein erster Beitrag. Ich hoffe mal ich krieg das hin mein Problem zu schildern. :!:
Ich entschuldige mich gleich für den Thread-Titel, ich wusste nicht wie ich mein Problem besser präzisieren sollte. Ich bin dabei eine Datei zu parsen und verschiedene Datenstrukturen da rauszuparsen. Hier mal ein paar Beispiele: PlayerAmmo: byte, byte TextMsg : byte, Pchar Status : short PlayerH : byte Score : byte, byte, byte .. ... Zusätzlich zu diesen Informationen beinhaltet jede Struktur ein TimeStamp und eine Signatur um zu erkennen um welche Datenstruktur es sich handelt. Da es sich hier um sogenannte "GameMessages" handelt, wollte ich diese in einem record verallgemeinern und ein Array draus machen. (Es gibt noch mehr Informationen, die ich rausparse). Sortiert soll das nach dem Offset bzw. gleichzeitig dann auch nach dem Timestamp sein. (Messages sind konsekutiv nach dem Zeitablauf angeordnet)
Delphi-Quellcode:
Natürlich geht das so nicht mit case im record. Aber ich weiss sonst nicht wie ich die verschiedenen Messages zusammenfassen soll, weil ich ja am Ende alles sortiert nach Timestamps anzeigen will. Also muss irgendwie alles in ein großes sortierbares Array. Zudem will ich am Ende noch Messages rausfiltern können aus der Anzeige im Memo. Das würde bedeuten jedesmal wieder den Record durchzugehen (wenn ich denn erstmal eins hätte, das damit klappt) und die Messages nicht ins Memo zu kopieren, welche im Filter angegeben sind.
const
MSG_TXT: 1; MSG_SCORE: 2; type TXT_MSG = record; ID : byte; TXT : String; end; SCORE_MSG = record; KScore: byte; DScore: byte; EScore: byte; end; ....... GAME_MESSAGE = record OffSet : Integer; Typ : Integer; case Typ of MSG_TXT: MESSAGE: TXT_MSG; SCORE : MESSAGE: SCORE_MSG; ... end; var ALL_MESSAGES: Array of GAME_MESSAGE; Egal wie ich es drehe, irgendeine Aufgabe scheint unheimlich kompliziert und mein Programm rödelt stundenlang an einem 80 MB grossen File rum um eine Art von Message da rauszuparsen und anzuzeigen. :S Ich hoffe ihr habt eine Idee, wie ich das effizient hinbekomme. Danke schonmal im vorraus. Lenny |
Re: Daten organisieren
Kannst Du mal bitte ein bis drei Datensätze als Beispiel bringen.
Wäre für das Verständnis nicht schlecht. Sind denn alle Datensätze gleich lang? Grüße Klaus |
Re: Daten organisieren
Wie ich oben schon schrieb:
PlayerAmmo: byte, byte TextMsg : byte, Pchar Status : short PlayerH : byte Score : byte, byte, byte Zum Beispiel bei TextMsg, weisst man von vornherein nicht wie lang das ganze sein wird, da es ein Pchar beinhaltet, welches erst durch ein $00 beendet wird. Und alle Messages sind verschieden lang, wie man oben sieht.
Delphi-Quellcode:
PlayerAmmo: /in Sekunden\
/Signatur\ /Timestamp: Single\ AM1 AM2 $00 $22 $01 $55 $DC $5C $9B $41 $9C $04 $12 TextMsg: /in Sekunden\ /Signatur\ /Timestamp: Single\ ID Pchar ---------------------| $00 $22 $05 $87 $28 $DB $B8 $42 $B5 $C3 "Hey, das war lustig!" + $00 |
Re: Daten organisieren
Ich würde von Records nach Klassen umsteigen.
Hier die Basisklasse als ganz grober Entwurf:
Delphi-Quellcode:
Von dieser Basisklasse gibt es nun diverse Ableitungen:
TGameMessage=class(TPersistent)
public property Offset:integer; property Typ:Integer; property TimeStamp:TDateTime; end;
Delphi-Quellcode:
Alle Objekte werden in einer TObjectList gespeichert.
TTextMessage=class(TGameMessage)
public property Text:string; property ID:byte; end; Da Objekte im Stack ja dynamisch angelegt werden, ist damit das Problem mit den unterschiedlich langen Messages erschlagen. |
Re: Daten organisieren
Hallo,
mit dem Case geht, man muss sich nur an die korrekte Syntax halten. siehe Hilfe "Variante Teile in Record-Typen"
Delphi-Quellcode:
Ich würde aber ebenfalls Klassen benutzen,
type
TTestRec = record case MyType: Integer of 0: (i: Integer; j: Integer); 1: (b: Byte); end; eine Basisklasse mit den gemeinsamen properties und für jeden Type eine abgeleitete. Heiko |
Re: Daten organisieren
Zitat:
Dachte bisher mit Klassen organisiert man nur Funktionen zum erledigen verschiedener Aufgaben, wusste nicht, dass die auch zum "verpacken" von Daten zu gebrauchen sind. Dankeschön. (Diese Seite scheint nur so voller Informationen zu Delphi zu strotzen, ich finde bestimmt viel zu Klassen). :) |
Re: Daten organisieren
Zitat:
Du könntest z.B. folgende Methode einbauen:
Delphi-Quellcode:
Später kannst du dann die Liste deiner Objekte durchgehen, jeweils DumpData aufrufen und z.B. in ein TMemo schreiben.
TGameMessage=class(TPersistent)
public function DumpData:string; virtual; // <========== property Offset:integer; property Typ:Integer; property TimeStamp:TDateTime; end; function TGameMessage.DumpData:string; // <========== begin Result := Format('Typ=%d Offset=%x TimeStamp=%s', [Typ, Offset, DateTimeToStr(TimeStamp)]); end; Die Methode ist virtuell, damit sie von den abgeleiteten Klassen überladen werden kann:
Delphi-Quellcode:
function TTextMessage.DumpData:string;
begin result := inherited DumpData + Format(', Text=<%s>', [Text]); end; |
Re: Daten organisieren
Stimmt. Die Kombination macht Klassen unheimlich praktisch. Ich weiss auch schon ungefähr wie das ganze aussehen wird. Aber besser man plant schön alles vorher, bevor man es Mitten im entwickeln wieder bereut.
Vielen Dank shmia :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz