Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Arbeiten mit TList (https://www.delphipraxis.net/121223-arbeiten-mit-tlist.html)

Bomberbb 24. Sep 2008 07:34


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.

DeddyH 24. Sep 2008 07:47

Re: Arbeiten mit TList
 
Wäre es nicht einfacher, aus dem Record eine Klasse zu machen und die Liste dann von TObjectlist abzuleiten?

Bomberbb 24. Sep 2008 07:55

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.

DeddyH 24. Sep 2008 08:05

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.

thkerkmann 24. Sep 2008 08:17

Re: Arbeiten mit TList
 
Nö, soweit geht das schon, aber

Delphi-Quellcode:
Function TPunktTypeList.Add(inPkt : Punkttype) : Integer;
Var
  p                                    : pPunkttype;
Begin
  New(p);
  Result:=Inherited Add(p);
End;
ist nicht so gut, da dein inPkt gar nicht in die Liste aufgenommen wird, sonder ein leerer Punkt.

Delphi-Quellcode:
Function TPunktTypeList.Add(inPkt : Punkttype) : Integer;
Var
  p                                    : pPunkttype;
Begin
  New(p);
  p^ := inPkt; // <=== fehlt hier
  Result:=Inherited Add(p);
End;
Gruss

[Edit:thkerkmann]Korrektur Zugweisung [/Edit]

Bomberbb 24. Sep 2008 08:28

Re: Arbeiten mit TList
 
Stimmt. :wall: Ja es ist wieder Zeit sich über sich selbst aufzuregen. Danke!

grenzgaenger 24. Sep 2008 10:24

Re: Arbeiten mit TList
 
du weisst aber schon, dass TList ein Array ist und keine liste ... :roll:

Bomberbb 24. Sep 2008 10:36

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.

grenzgaenger 24. Sep 2008 12:14

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:

Zitat von Bomberbb
eine bessere Speicherverwaltung als ein dynamisches Array.

tut mir leid dich enttäuschen zu müssen, TList ist ein dynamisches Array ... :angel2:

bernau 24. Sep 2008 12:20

Re: Arbeiten mit TList
 
Zitat:

Zitat von grenzgaenger
tut mir leid dich enttäuschen zu müssen, TList ist ein dynamisches Array ... :angel2:

Was wäre denn performanter als eine TList?



Gerd


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:37 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