Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Multidimensionales Array oder Packed Record ? (https://www.delphipraxis.net/79317-multidimensionales-array-oder-packed-record.html)

Bernd Nowak 20. Okt 2006 09:28


Multidimensionales Array oder Packed Record ?
 
Hallo an alle,
habe mich jetzt schon durch einige Hilfen gekämpft aber wie würdet ihr folgendes in Delphi lösen:

PHP Code:
Code:
$setuparray = array(
   "1967" => array (
      "F1" => array (
      "Cooper 67 F1" => ".co1",
      "Ferrari 67 F1" => ".fe1"
      ),
      "F2" => array (
      "Cooper 67 F2" => ".co2",
      "Ferrari 67 F2" => ".fe2"
      ),
      "F3" => array (
      "Cooper 67 F3" => ".co3",
      "Ferrari 67 F3" => ".fe3"
      )
   ),
   "1965" => array (
      "F1" => array (
      "Cooper 65 F1" => ".co1",
      "Ferrari 65 F1" => ".fe1"
      ),
      "F2" => array (
      "Cooper 65 F2" => ".co2",
      "Ferrari 65 F2" => ".fe2"
      )
   )   
)
Diese Multidimensionale Array kann man dann in PHP schön abarbeiten. Das dient mehr der Struktur da die Daten in verschiedenen Tabellen liegen.
Aber ich wäre froh wenn ich so etwas in statisch und natürlich in dynamisch hinbekäme :roll:

Bernd Nowak 23. Okt 2006 10:10

Re: Multidimensionales Array oder Packed Record ?
 
Also erstens sorry für das Posting im falschen Bereich :pale: , müsste bestimmt in den Bereich
Object-Pascal / Delphi-Language verschoben werden.

Ansonsten kann ich erahnen das ich einen Record erstellen muss und diesen in einem Array benutzten sollte. Entweder hat das Array dann eine feste Grenze (Anzahl der Sätze wenn ich sie denn ermitteln kann) oder geht es das ich die Array Grenze pro Datensatz um eins erweitere ?

Wie kann ich dann das ganze abarbeiten ?
Sorry für diese Anfänger Fragen ....

mschaefer 23. Okt 2006 11:48

Re: Multidimensionales Array oder Packed Record ?
 
Moin moin,


Allgemein kann man natürlich mit ArrayLists arbeiten
Tutorial ArrayList (DSDT)

da in PHP Records oft in einem String mit Treenzeichen '|' gehalten werden, bietet sich in Delphi TStringListe ´n als Datenspeicher an.Listen in Delphi (DSDT)


Man kann natürlich bei großen Datenmengen auch mit HashListen arbeiten, braucht aber mehr Einarbeitungszeit.
Tutorial HashTables (DSDT)



Fazit: Bei sehr großen Datenmengen >10.000 Records am ehesten HashListen. Bis zu 10.000 Einträgen ist auch die TStringList noch recht flott. Am einfachsten zu Verstehen ist wahrscheinlich die ArrayList, die ich ähnlich der TStringList von der Geschwindigkeit einschätzen würde. Da Du mit Arrays offensichtlich Erfahrung hast, wirf da zunächst mal einen Blick drauf.

Grüße // Martin

Bernd Nowak 23. Okt 2006 12:24

Re: Multidimensionales Array oder Packed Record ?
 
Danke schonmal. Werde ich mir heute abend genauer ansehen.
Nur eine kurze Frage, sind das .net Befehle (außer TStringList) und braucht ein Client dann .net Bibliotheken ?

r2c2 23. Okt 2006 12:31

Re: Multidimensionales Array oder Packed Record ?
 
Zitat:

Zitat von Bernd Nowak
Danke schonmal. Werde ich mir heute abend genauer ansehen.
Nur eine kurze Frage, sind das .net Befehle (außer TStringList) und braucht ein Client dann .net Bibliotheken ?

Wenn du in .NET arbeitest, ja. Wenn du aber Delphi für Win32 verwendest, kannst du diese Klassen nicht nutzen(jaja, ich weiß über COM geht das, aber das is wenigstens in dem Fall ne Von-hinten-durch-die-Brust-ins-Auge-Lösung...).

Wie kann man das nun in Win32 machen?

Da gibts mehrere Möglichkeiten:
- anders strukturieren(record, oder besser Klasse)
- mit string-indizierten Array-Properties arbeiten
- selber basteln
- in der Code-Library nach Hash-Tables gucken
- ...

mfg

Christian

Der_Unwissende 23. Okt 2006 12:44

Re: Multidimensionales Array oder Packed Record ?
 
Hi,
die DSDT Links beinhalten wohl ein paar .net Sachen. Die kannst du nur verwenden, wenn du selbst mit Delphi.Net arbeitest (nach deiner Signatur nicht der Fall). Aber auch in Delphi (Win32) hast du alles was du brauchst.
An sich bieten sich für unbekannte Längen immer Listen (und alle Abkömmlinge) an. Du kannst leicht dyn. Arrays erstellen und die auch immer um ein Element vergrößern, dass ist aber ein gaaanz schlechter Weg! Ein Array wird vom Speichermanager immer als ein ausreichend großes Stück Speicher angelegt, dass einfach die Länge des Arrays * sizeOf(Elemente) als Größe reserviert (plus 4 Byte für die gespeicherte Länge). Vergrößerst du nun dein Array um ein Element, so wird an einer anderen Stelle Speicher reserviert, der ein Element mehr aufnehmen kann, das alte Array dort rein kopiert und das alte Array gelöscht. Das bedeutet jede Menge Overhead.
Listen verwenden intern (i.d.R.) auch einfach Arrays, der Zugriff ist dabei aber gekapselt. An sich reserviert die Liste immer gleich viel mehr Speicher auf einmal. Die Liste merkt sich dabei die Länge des im Moment verwendeten Arrays und den Füllstand. Ist überschreitet letzterer einen gewissen Wert, so wird hier wieder eine ganze Menge Speicher reserviert. Der Overhead ist dabei ähnlich groß, wie der beim Erweitern um nur ein Element, kann aber auf den kompletten, neu reservierten Speicher (also gleich mehrere Elemente) umgelegt werden und ist dann pro Element eher gering. Vorallem hast du aber auch den Vorteil, dass sich die Liste darum kümmert. Dir kann die Arbeitsweise völlig egal sein. Da intern Arrays verwendet werden, kannst du zudem auch nahezu wahlfrei auf einzelne Elemente per Index zugreifen.

Hashlisten kennt Delphi.Win32 auch, allerdings in einer etwas weniger mächtigen Version. Es bietet sich hier die THashedStringList an. Hierbei handelt es sich (wie der Name unspektakulär verrät) um eine StringList, die die Schlüssel (Strings) anhand eines Hashes in ein Array einsortiert. Mittels der Eigenschaft Objects (oder z.B. durch die Methode addObject) kann einem String ein Referenz auf ein Objekt übergeben werden, welches sich dann sehr flink anhand des Strings finden lässt.

Dabei ist diese HashListe wohl nicht all zu optimal, jmd (weiß leider nicht mehr wer genau) hat mal ein paar Tests was die Perfomance angeht gemacht, ich glaube mich zu erinnern, dass die THashedStringList nur bis zu einer gewissen Anzahl von Elementen < 1 mio. an ihre Grenzen stößt und danach kaum schneller als eine normale TStringList arbeitet.
Besser ist es deswegen eher eine Alternative Lösung zu verwenden. Hier hatte (auch nur wenn ich mich richtig erinner) alzaimar mal eine HashList gepostet, die dann wohl etwas besser sein dürfte.

Gruß Der Unwissende

Bernd Nowak 23. Okt 2006 12:47

Re: Multidimensionales Array oder Packed Record ?
 
Vielen, vielen Dank !

Also mit .net keine chance da ich mit Delphi Win32 programmiere und das ganze ohne besondere Installationen auch auf älteren Windows Versionen laufen soll.

Also habe ich das Grundlegende Problem im Augenblick wie ich diese Daten in Delphi verwalten würde.
Wenn irgendjemand mir hier einfach mal an hand der obigen Daten (ein Record) einen kurzen Ansatz gibt wäre ich dankbar dafür da ich demnächst mit einem etwas größerem Wust von Daten zu tun bekomme. In PHP einfach SQL Abfrage und Daten in ein Array.
Mit Delphi finde ich den Einstieg nicht richtig :gruebel:

r2c2 23. Okt 2006 17:15

Re: Multidimensionales Array oder Packed Record ?
 
So z.B.:

Delphi-Quellcode:
// Pseudocode einer von vielen Möglichkeiten:

  TYear = class(TObject) // je nachdem auch TPersistent z.B.
  private
    FSonstwas: TSonstwasList; // typisierte TObjectList (ggf. per Template)
  public
    // entsprechende properties
  end;

  TSonstwas = class(TObject) // je nachdem auch TPersistent z.B.
  private
    FCars: TCarList; // typisierte TObjectList (ggf. per Template)
  public
    // properties
  end;

  TCar = class(TObject) // je nachdem auch TPersistent z.B.
  private
    //fields
  public
    //properties
  end;
Ich weiß nicht genau, was du vor hast, aber das is eine Möglichkeit. Je nachdem, was du mit deinen Daten anstellen willst, können andere Möglichkeiten einfacher/besser/schneller/übersichtlicher/sonstwas sein...

mfg

Christian

Bernd Nowak 23. Okt 2006 19:28

Re: Multidimensionales Array oder Packed Record ?
 
Nicht schlecht (sagt ein schlechter Programmierer :D ) :thumb:

Also was habe ich vor:

Für eine Simulation (GrandPrix Legends) ein Tool schreiben, das durch alle gespeicherten replays geht, den Header ausliest indem die Zeiten gespeichert sind und diese in einem Objekt/Liste speichern.

Die Daten liegen ungefähr in dieser Form vor:

Datum
Fahrername
Saison (65/67/69/TC)
Kurs
Liste von Rundenzeiten

Nun muss die beste Zeit gefunden werden und diese nach folgendem sortiert werden:
Fahrer Name => Saison => Kurs => beste Zeit (kleinster Wert da in 1/1000 Sekunden gespeichert).

Habe jetzt auch schon mit Tlist überprüft und denke das ich den ersten Wert speichere und den nächsten Zeitwert vergleiche. Ist er besser ersten Wert löschen und mit neuem besserem Ersetzen.

Habe jetzt mal einfach mit TList probiert stecke jetzt aber mit TList.Sort fest :(

Delphi-Quellcode:
type
  PMyList = ^RLaps;
  RLaps = record
    Track: String;
    Name: String;
    Time: Currency;
    end;
var

  MyList: TList;
  ARecord: PMyList;
  B: Integer;

begin
  MyList := Tlist.create;
  try
    New (ARecord);
    ARecord^.Track :='Silverstone';
    ARecord^.Name := 'Nowak';
    ARecord^.Time := 86.12;
    MyList.Add(ARecord);
    New (ARecord);
    ARecord^.Track :='Silverstone';
    ARecord^.Name := 'Nowak';
    ARecord^.Time := 86.01;
    MyList.Add(ARecord);
    New (ARecord);
    ARecord^.Track :='Silverstone';
    ARecord^.Name := 'Nowak';
    ARecord^.Time := 86.12;
    MyList.Add(ARecord);
    for B := 0 to (MyList.Count - 1) do
    begin
      ARecord := MyList.Items[B];
      showmessage('Track: '+ARecord^.Track + 'Time: ' +CurrToStr(ARecord^.Time));
    end;
  Finally
    MyList.Free
  end;
end;
Aber bin offen für alle Ideen da ich bisher noch nicht groß mit Listen in Delphi gearbeitet habe.

Bernd Nowak 24. Okt 2006 18:59

Re: Multidimensionales Array oder Packed Record ?
 
Irgednwelche ideen zu tlist.sort ?
Die wenigen Beispiele sind meiner Meinung nach nicht sehr aufschlussreich wobei ich sagen muss das die Delphi 7 Hilfe sogar noch besser ist als die in TP2006.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz