AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Listen in Delphi

Ein Thema von cat · begonnen am 29. Jan 2003 · letzter Beitrag vom 30. Jan 2003
Antwort Antwort
Benutzerbild von cat
cat

Registriert seit: 29. Jan 2003
9 Beiträge
 
#1

Listen in Delphi

  Alt 29. Jan 2003, 13:59
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.




  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 29. Jan 2003, 15:43
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

if Value is TBasisKlasse then ... Ist das Objekt gültig, wird es aufgenommen, ansonsten eben nicht.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von cat
cat

Registriert seit: 29. Jan 2003
9 Beiträge
 
#3
  Alt 30. Jan 2003, 06:31
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 30. Jan 2003, 11:32
Moin Cat,

das hab' ich jetzt nicht ganz verstanden.
Könntest Du mal ein kleines Beispiel posten.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von cat
cat

Registriert seit: 29. Jan 2003
9 Beiträge
 
#5
  Alt 30. Jan 2003, 11:49
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:
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;
Ich hoffe, das war jetzt verständlicher!

mfg cat

[Edit=Christian Seehase]Delphi Tags hinzugefügt[/Edit]
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 30. Jan 2003, 12:06
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:
type
  PBasisKlasse = ^TBasisKlasse;

procedure AddElement(p_element : PBasisKlasse);
//...
Die Deklaration von TListItem würde mich allerdings mal interessieren.
Oder handelt es sich da doch um das TListItem, dass ein Item eines ListView darstellt?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von cat
cat

Registriert seit: 29. Jan 2003
9 Beiträge
 
#7
  Alt 30. Jan 2003, 12:41
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"!



Schon mal danke für deine Bemühungen!
  Mit Zitat antworten Zitat
Benutzerbild von cat
cat

Registriert seit: 29. Jan 2003
9 Beiträge
 
#8
  Alt 30. Jan 2003, 12:47
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;
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 30. Jan 2003, 13:22
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:
  1. Die Uses Anweisung im interface Abschnitt
  2. Die Uses Anweisung im implementation Abschnitt

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)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:30 Uhr.
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