Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Object as String? (https://www.delphipraxis.net/91945-object-string.html)

.chicken 12. Mai 2007 08:54


Object as String?
 
Ich habe in einer ListBox sowohl unter den Strings als auch unter den Objekten Strings gespeichert.
Also
Delphi-Quellcode:
ListBox.Items.AddObject(TObject(MeinString)); //so ungefähr ^^
Wie kann ich MeinString nun als String zurückbekommen?

MrSpock 12. Mai 2007 09:03

Re: Object as String?
 
Hallo .chicken,

grundsätzlich geht das über den as Operator:

Delphi-Quellcode:
(meineListe.Objects[index] as TMyString).MyString
Aber um einen String als TObject zu casten, musst du ihn vorher entsprechend verpacken.

Delphi-Quellcode:
type TMyString = class (TObject)
   MyString: String
end;
Dann kannst du TMyString als TObject in den Objects Array übernemhem und anschließend wie oben wieder casten.

.chicken 12. Mai 2007 09:10

Re: Object as String?
 
Anders geht das nich? Is ja blöd, sau der Umweg, aber gut da lässt sich wohl nix dran machen,.....

MrSpock 12. Mai 2007 09:15

Re: Object as String?
 
Hallo .chicken,

ein TObject ist letztlich ein Zeiger auf eine Struktur. Die Länge ist damit nur 32 Bit. Du kannst also einen String nicht auf ein TObject casten, weil die Längen unterschiedlich sind. Aber mit dem Verpacken, das würde funktionieren. Ober du nutzt eine zweite Liste. Oder du schreibst beide Strings in einen Eintrag und trennst sie mit einem eindeutigen Zeichen, dass in deinen Strings nicht vorkommen kann.

himitsu 12. Mai 2007 09:18

Re: Object as String?
 
Wenn du die Objekte in der Liste nich automatisch freigeben läßt, sondern dieses selber machst, dann sollte String(meineListe.Objects[index]), oder auch PChar(meineListe.Objects[index]) als Umkehrfunktion zu deiner Übergabe diehnen.

.chicken 12. Mai 2007 09:20

Re: Object as String?
 
Was heisst nicht automatisch freigeben lässt? ^^
Also ich hab schonmal versucht sie mit String() zurückzuholen aber das hat nur bedingt geklappt (führte später zu nem Fehler). Ich versuchs nochmal mit PChar.

.chicken 12. Mai 2007 09:27

Re: Object as String?
 
Ok, geht jetzt, danke ;-)

jbg 12. Mai 2007 09:31

Re: Object as String?
 
Mit PChar hinterlässt du ein Speicherleck, da "S := PChar(P)" einen neuen String anlegt. Dein in P abgelegter (echte) String wird aber nie freigegeben, da der Compiler nicht weiß, dass sich hinter dem TObject ein String befindet.

himitsu 12. Mai 2007 10:23

Re: Object as String?
 
Was das Speicherleak angeht, sollte es so ja eigentlich keine Probleme geben.
Es kommt nur auf die "richtige" Konvertierung an, also welche Seite konvertiert wird.
Das worauf zugewiesen wird und nicht das was zugewiesen wird.

Aber stimmt schon, obwohl String und TObject doch eigentlich nur Zeiger auf ihre Struktur sind (je 32 Bit groß) kann man dem Konvertiertem String nichts Zuweisen, wärend komischer Weise das Auslesen geht? :gruebel:
Delphi-Quellcode:
// hinzufügen
i := ListBox1.Items.Add('Item');
String(ListBox1.Items.Objects[i]) := 'Object';

// löschen
String(ListBox1.Items.Objects[i]) := '';
ListBox1.Items.Delete(i);

// abfragen
Label1.Caption := String(ListBox1.Items.Objects[i]);
// oder
Label1.Caption := PChar(ListBox1.Items.Objects[i]);

MrSpock 12. Mai 2007 12:34

Re: Object as String?
 
Hallo himitsu,

String ist aber kein Zeiger auf ein Struktur. String ist ja ein eigener Typ, der nicht zu einem TObject gecastet werden kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz