Entwickler-Ecke
Sonstiges (Delphi) - Listbox, eingetragene Objekte unterschieden aber wie..
Delphi_Neuling - So 03.10.04 16:33
Titel: Listbox, eingetragene Objekte unterschieden aber wie..
Hi,
ich habe eine Listbox in die ich mit
Delphi-Quelltext
1:
| ListBox1.AddItem('Knoten'+inttostr(itemcount),TKnoten.create(StrToInt(edit4.Text),strtoint(edit5.Text))); |
oder
Delphi-Quelltext
1:
| Listbox1.AddItem('Kante'+inttostr(itemcount),TKante.create(strtoint(edit4.Text),strtoint(edit5.Text),strtoint(edit6.Text),strtoint(edit7.Text))); |
Einträge hinzufüge.
Nun möchte ich ja auch an die von mir erzeugten Objekte auch mal wieder ran. Nur wie unterscheide ich nachher
ob: listbox1.items.objects[i] ein Knoten oder eine Kante ist, damit ich mit den Objekten weiterarbeiten kann.
Gruß der Delphi_Neuling
matze - So 03.10.04 16:56
speicher doch in den objekten selber was sie sind. ansonsten schau halt ob in dem markierten eintrage das wort kante oder knoten vorkommt (das ist die unelegante methode)
Lossy eX - So 03.10.04 19:44
Da beides Klassen sind kannst du das sehr sehr einfach und elegant unterscheiden.
listbox1.items.objects[i] leifert dir ein TObject. Und auf allen Objecten sind die Operatoren
is und
as erlaubt.
Mit
is kannst du eine unterstützte Klasse abfragen. Es werden dabei
alle Kindklassen berücksicht. Bei einem TButton also auch das TWinControl.
Delphi-Quelltext
1:
| if listbox1.items.objects[i] is TObject then |
Sollte also immer True zurückliefern, da jede Klasse von TObject abgelitten ist. Macht also auch nicht unbedingt sind. ;-)
Du bräuchtest für dich entweder.
Delphi-Quelltext
1: 2:
| if listbox1.items.objects[i] is TKante then |
oder
Delphi-Quelltext
1: 2:
| if listbox1.items.objects[i] is TKnoten then |
Mit
as kannst du eine Klasse casten. Allerdings wird vorher noch einmal überprüft ob es überhaupt möglich ist. Wenn nicht gibt es eine Exception.
Delphi-Quelltext
1: 2:
| with listbox1.items.objects[i] as TKnoten do |
As solltest du nur machen, wenn du vorher mit is die Klasse abgefragt hast. Wegen der Exception die auftritt, wenn die Klasse nicht unterstützt wird.
Wenn du bewusst eine Klasse als etwas anderes casten möchtest macht du TKnoten(Variablle). Wenn die Klasse nicht unterstützt wird, bekommst du wahrscheinlich eine Access Violation aber keine Exception.
BenBE - So 03.10.04 20:38
Lossy eX hat folgendes geschrieben: |
Wenn du bewusst eine Klasse als etwas anderes casten möchtest macht du TKnoten(Variablle). Wenn die Klasse nicht unterstützt wird, bekommst du wahrscheinlich eine Access Violation aber keine Exception. |
Seit wann ist eine AV KEINE Exception???
Wenn ich mich richtig erinnere steht in den System Utilities (SysUtils) :D sowas von EAccessViolation = class(EExternal) (Zeile 279 für die, die's interessiert), die ihrerseits mit EExternal = class(Exception) deklariert werden (Zeile 255 für die, die auch dies interessiert).
Lossy eX - So 03.10.04 22:17
Okay. Hast ja recht. Ist ja auch ne Exception. War ein bissel falsch formuliert. Ich meinte eine AV ist keine "kontrollierte" Exception. So etwas wie Listindex out of bounds. AV's werden ja nicht mit Absicht ausgelöst. Die tretten ungewollt auf.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!