Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Daten organisieren (https://www.delphipraxis.net/83668-daten-organisieren.html)

Lenny15 5. Jan 2007 15:53


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:
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;
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.
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

Klaus01 5. Jan 2007 15:57

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

Lenny15 5. Jan 2007 16:10

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

shmia 5. Jan 2007 16:23

Re: Daten organisieren
 
Ich würde von Records nach Klassen umsteigen.
Hier die Basisklasse als ganz grober Entwurf:
Delphi-Quellcode:
TGameMessage=class(TPersistent)
public
   property Offset:integer;
   property Typ:Integer;
   property TimeStamp:TDateTime;
end;
Von dieser Basisklasse gibt es nun diverse Ableitungen:
Delphi-Quellcode:
TTextMessage=class(TGameMessage)
public
   property Text:string;
   property ID:byte;
end;
Alle Objekte werden in einer TObjectList gespeichert.
Da Objekte im Stack ja dynamisch angelegt werden, ist damit das Problem mit den unterschiedlich langen Messages erschlagen.

hoika 5. Jan 2007 16:33

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:
type
  TTestRec = record
    case MyType: Integer of
      0:
         (i: Integer;
          j: Integer);
      1:
         (b: Byte);
  end;
Ich würde aber ebenfalls Klassen benutzen,
eine Basisklasse mit den gemeinsamen properties
und für jeden Type eine abgeleitete.


Heiko

Lenny15 5. Jan 2007 16:33

Re: Daten organisieren
 
Zitat:

Da Objekte im Stack ja dynamisch angelegt werden, ist damit das Problem mit den unterschiedlich langen Messages erschlagen.
Danke. Das mit den Klassen sieht gut aus. Ich schau mir gleich an wie das so funktioniert.
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). :)

shmia 5. Jan 2007 16:46

Re: Daten organisieren
 
Zitat:

Zitat von Lenny15
Dachte bisher mit Klassen organisiert man nur Funktionen zum erledigen verschiedener Aufgaben, wusste nicht, dass die auch zum "verpacken" von Daten zu gebrauchen sind.

Du wirst bestimmt auch noch Funktionen (=Methoden) zu diesen Klassen hinzufügen.
Du könntest z.B. folgende Methode einbauen:
Delphi-Quellcode:
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;
Später kannst du dann die Liste deiner Objekte durchgehen, jeweils DumpData aufrufen und z.B. in ein TMemo schreiben.
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;

Lenny15 5. Jan 2007 16:52

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