![]() |
Listen in Delphi
Ich habe eine Frage. Und zwar habe ich schon einmal eine Liste erstellt, in der ich verschiedene Listelemente speichern kann. Diese soll jetzt aber so spezialisiert werden, daß sie nur Objekte von bestimmten Klassen aufnimmt, die von einer Basisklasse vererbt wurden. Hat einer einen Tip, wie man das umsetzten muss.
:wiejetzt: |
Moin cat,
erst einmal herzlich willkommen in der Delphi-Praxis. Also als spontane Idee hätte ich folgendes anzubieten: Deine List wird ja über eine Methode verfügen, die die Elemente hinzufügt (Add oder ähnlich). Hier kannst Du ja nun überprüfen, ob das übergebene Objekt von Typ der Basisklasse ist
Delphi-Quellcode:
Ist das Objekt gültig, wird es aufgenommen, ansonsten eben nicht.
if Value is TBasisKlasse then ...
|
Hey!
Das hört sich schon mal gar nicht schlecht an, aber das Problem ist ausserdem noch, daß ich in der Liste keine neutralen Pointer verwenden darf, sondern ich soll Pointer nehmen, die auf die Basisklasse gerichtet sind. Dieses habe ich schon ausprobiert, aber dann kommt der Fehler "Inkompatible Typen". Vielleicht haben ich das auch falsch gemacht. Ich habe die neutralen Pointer durch einen auf die Basisklasse gerichteten ersetzt. mfg Cat :cat: |
Moin Cat,
das hab' ich jetzt nicht ganz verstanden. Könntest Du mal ein kleines Beispiel posten. |
OK, ich versuche es einmal zu erklären:
Ich habe zwei units. In der einen Unit ist eine Basisklasse und drei erbende Klassen von der Basisklasse. Ausserdem ist hier ein Hauptmenü, in dem man entscheiden kann, welche Instanz von einer Klasse man in die Liste aufnehmen will. In der anderen Unit habe ich die Liste, die Einträge hinzufügen, löschen usw. kann. Es zeigt ein neutraler Pointer auf die Klassenobjekte. Nun soll es aber so sein, daß es keinen neutralen Pointer mehr in der Liste gibt, sondern die Pointer sollen auf die Basisklasse zeigen, damit man nur Objekte der Basisklasse bzw der vererbten Klassen aufnehmen kann. Hier ein kleiner Ausschnitt aus meiner Liste: (p_element ist hier ein neutraler Pointer. Und dieser soll verändert werden, so daß er auf die Basisklasse zeigt, die in einer anderen Unit steht.)
Delphi-Quellcode:
:roll: Ich hoffe, das war jetzt verständlicher!
procedure Addelement (p_element : Pointer); // the pointer of the main unit is allocated the parameter of the newX
//allocate a new element on the last position var p_help : PtListItem; p_helpprev: PtListItem; p_help2 : PtListItem; NewX : PtListItem; i_counter : Integer; i_count : Integer; begin NewX := alloc; //allocate memory for NewX i_counter := NumberOfEntries; p_help := p_start; if p_help <> nil then //searching for the last element begin while p_help.next <> nil do p_help := p_help.next; //going to the next element until p_help.next = nil p_help.next := NewX; p_help2 := p_start; For i_count:=1 to (i_counter - 1) do p_help2 := p_help2.next; p_helpprev := p_help2; p_help2 := p_help2^.next; p_help2^.prev:= P_helpprev; end else p_start:= NewX; NewX^.data := p_element; //If there is only one element, the newX is added at the beginning of the list end; mfg cat :cat: [Edit=Christian Seehase]Delphi Tags hinzugefügt[/Edit] |
Moin Cat,
auch wenn's für mich im Moment so aussieht, als würde es sich hier um Records, und nicht um Klassen handeln: Beispiel:
Delphi-Quellcode:
Die Deklaration von TListItem würde mich allerdings mal interessieren.
type
PBasisKlasse = ^TBasisKlasse; procedure AddElement(p_element : PBasisKlasse); //... Oder handelt es sich da doch um das TListItem, dass ein Item eines ListView darstellt? |
Das ist richtig. In meiner Unit, in der die Liste steht, handelt es sich um ein record.
Und in der anderen Unit stehen meine Klassen. Das Problem ist: wie mach ich der Liste klar, daß sie einen Pointer auf eine Klasse richten soll, die in einer anderen Unit steht. Da kommt dann immer "undefinierter Bezeichner"! :cat: Schon mal danke für deine Bemühungen! |
Achso hier noch einemal die Deklaration zu meinem PtLisiItem:
Code:
type // new Datatype
PtListItem = ^ListItem; // Pointer to datatype ListItem = Record data : p_TTier; next : Ptlistitem; prev : PtListItem; end; |
Moin Cat,
um auf Daten aus einer anderen Unit zugreifen zu können (welche Daten das auch immer sein mögen), muss in der Uses Anweisung der Unit aus der zugegriffen werden soll die Unit eingetragen werden auf die zugegriffen werden soll. Dafür kommen zwei Stellen in Betracht:
Wenn möglich sollte man die zweite Variante wählen (wenn im Interface Abschnitt kein Zugriff auf die Unit notwendig ist), um eventuelle Zirkelbezüge zu vermeiden (wenn die Units gegenseitig aufeinander zugreifen müssen) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:05 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