Autor |
Beitrag |
Matclou
      
Beiträge: 24
|
Verfasst: Fr 25.02.11 19:11
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
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: 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
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: 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:
Delphi-Quelltext
Beste Grüße
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Sa 26.02.11 02:57
Hey,
welches Delphi-Version benutzt du? Weil bei meinem D7 Personal gibts die Methode nicht.
Mfg Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 24
|
Verfasst: 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:
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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 27.02.11 12:03
Für diesen Beitrag haben gedankt: Matclou
|
|
Matclou 
      
Beiträge: 24
|
Verfasst: 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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: So 27.02.11 22:38
was möchtest Du im String sehen? Classname?
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: 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:
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
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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 
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: 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.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
|