2013-04-23 7 views
5

Natürlich wird dieses Stück Code nicht kompilieren. Zuerst muss ich einen TObject-Wert in Integer umwandeln. Dann lesen Sie es als eine Zeichenfolge. Welche Funktion sollte ich verwenden?Wie speichert man eine Ganzzahl in einer TObject-Eigenschaft und zeigt diesen Wert dann dem Benutzer an?

for i := 1 to 9 do begin 
    cmbLanguage.Items.AddObject(Format('Item %d', [i]), TObject(i)); 
end; 

cmbLanguage.ItemIndex := 2; 

ShowMessage(cmbLanguage.Items.Objects[cmbLanguage.ItemIndex]); 

Oder vielleicht ist es möglich String statt Integer in erster Linie zu benutzen?

+1

Um welche Art von Objekt ist es? Es gibt keine generische TObject-To-String-Funktion. – Blorgbeard

+0

als eine Notiz, aber keine Antwort, würde ich empfehlen, erstellen Sie Ihr eigenes Objekt in diesem Feld zu speichern. Schließlich ist dies das Ziel. Ihr Objekt könnte nach Bedarf mehr Informationen enthalten. Zum Beispiel, Sie erwähnen, dass es eine Liste von Sprachen ist. Ein Objekt (d. H. "TLanguage") könnte Eigenschaften wie "Name: String", "ID: Integer" und mehr aufweisen. –

+0

Übrigens, Sie fragen immer noch, wie Sie es in eine Zeichenfolge umwandeln, aber die Frage erwähnt Ganzzahl. Behalten Sie die Frage über Integer, die in einem TObject-Feld gespeichert sind, und String/Integer-Konvertierung ist der einfache Teil ("IntToStr", "StrToIntDef" usw.). Der Titel sollte also eher lauten wie "Wie speichere ich eine ganze Zahl in einem TObject-Feld?" –

Antwort

9
cmbLanguage.Items.AddObject(Format('Item %d', [i]), TObject(i)); 

Hier Sie hinzufügen, ein Element mit einem „Objekt“, das eigentlich eine ganze Zahl ist (i) gegossen zu einem TObject.

Da Sie tatsächlich ein int im Objektfeld zu speichern, können Sie es nur auf Integer zurückgeworfen, umwandeln dann, dass in einen String:

ShowMessage(IntToStr(Integer(cmbLanguage.Items.Objects[cmbLanguage.ItemIndex]))); 

Beachten Sie, dass Sie nicht wirklich sind Umwandlung alles hier , Sie geben nur vor, dass Ihre Ganzzahl ein TObject ist, so dass sich der Compiler nicht beschweren kann.

+1

Woher wissen Sie, dass das OP eine Ganzzahl in der Objects-Eigenschaft speichert? – Jason

+0

Ich wollte das Gleiche fragen. –

+0

@Jason Ich habe meine Antwort zu erklären. – Blorgbeard

1

Sie können ein Objekt nicht einfach in eine Zeichenfolge konvertieren. Dies ist etwas, was Sie tun müssen, indem Sie eine Methode Ihrer Wahl verwenden, abhängig von der Begründung. Sie könnten beispielsweise eine Zeichenfolge im XML-Format verketten, die die Daten in Ihrem Objekt darstellt. Allerdings hat Delphi absolut keine Möglichkeit, diese Daten für Sie zu verketten.


Wie andere haben darauf hingewiesen, Sie versuchen tatsächlich zu werfen eine TObject als Integer. Das bedeutet, dass, wenn Sie eine ganze Zahl in einem TObject Feld gespeichert ist, dann müssen Sie Guss es zurück, zum Beispiel Integer(MyIntObject)

2

Wenn Sie wissen, dass Sie Delphi-7 für den Rest Ihres Lebens mit dem TObject (i) Cast verwenden werden. Andernfalls beginnen Sie mit den richtigen Objekten, dies erspart Ihnen Kopfschmerzen beim Upgrade auf 64 Bit.

Unit uSimpleObjects; 

Interface 

type 
    TIntObj = class 
    private 
     FI: Integer; 
    public 
     property I: Integer Read FI; 
     constructor Create(IValue: Integer); 
    end; 

type 
    TDateTimeObject = class(TObject) 
    private 
     FDT: TDateTime; 
    public 
     property DT: TDateTime Read FDT; 
     constructor Create(DTValue: TDateTime); 
    end; 

Implementation 

{ TIntObj } 

constructor TIntObj.Create(IValue: Integer); 
begin 
    Inherited Create; 
    FI := IValue; 
end; 

{ TDateTimeObject } 

constructor TDateTimeObject.Create(DTValue: TDateTime); 
begin 
    Inherited Create; 
    FDT := DTValue; 
end; 

end. 

Verbrauch:

var 
    IO: TIntObj; 
    SL: TStringList; 

Lagerung:

SL := TStringList.Create(true); // 'OwnsObjects' for recent Delphi versions 
IO := TIntObj.Create(123); 
SL.AddObjects(IO); 

Retrieval:

IO := TIntObj(SL.Objects[4]); 
ShowMessage('Integer value: '+ IntToStr(IO.I)); 

Für Delphi-7

TIntObj := TStringList.Create; 

und muss man sich die Objekte freizugeben:

for i := 0 to Sl.Count-1 do 
begin 
    IO := TIntObj(SL.Objects[i]); 
    IO.Free; 
end; 
SL.Free; 
2

Wenn delphi xe oder höher verwendet wird, würde ich eine generische Klasse verwenden, um auf @Jerry Antwort basiert.

Zubereitung:

unit CoreClasses; 

interface 

type 
    IPrimitiveBox<T> = interface 

    procedure setValue(value : T); 
    function getValue(): T; 

    end; 

    TPrimitiveBox<T> = class(TInterfacedObject, IPrimitiveBox<T>) 

    private 
     value : T; 

    public 
     constructor create(value : T); 

     // IPrimtiveBox<T> 
     procedure setValue(value : T); 
     function getValue(): T; 

    end; 

implementation 

{ TPrimitiveBox<T> } 

constructor TPrimitiveBox<T>.create(value: T); 
begin 
    self.value := value; 
end; 

function TPrimitiveBox<T>.getValue: T; 
begin 
    Result := value; 
end; 

procedure TPrimitiveBox<T>.setValue(value: T); 
begin 
    self.value := value; 
end; 

Usage (basierend auf @Jerry Beispiel)

var 
    io: IPrimitive<Integer>; 

sl := TStringList.create(true); 
io := TPrimitive<Integer>.create(123); 
sl.addObjects(io) 


io := IPrimitive<Integer>(sl.objects[4]); 
ShowMessage('Integer value: '+ IntToStr(io.getValue())); 
+1

+1 @FXL für ausgezeichnete vielseitige Lösung, die nicht durch zerbrechliche Annahmen wie "eine Ganzzahl ist die gleiche Größe wie ein TObject-Zeiger." – LMSingh