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

user profile iconMatclou hat folgendes geschrieben Zum zitierten Posting springen:
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
1:
MyObject.ToString;                    


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

user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
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: Stringvirtual;

   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 user profile iconMartok: Quote- durch Delphi-Tags ersetzt


jaenicke - So 27.02.11 12:03

user profile iconMatclou hat folgendes geschrieben Zum zitierten Posting springen:
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.