Entwickler-Ecke

Sonstiges (Delphi) - Listen in Delphi


cat - Do 30.01.03 11:06
Titel: Listen in Delphi
Ich habe ein Problem, und zwar habe ich vor längerer Zeit schon einmal eine allgemeine Liste geschrieben, die ich wieder verwenden kann. Dieses habe ich auch nun getan. Jedoch sollen die Pointer der Liste nun nicht mehr neutral sein, sondern auf eine Basisklasse, die in einer anderen Unit stehen zeigen. Hat jemand eine Idee für mich??

:roll: mfg Katja :roll:


Udontknow - Do 30.01.03 12:20

Hi!

Wie wäre es hiermit? Diese Klasse benutze ich für meine Listen. Du musst nur TMyClass durch die von dir benötigte Klasse ersetzen (und natürlich die Unit in der uses-Klausel erwähnen).


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
type TMyList=class(TObject)
private
  FItems:TList;
  function GetCount: Integer;
  function GetItems(Index: Integer): TMyClass;
  procedure SetItems(Index: Integer; const Value: TMyClass);
public
  constructor Create; virtual;
  destructor Destroy; override;
  procedure Add;
  procedure Delete(Index:Integer);
  procedure Clear;
  property Items[Index:Integer]:TMyClass read GetItems write SetItems; default;
  property Count:Integer read GetCount;
end;

constructor TMyList.Create;
begin
  //interne Liste erstellen
  FItems:=TList.Create;
end;

destructor TMyList.Destroy;
begin
  //Liste leeren & freigeben
  FItems.Clear;
  FItems.Free;
  inherited;
end;


procedure TMyList.Add;
begin
  //Neues Objekt erzeugen
  Result:=TMyClass.Create;
  //Objekt in Liste eintragen
end;

procedure TMyList.Clear;
var i:integer;
begin
  //Sämtliche Objekte freigeben und aus Liste löschen
  for i:=Count-1 downto 0 do
    Delete(i);
end;

procedure TMyList.Delete(Index: Integer);
begin
  //Objekt freigeben
  Items[Index].Free; 
  //Objekt aus Liste entfernen
  FItems.Delete(Index);
end;

function TMyList.GetCount: Integer;
begin
  Result:=FItems.Count;
end;

function TMyList.GetItems(Index: Integer): TMyClass;
begin
  Result:=TMyClass(FItems[Index]);
end;

procedure TMyList.SetItems(Index: Integer; const Value: TMyClass);
begin
  FItems[Index]:=Value;
end;


Cu, :)
Udontknow


cat - Do 30.01.03 12:34

:)
Danke schön. Ich werde das mal ausprobieren und vielleicht klappts ja. Obwohl das denke ich, nicht der richtige Weg ist. Da ich ja in der Liste Instanzen von Klassen aufnehmen soll. Das ist auch nicht das Problem, die darin aufzunehmen. Das Problem ist, daß ich die Liste so verändern soll, daß sie nur noch Objekte aus der Basisklasse bzw. aus den vererbten Klassen aufnimmt. Und ich denke, daß geht über den Weg, den du mir gesagt hast nicht, oder??

mfg Cat :roll:


Udontknow - Do 30.01.03 13:03

Doch, doch, dieses Listenobjekt speichert andere Objekte, also Instanzen.
Wenn du aber nun verschiedene Nachfahren einer Basisklasse aufnehmen willst, musst du natürlich noch die Routine Add anpassen (übersteuern), im Moment erzeugt sie sofort eine Instanz von TMyClass.