Autor Beitrag
Matclou
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
MyObject.ToString;					


Beste Grüße
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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:

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.
ausblenden 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...

Für diesen Beitrag haben gedankt: Matclou
Matclou Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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:

ausblenden volle Höhe 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

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mo 28.02.11 01:24 
TListe wird IMHO ein TStringlist-Derivat sein, aber wie das
ausblenden 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:

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: Mo 28.02.11 04:28 
Sry. Keine Ahung, was ich mir dabei gedacht hab. So is es richtig:
ausblenden 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^^