Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TAnsiStringList - Wie (einfach) ? (https://www.delphipraxis.net/196982-tansistringlist-wie-einfach.html)

TERWI 6. Jul 2018 10:15

AW: TAnsiStringList - Wie (einfach) ?
 
Das mit
type TAnsiStringList = Generics.Collections.TList<RawByteString> ?
hab ich immer noch nicht verstanden ...

Die Daten ziehe ich direkt aus dem Transportstrom, zerlege sie dann in (DVB-) System-, Netzwerk-, Service- und EPG(EIT)-Daten.
Hier geht es im besondern um die EIT mit jeweils (reichlich) Text zu "Events" für 'jetzt, später, demnächst' (max. 14 Tage).
Eine komplette 'Sammlung' von ca. 500 Programmen wird da schon recht umfangreich ... Wenn man vorhandenen Teletext dazu auch noch sammelt, wirds noch dicker.

Ein (Short-)Event besteht aus aus 2 Strings mit je max. 256 Zeichen 8-Bit.
Ein (Extended-)Event hate eine Item-Liste aus 2 Strings wie Short. Die Eintäge können sowohl als auch sein - ebenso kann die Liste 0 sein oder auch ellenlang. Deswegen hier (der Einfachheit halber) eine TStringList.
Dazu gibt es noch einen String aus AnsiChar, dessen Länge theoretisch nicht begrenzt ist, prinzipiell aber aus einer Anzahl x-Strings mit max. 256 Zeichen besteht.

Die 3 AnsiStrings mit der TStringList und ner Latte weiterer Daten stecken in einem Record.

Im Moment handle ich das mittels casting so:
Delphi-Quellcode:
...
  // write EE_item-List as ansistring !
  n := EVRec.EE_item.Count;
  EVfsw.Write(n, 2);                     // write count of EE_item
  for ii := 1 to EVRec.EE_item.Count do  // loop items (if any)
  begin
    sansi := ansistring(EVRec.EE_item[i-1]);
    EVfsw.Write(i, 2);                   // write number of item
    n := Length(sansi);
    EVfsw.Write(n, 2);                   // write length of EE_item
    if (n > 0) then
    EVfsw.Write(sansi[1], n);          // write EE_item
  end;
...
Und wieder zurück:
Delphi-Quellcode:
...
  // read EE_item-List as ansistring !
  inc(sizeread, EVfsr.Read(n, 2));        // read count of EE_item
  for ii := 1 to n do         // loop items (if any)
  begin
    inc(sizeread, EVfsr.Read(nn, 2));        // read number of item
    // ... check if nn = ii !
    inc(sizeread, EVfsr.Read(nn, 2));        // read length of EE_item
    SetLength(sansi, nn);
    if (nn > 0) then                         // read EE_item
    begin
      inc(sizeread, EVfsr.Read(sansi[1], nn));
      EVrec.EE_item.Add(sansi);
    end;
  end;
...
EVfsr und EVfsw sind TFileStreams.
EVRec.EE_item ist die TStringListe.

Neutral General 6. Jul 2018 10:19

AW: TAnsiStringList - Wie (einfach) ?
 
Was gibts da nicht zu verstehen?
Deklarier halt EVRec.EE_item als TList<RawByteString> (oder AnsiString?) und fertig.

TERWI 6. Jul 2018 10:32

AW: TAnsiStringList - Wie (einfach) ?
 
Wenn ich das so mache
Delphi-Quellcode:
TAnsiStringList = TList<RawByteString>;
bekomme ich diese Meldung:
Zitat:

[DCC Fehler] DVB_PSI_Data.pas(101): E2003 Undeklarierter Bezeichner: 'TList<>'

Neutral General 6. Jul 2018 10:39

AW: TAnsiStringList - Wie (einfach) ?
 
Deswegen hatte Redeemer z.B. Generics.Collections.TList<RawByteString> geschrieben was implizieren soll, dass man die Unit "Generics.Collections" einbinden muss.

mkinzler 6. Jul 2018 10:39

AW: TAnsiStringList - Wie (einfach) ?
 
Zitat:

Zitat von TERWI (Beitrag 1406679)
Wenn ich das so mache
Delphi-Quellcode:
TAnsiStringList = TList<RawByteString>;
bekomme ich diese Meldung:
Zitat:

[DCC Fehler] DVB_PSI_Data.pas(101): E2003 Undeklarierter Bezeichner: 'TList<>'

Die hohe Kunst des Copy and Paste

Delphi-Quellcode:
TAnsiStringList = Generics.Collections.TList<RawByteString>;
Es muss natürlich noch die Unit Generics.Collections eingebunden werden.

TERWI 6. Jul 2018 10:48

AW: TAnsiStringList - Wie (einfach) ?
 
Arrrrgh .... peinlich. :oops:
Abgeändert und kompiliert.
Test wird etwas länger dauern.

Redeemer 6. Jul 2018 12:01

AW: TAnsiStringList - Wie (einfach) ?
 
Zitat:

Zitat von Neutral General (Beitrag 1406678)
Was gibts da nicht zu verstehen?
Deklarier halt EVRec.EE_item als TList<RawByteString> (oder AnsiString?) und fertig.

RawByteString (eigentlich auch nur ein spezieller AnsiString) ist hier denke ich besser, da da garantiert nicht sinnlos herumkonvertiert wird.


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

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