5

当然,这段代码不会编译。首先,我需要将 TObject 值转换为 Integer。然后,将其作为字符串读取。我应该使用什么功能?

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

或者也许可以首先使用 String 而不是 Integer ?

4

4 回答 4

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

在这里,您要添加一个带有“对象”的项目,该“对象”实际上是一个i转换为TObject.

由于您实际上在对象字段中存储了一个 int,因此您可以将其转换回 Integer,然后将其转换为字符串:

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

请注意,您并没有真正在此处转换任何内容,您只是假装您的整数是 TObject,因此编译器不会抱怨。

于 2013-04-23T00:53:22.733 回答
2

如果您知道您将在余生中使用 Delphi-7,请坚持使用 TObject(i) 演员表。否则开始使用适当的对象,这将在升级到 64 位时为您省去麻烦。

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.

用法:

var
  IO: TIntObj;
  SL: TStringList;

贮存:

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

恢复:

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

对于 Delphi-7

TIntObj := TStringList.Create;

你必须自己释放对象:

for i := 0 to Sl.Count-1 do 
begin
  IO := TIntObj(SL.Objects[i]);
  IO.Free;
end;
SL.Free;
于 2013-04-23T07:33:50.527 回答
2

如果使用delphi xe 或更高版本,我将使用基于 @Jerry 答案的通用类。

准备:

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;

用法(基于@Jerry 示例)

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()));
于 2017-06-29T13:49:46.317 回答
1

您不能简单地将对象转换为字符串。这是您必须使用您选择的方法自己完成的事情,具体取决于其背后的原因。例如,您可以连接表示对象中数据的 XML 格式的字符串。但是,Delphi 绝对无法为您连接这些数据。


正如其他人指出的那样,您实际上是在尝试a转换TObjectInteger. 这意味着如果您在TObject字段中存储了一个整数,那么您需要其转换回来,例如Integer(MyIntObject)

于 2013-04-23T00:50:46.493 回答