![]() |
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:
Ich erzeuge mit New() die Datensätze (Records) füge sie der TList mit Add() hinzu.
type
TDataType = (dtFile, dtDirectory); type PFileEntry = ^TFileEntry; TFileEntry = packed record sFileName: String; aDataType: TDataType; end; var aProcessFileEntry: PFileEntry; aProcessFileList_Record: TList; // Holder 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:
Mein Problem ist jetzt, dass irgendetwas nicht funktioniert und ich schätze mal es liegt an dieser zweiten Liste.
for j := 0 to iCnt - 1 do
aTmpFileList_Record.Add(aProcessFileList_Record.Items[j]); 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 ? |
AW: TList mit Record füllen und an weitere TList übergeben
Zitat:
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 |
AW: TList mit Record füllen und an weitere TList übergeben
:o
Kannst du mir weiteres dazu erklären? Das kenne ich noch nicht. |
AW: TList mit Record füllen und an weitere TList übergeben
Delphi-Quellcode:
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.
type
TFileEntry = class private FFileName: String; FDataType: TDataType; public property FileName: string read FFileName write FFileName; property DataType: TDataType read FDataType write FDataType; end; |
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; |
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; |
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.
|
AW: TList mit Record füllen und an weitere TList übergeben
Zitat:
So hat man das früher eben gemacht... BTW - Schneller ist es sowieso!! Mavarik |
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?
|
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:
direkt auc Free igendwo aufruft? Denn nachdem ich
MeineObjectList.Clear;
Delphi-Quellcode:
aufgerufen habe, flattert mit eine AV ins Haus wenn ich auf die ObjectList zugreifen möchte.
.Clear;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:13 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