![]() |
Arbeiten mit TList
Hallo,
ich möchte eine verkettete Liste von Punkttypen erstellen. Da ich nicht das Rad neu erfinden will, hab ich mit TList angeschaut und versucht , davon meine Liste abzuleiten. Ich bin mir aber nicht sicher, ob das nun von der Logik her so richtig ist. Was haltet Ihr davon:
Delphi-Quellcode:
Unit listen;
Interface Uses Classes, Typendef; Type PunktType = Record X : real; Y : real; lage : byte; End; pPunktType = ^PunktType; { TPunktTypeList class } TPunktTypeList = Class(TList) Private Protected Procedure Notify(Ptr : Pointer;Action : TListNotification); Override; Function GetPkt(inIndex : Integer) : PunktType; Procedure SetPkt(inIndex : Integer;inPkt : Punkttype); Public Constructor Create; Function Add(inPkt : Punkttype) : Integer; Function Remove(inIndex : Integer) : Integer; Property Items[inIndex : Integer] : Punkttype Read GetPkt Write SetPkt;Default; End; { TPunktTypeList class } Implementation { TPunktTypeList } Function TPunktTypeList.Add(inPkt : Punkttype) : Integer; Var p : pPunkttype; Begin New(p); Result:=Inherited Add(p); End; Constructor TPunktTypeList.Create; Begin Inherited Create; End; Function TPunktTypeList.GetPkt(inIndex : Integer) : PunktType; Begin Result:=pPunkttype(Inherited Items[inIndex])^; End; Procedure TPunktTypeList.Notify(Ptr : Pointer;Action : TListNotification); Begin If Action = lnDeleted Then Dispose(pPunkttype(Ptr)); Inherited Notify(Ptr, Action); End; Function TPunktTypeList.Remove(inIndex : Integer) : Integer; Begin Result:=Inherited Remove(Inherited Items[inIndex]); End; Procedure TPunktTypeList.SetPkt(inIndex : Integer;inPkt : Punkttype); Begin pPunkttype(Inherited Items[inIndex])^:=inPkt; End; End. |
Re: Arbeiten mit TList
Wäre es nicht einfacher, aus dem Record eine Klasse zu machen und die Liste dann von TObjectlist abzuleiten?
|
Re: Arbeiten mit TList
Das wäre mir lieber, aber der Punkttype ist der grundlegende Typ in unserem Programm. Da wird das Ersetzen eines Records durch eine Klasse doch ungemein schwierig.
|
Re: Arbeiten mit TList
Na gut, wenn es nicht anders geht. Allerdings fällt mir auf, dass die Parameter und Rückgabewerte vom Typ PunktType sind, aber eigentlich vom Typ pPunktType sein müssten.
|
Re: Arbeiten mit TList
Nö, soweit geht das schon, aber
Delphi-Quellcode:
ist nicht so gut, da dein inPkt gar nicht in die Liste aufgenommen wird, sonder ein leerer Punkt.
Function TPunktTypeList.Add(inPkt : Punkttype) : Integer;
Var p : pPunkttype; Begin New(p); Result:=Inherited Add(p); End;
Delphi-Quellcode:
Gruss
Function TPunktTypeList.Add(inPkt : Punkttype) : Integer;
Var p : pPunkttype; Begin New(p); p^ := inPkt; // <=== fehlt hier Result:=Inherited Add(p); End; [Edit:thkerkmann]Korrektur Zugweisung [/Edit] |
Re: Arbeiten mit TList
Stimmt. :wall: Ja es ist wieder Zeit sich über sich selbst aufzuregen. Danke!
|
Re: Arbeiten mit TList
du weisst aber schon, dass TList ein Array ist und keine liste ... :roll:
|
Re: Arbeiten mit TList
Ja, soweit ich weiß ist eine TList ein Array von Zeigern. Aber es bietet mir die Funktionen einer verketteten Liste und eine bessere Speicherverwaltung als ein dynamisches Array.
|
Re: Arbeiten mit TList
kommt drauf an was du machen willst, willst nur ein paar daten im speicher hin und herschieben, so ist ein array sicher recht gut. nachteilig wird das ganze, wenn du viele daten umordnen willst, bei der verketteten liste musst du nur ein paar pointer umhängen, bei einem array (z.b. tList) den ganzen speicher umschichten.
aber sonst, ist natürlich die TList bequemer ... :-) , ist aber natürlich keine (verkettete) liste ... Zitat:
|
Re: Arbeiten mit TList
Zitat:
Gerd |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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 by Thomas Breitkreuz