Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TList mit Record füllen und an weitere TList übergeben (https://www.delphipraxis.net/190069-tlist-mit-record-fuellen-und-weitere-tlist-uebergeben.html)

dGeek 26. Aug 2016 08:49

TList mit Record füllen und an weitere TList übergeben
 
Entweder war ich gestern Abend zu müde oder das was ich vorhabe funktioniert nicht.

Ich habe folgenden Record:
Delphi-Quellcode:
type
 TDataType = (dtFile, dtDirectory);

type
 PFileEntry = ^TFileEntry;

 TFileEntry = packed record
  sFileName: String;
  aDataType: TDataType;
 end;

var
 aProcessFileEntry: PFileEntry;
 aProcessFileList_Record: TList; // Holder
Ich erzeuge mit New() die Datensätze (Records) füge sie der TList mit Add() hinzu.

An einer späteren Stelle muss ich die Liste aussortieren.
Ich erzeuge also eine neue TList und füge gewisse Teile der originalen Liste hinzu:

Delphi-Quellcode:
for j := 0 to iCnt - 1 do
 aTmpFileList_Record.Add(aProcessFileList_Record.Items[j]);
Mein Problem ist jetzt, dass irgendetwas nicht funktioniert und ich schätze mal es liegt an dieser zweiten Liste.
Die zweite Liste hat die korrekte Länge (Count) an Datensätzen aber beim eigentlichen Prozess, wo die Liste benötigt wird, gehts nicht weiter (keine AV, nichts).

Mache ich etwas falsch beim hinzufügen in die aTmpFileList ?

Mavarik 26. Aug 2016 09:32

AW: TList mit Record füllen und an weitere TList übergeben
 
Zitat:

Zitat von dGeek (Beitrag 1345789)
Ich erzeuge mit New() die Datensätze (Records) füge sie der TList mit Add() hinzu.

Den Record oder den Pointer? Ich hoffe mal den Pointer... :stupid:

Klar kann man noch mit New & Dispose arbeiten.. Aber warum nimmst Du keine Klasse und eine ObjectList mit OwnsValue und schon brauchst Du Dich um nix mehr kümmern...

Mavarik

dGeek 26. Aug 2016 09:37

AW: TList mit Record füllen und an weitere TList übergeben
 
:o

Kannst du mir weiteres dazu erklären?
Das kenne ich noch nicht.

DeddyH 26. Aug 2016 09:43

AW: TList mit Record füllen und an weitere TList übergeben
 
Delphi-Quellcode:
type
  TFileEntry = class
  private
    FFileName: String;
    FDataType: TDataType;
  public
    property FileName: string read FFileName write FFileName;
    property DataType: TDataType read FDataType write FDataType;
  end;
Jetzt kannst Du beliebig viele Instanzen dieser Klasse erzeugen und einer TObjectList hinzufügen. Wenn deren Eigenschaft OwnsObjects true ist (Standard), musst Du die Objekte nicht einmal mehr selbst freigeben, dann kümmert sich die TObjectList selbst darum.

dGeek 26. Aug 2016 09:47

AW: TList mit Record füllen und an weitere TList übergeben
 
Wie erzeuge ich denn Instanzen einer Klasse? Dumme Frage :shock:

Bin jetzt so weit:

Delphi-Quellcode:
type
 TDataType = (dtFile, dtDirectory);

type
 PFileEntry = ^TFileEntry;

 TFileEntry = class(TObject) // <= Object
  sFileName: String;
  aDataType: TDataType;
 end;

type
 TMyClass = class(TComponent)
 public
  FFileEntry: TObjectList;
  constructor Create; overload;
 end;

var
 aProcessFileList_ObjectList: TFileEntry;

implementation

procedure TMyClass.Create; // hier geht es nicht weiter
begin
 FFileEntry := TObjectList.Create;
 FFileEntry.OwnsObjects := true;
end;

DeddyH 26. Aug 2016 10:07

AW: TList mit Record füllen und an weitere TList übergeben
 
Mal ein Beispiel im Editor heruntergetippt:
Delphi-Quellcode:
type
  TFileEntry = class
  private
    FFileName: String;
    FDataType: TDataType;
  public
    property FileName: string read FFileName write FFileName;
    property DataType: TDataType read FDataType write FDataType;
  end;
 
...

procedure TDeinForm.ButtonTestClick(Sender: TObject);
var
  Objects: TObjectList;
  FileEntry: TFileEntry;
  i: integer;
begin
  Objects := TObjectList.Create;
  try
    FileEntry := TFileEntry.Create;
    FileEntry.Filename := 'C:\Dings\Bums\Trallalla.txt';
    FileEntry.DataType := dtFile;
    Objects.Add(FileEntry);
    FileEntry := TFileEntry.Create;
    FileEntry.Filename := 'C:\Dings\Bums';
    FileEntry.DataType := dtDirectory;
    Objects.Add(FileEntry);
    for i := 0 to Objects.Count - 1 do
      ShowMessage((Objects[i] as TFileEntry).Filename);
  finally
    Objects.Free;
  end;
end;

bra 26. Aug 2016 10:31

AW: TList mit Record füllen und an weitere TList übergeben
 
Wozu brauchst du unbedingt den Pointer? Man kann auch den Record einfach so in die Liste reinschmeißen (oder alternativ die Klasse wie von DeddyH beschrieben). Das ganze Pointer-Gedöns würde ich weglassen, wenn es nicht auf triftigen Gründen wirklich notwendig sein sollte.

Mavarik 26. Aug 2016 10:35

AW: TList mit Record füllen und an weitere TList übergeben
 
Zitat:

Zitat von bra (Beitrag 1345809)
Wozu brauchst du unbedingt den Pointer? Man kann auch den Record einfach so in die Liste reinschmeißen (oder alternativ die Klasse wie von DeddyH beschrieben). Das ganze Pointer-Gedöns würde ich weglassen, wenn es nicht auf triftigen Gründen wirklich notwendig sein sollte.

Das ist hat alte Schule! :thumb:

So hat man das früher eben gemacht...

BTW - Schneller ist es sowieso!!

Mavarik

DeddyH 26. Aug 2016 10:40

AW: TList mit Record füllen und an weitere TList übergeben
 
Die nicht-generische TList enthält aber nun einmal Pointer. Wie willst Du da direkt einen Record reinschreiben?

dGeek 26. Aug 2016 10:41

AW: TList mit Record füllen und an weitere TList übergeben
 
Ich bin zwar ein totaler Nichtskönner was Delphi angeht, mit dem Pointer ist aber leider Angewohnheit.

Danke für eure Hilfe! Eine letzte Frage habe ich aber noch.

Kann es sein, dass
Delphi-Quellcode:
MeineObjectList.Clear;
direkt auc Free igendwo aufruft? Denn nachdem ich
Delphi-Quellcode:
.Clear;
aufgerufen habe, flattert mit eine AV ins Haus wenn ich auf die ObjectList zugreifen möchte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:51 Uhr.
Seite 1 von 4  1 23     Letzte »    

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