Auf ein Objekt in einer TList zugreifen
-
Hallo,
Wie kann ich auf Methoden des letzten, oder eines beliebigen, Objektes in einer Liste zugreifen?
Im Moment versuche ich es so (geht aber nicht
):TList *objekte = new TList(); AnsiString test = "1234"; Ansistring *test1 = &test; objekte.Add(test1); (objekte->Last()).Length();Geht sowas ähnliches? Hat jemand ne Idee?
p.s.: Das ganze findet in Borland Turbo C++ statt.
-
Hallo
Ja das "geht"
schon bei dem Add nicht. Einerseits must du auch hier den Pfeiloperator benutzen, und andereseits will TList einen void-Pointer, keinen AnsiString.
Benutze statt desen lieber die C++ Container wie std::list oder std::vector. Da du wahrfreien Zugriff auf die Elemente haben willst solltest du std::vector nehmen, Listen haben per Definition keinen wahlfreien Zugriff.#include <vector> .. std::vector<AnsiString> strings; strings.push_back("1234"); int x = strings[0].Length();Weiteres zum Umgang mit C++ Containern findest du in den entsprechenden Magazin-Artikel hier im Forum.
bis bald
akari
-
das mit dem Add hab ich inzwischen korrigiert, ist mir aufgefallen.
Ok ich werds so versuchen, vielen Dank.
-
Irgendwie funktioniert alles bis auf das:
Der Vector speichert bisher Objekte meiner Klasse, diese Klasse fasst mehrere TEdit Felder zusammen. Ich kann mittels des vectors meine Klasse und damit auch die Felder ansprechen, jedoch kann ich sie nicht löschen. Die Edit Felder sind immer noch sichtbar auch nach einem ".pop_back()", muss ich die Felder noch zusätzlich löschen? Wenn ja wie?
-
Hallo
std::vector verwaltet den Speicher seiner Elemente. In deinem Fall den deiner Klasse. Da aber deine Klasse mit sicherheit einen Pointer auf ein TEdit-Control hat wird diese Instanz hinter dem Pointer nicht automatisch gelöscht.
Theoretisch könntest du den Destruktor deiner Klasse benutzen um das Control zu löschen, aber dann bekommst du Probleme wenn die Instanzen der Klasse kopiert werden müßen (was in einem vector vorkommen kann).
Als einfachstes löscht du das Control direkt vor dem pop_back manuel.bis bald
akari
-
ja wenn ich den Destructor von den Feldern im Destructor meiner Klasse aufrufe bekomm ich nen Fehler.
Aber wie soll ich die Edit Felder löschen? Eine Methode geht genausowenig wie der Destructor oder? Die Felder sind natürlich Private da kann ich nicht direkt drauf zugreifen.
-
Hallo
Dann gib deiner Klasse eben noch eine Methode DeleteEdit(), die nicht weiter macht als das Control zu löschen. Die rufst du vor dem pop_back auf
bis bald
akari
-
ich steh etwas auf dem schlauch, was meinst du mit Control?
sorry ich glaub langsam bist du am durchdrehen.... (wegen mir mein ich ^^)
-
Hallo
Dein "Edit Feld" ist von TControl abgeleitet, deshalb hab ich es Control genannt weil das Prinzip auch für alle andern Controls gleich wäre.
class MyClass { public : void DeleteEdit(); // Methode zum Löschen private : ... TEdit* m_control; // Interner Pointer }; void MyClass::DeleteEdit() { delete m_control; } ... // Wenn Element aus vector entfernt wird erst das Edit-Control löschen objects.back().DeleteEdit(); objects.pop_back();bis bald
akari
-
Vielen Dank für die Erklärung und sorry für meine andauernde Fragerei.