2013-04-23 9 views
5

Ovviamente, questa parte di codice non verrà compilata. Per prima cosa ho bisogno di trasmettere un valore TObject a Integer. Quindi, leggerlo come una stringa. Quale funzione dovrei usare?Come memorizzare un intero in una proprietà TObject e quindi mostrare quel valore all'utente?

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]); 

O forse è possibile utilizzare String invece di Integer, in primo luogo?

+1

Che tipo di oggetto è? Non esiste una funzione generica da TObject a stringa. – Blorgbeard

+0

come nota, ma non una risposta, ti consiglio di creare il tuo oggetto da archiviare in questo campo. Dopotutto, questo è ciò a cui è destinato. Il tuo oggetto potrebbe includere più informazioni se necessario. Ad esempio, hai detto che è un elenco di lingue. Un oggetto (ad esempio 'TLanguage') potrebbe avere proprietà come" Name: String "," ID: Integer "e altro. –

+0

A proposito, stai ancora chiedendo come eseguirlo su una stringa, ma la domanda menziona numero intero. Mantieni la domanda sugli interi memorizzati in un campo TObject e la conversione stringa/intero è la parte facile ('IntToStr',' StrToIntDef', ecc.). Quindi il titolo dovrebbe essere più simile a "Come memorizzare un numero intero in un campo TObject?" –

risposta

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

Qui si sta aggiungendo un elemento con un "oggetto" che è in realtà un numero intero (i) convertito in uno TObject.

Dal momento che in realtà si sta memorizzando un int nel campo oggetto, si può semplicemente lanciare di nuovo a Integer, poi convertire in una stringa:

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

Nota che non siete veramente conversione nulla qui , stai solo fingendo che il tuo intero sia un TObject quindi il compilatore non si lamenta.

+1

Come fai a sapere che l'OP sta memorizzando un numero intero nella proprietà Oggetti? – Jason

+0

Stavo per chiedere la stessa cosa. –

+0

@ Jason Ho modificato la mia risposta per spiegare. – Blorgbeard

1

Non si può semplicemente convertire un oggetto in una stringa. Questo è qualcosa che dovrai fare da solo usando un metodo a tua scelta, a seconda del ragionamento che sta dietro. Ad esempio, è possibile concatenare una stringa in formato XML che rappresenta i dati nel proprio oggetto. Tuttavia, Delphi non ha assolutamente modo di concatenare questi dati per te.


Come altri hanno sottolineato, in realtà si sta tentando di gettato un TObject come Integer. Questo significa che se si è memorizzato un numero intero in un campo TObject, allora avete bisogno di fusione indietro, per esempio Integer(MyIntObject)

2

Se si sa che verrà utilizzato Delphi-7 per il resto della tua vita con la chiavetta (i) fusione TObject. Altrimenti inizia a usare gli oggetti appropriati, questo ti farà risparmiare mal di testa quando eseguirai l'aggiornamento a 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. 

Usage:

var 
    IO: TIntObj; 
    SL: TStringList; 

bagagli:

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

Recupero:

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

per Delphi-7

TIntObj := TStringList.Create; 

e si deve liberare gli oggetti da soli:

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

Se XE Delphi o superiore viene utilizzato, vorrei usare una classe generica in base a @Jerry risposta.

Preparazione:

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; 

Uso (basato su @Jerry esempio)

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 per un'eccellente soluzione versatile non limitata da ipotesi infruttuose come "un numero intero ha le stesse dimensioni di un puntatore TObject". – LMSingh

Problemi correlati