Entwickler-Ecke
Sonstiges (Delphi) - TObject zu String?
Matclou - Fr 25.02.11 19:11
Titel: TObject zu String?
Hallo,
ich habe mal wieder ein kleines Problem, und hoffe und denke, dass ihr mir sicher schnell helfen könnt - wofür ich euch schon jetzt einmal herzlich danke :)
Also, es geht um folgendes: Es wird die Klasse "TQueue" erstellt, die, wie der Name schon sagt, eine Schlangenliste darstellen soll, in der oben neue Elemente reinkommen und unten rausgenommen werden, mal plastisch ausgedrückt ;)
Die Klasse TQueue erbebt Methoden und Eigenschaften von der Klasse "TListe", die mit verschiedenen Zusatzinformationen ausgestattet wurde und sich von der Delphi-Klasse TList ableitet.
Nun folgendes: Unter anderem gibt es eine Funktion, die ein bestimmtes Objekt in der Queue ermitteln soll, und den Namen dieses Objekts quasi nach außen weitergeben soll...
Gemacht wird das mittels eines Zugriffs auf TListe, deren Methoden ja mitbenutzt werden: "result:=fliste.getobject;"
Nur leider wird ja dabei ein Objekt gewonnen... Ich brauche aber irgendwie einen String, damit das dann nachher auch ausgegeben kann... Wie ist das möglich?
GetObject stammt wie gesagt von TListe, und damit wird das Objekt, an dem der "Zeiger" steht ausgegeben...
Im Prinzip muss ich also ein Objekt in einen Datentyp umwandeln... Geht das irgendwie und wenn ja, wie?
Bergmann89 - Fr 25.02.11 19:51
Hey,
TList arbeitet nicht mit TObject, sondern mit Pointer. Sicher das du nicht TObjectList meinst? Wie sieht denn deine Methode zum einlagern von Strings aus? Normalerweiße musst du das ja bloß rückwärts machen. Eine Methode TList.GetObject ist mir unbekannt. Der zugriff auf die Elemente der Liste erfolgt normalerweiße über TList.Items[Index: Integer], TList.First oder TList.Last.
Zeig einfach mal n bischen Code, dann kann man das besser nachvollziehen ;)
MfG Bergmann
Marc. - Fr 25.02.11 20:35
Matclou hat folgendes geschrieben : |
Gemacht wird das mittels eines Zugriffs auf TListe, deren Methoden ja mitbenutzt werden: "result:=fliste.getobject;"
Nur leider wird ja dabei ein Objekt gewonnen... Ich brauche aber irgendwie einen String, damit das dann nachher auch ausgegeben kann... Wie ist das möglich? |
Jedes von TObject geerbte Objekt besitzt die Funktion "ToString". Diese lässt sich natürlich auch für angepasste Ausgaben überschreiben.
Es müsste also Folgendes in etwa reichen:
Beste Grüße
Bergmann89 - Sa 26.02.11 02:57
Hey,
welches Delphi-Version benutzt du? Weil bei meinem D7 Personal gibts die Methode nicht.
Mfg Bergmann.
jaenicke - Sa 26.02.11 03:31
Bergmann89 hat folgendes geschrieben : |
welches Delphi-Version benutzt du? Weil bei meinem D7 Personal gibts die Methode nicht. |
Steht doch im Profil, und ab Delphi 2009 gibt es das auch soweit ich mich erinnere.
Da hat sich auch noch einiges anderes getan an den Standardobjekten. Du hast mit Delphi 7 im Grunde die letzte Version vor den großen Erweiterungen an der IDE und der Sprache, die in den folgenden Versionen kamen. ;-)
Matclou - Sa 26.02.11 20:07
Bitte vertut euch nicht, mein Delphi ist uralt (Borland Delphi 6)!
Funktioniert da "MyObject.ToString;" auch, oder muss ich da etwas anderes verwenden? Also die Delphi-Hilfe jedenfalls kennt den Befehl nicht...
Mein Quelltext:
Delphi-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:
| unit mQueue; interface
uses classes;
type TQueue=class (TObject) private FListe:=TListe; public constructor create; virtual; destructor destroy; override; procedure push; virtual; procedure untenrausnehmen; virtual; function isempty: Boolean; virtual; function bottom: String; virtual;
end;
implementation
constructor TQueue.create; begin inherited Create; FListe:=TListe.create; end;
destructor TQueue.destroy; begin FListe.destroy; inherited destroy; end;
procedure TQueue.push(v1:String); begin FListe.tolast; FListe.insertbehind(v1); end;
procedure TQueue.untenrausnehmen(v2:String); begin FListe.tofirst; FListe.delete(v2); end;
function TQueue.isempty:Boolean; begin result:=FListe.isempty; end;
function TQueue.bottom:String; begin liste.tofirst; result:=fliste.getobject; end; |
Es geht um die letzte Funktion (bottom), hier habe ich das ganze jetzt noch ohne irgendeine Umwandlung gemacht..
Zudem können Fehler drin sein, weil ich das ganze quasi freihand getippt habe... ;)
Moderiert von
Martok: Quote- durch Delphi-Tags ersetzt
jaenicke - So 27.02.11 12:03
Matclou hat folgendes geschrieben : |
Bitte vertut euch nicht, mein Delphi ist uralt (Borland Delphi 6)! |
Du warst damit auch eben nicht gemeint, denn du hast die Version ja leider nicht in dein Profil geschrieben. ;-)
Ja, dann musst du wissen was für Objekte da drin sein können. Dann kannst du auf deren Typ prüfen. Natürlich kannst du auch eine Oberklasse für alle deine Klassen erstellen oder so.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| TYourClass = class public property YourProperty: String read ... write ...; end;
var MyObject: TObject; begin MyObject := MyList.GetObject; if MyObject is TYourClass then TYourClass(TObject).YourProperty... |
Matclou - So 27.02.11 21:55
ToString funktioniert also nicht?
Das Objekt ist ja vorbestimmt: Es ist ein Objekt, dass an einem Listenelement hängt, es stammt also ursprünglich aus der Delphiklasse TList...
Gibt es keine Möglichkeit das Objekt quasi in der gerade geposteten Klasse zum String zu wandeln?
bummi - So 27.02.11 22:38
was möchtest Du im String sehen? Classname?
jaenicke - So 27.02.11 22:39
Eben, irgendwoher muss der String ja kommen...
Und das sollte eben so sein, dass du eine eigene Klasse erstellst, ein solches Objekt in die Liste packst und dann eben dort wieder herausholst. Und dann kannst du das auf deine Klasse casten wie ich geschrieben hatte, fertig.
Bergmann89 - Mo 28.02.11 00:43
Hey,
er packt den String mit InsertBehind die Liste (siehe Code:
procedure TQueue.push(v1:String);). Dabei fallen mit 2 Sachen auf. 1. Gibt es bei meiner TList weder die Methode ToLast, noch eine Methode InsertBehind. Und 2. kann eine TList nur Pointer aufnehmen, und v1 ist aber ein String.
Genauso beim auslesen. Ich hab noch nie von der Methode GetObject gehört. NOrmalerweiße greigt man ja mit
Items[Index: Integer]: Pointer auf die Zeiger zu, die man vorher eingefügt hat. Woher soll die Liste wissen ob es ein Zeiger auf ein Objekt ist?
Also mit meiner Liste würde das ganze so aussehen:
Delphi-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:
| TQueue = class(TObject) private fList: TList; public procedure Clear; procedure Insert(str: String); function Remove: String; constructor Create; destructor Destroy; override; end;
procedure TQueue.Clear; begin while fList.Count > 0 do begin Dispose(PAnsiChar(fList[fList.Count-1])); fList.Delete(fList.Count-1); end; end;
procedure TQueue.Insert(str: String); var p: PAnsiChar; begin new(p); p := @str[1]; fList.Add(p); end;
function TQueue.Remove: String; var p: PAnsiChar; begin p := fList[0]; result := String(p); Dispose(p); fList.Delete(0); end;
constructor TQueue.Create; begin inherited Create; fList := TList.Create; end;
destructor TQueue.Destroy; begin Clear; inherited Destroy; end; |
Wenn du ne Warteschlange für Strings bauen willst, dann nehm doch intern die TStringList, dafür ist sie ja gemacht, dann musst du auch nicht mit den StringPointern rum hantieren...
MfG Bergmann
bummi - Mo 28.02.11 01:24
TListe wird IMHO ein TStringlist-Derivat sein, aber wie das
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TQueue.Insert(str: String); var p: PAnsiChar; begin new(p); p := @str[1]; fList.Add(p); end; |
funktionieren soll, str als Parameter über der Stack und in die Liste einen Pointer darauf :gruebel:
Bergmann89 - Mo 28.02.11 04:28
Sry. Keine Ahung, was ich mir dabei gedacht hab. So is es richtig:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TQueue.Insert(str: String); var p: PAnsiString; begin new(p); p^ := str; fList.Add(p); end;
function TQueue.Remove: String; var p: PAnsiString; begin p := fList[0]; result := p^; Dispose(p); fList.Delete(0); end; |
MfG Bergmann.
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!