TListを使うには?

解決


FromC  2005-11-04 19:09:44  No: 18454  IP: 192.*.*.*

お世話になります。
CのソースをDelphiに移植したいのですが

IntList = new TList;
int *Data = new int;
IntList->Add(Data);


Delphiではどのように記述すればいいのですか?
IntList = TList.Create;
IntList.Add(Data)
この2行はわかったのですが

もちろんエラーですが同じように考えると

var
  Data: Integer;
begin
  IntList = TList.Create;
  Data = Integer.Create;
  IntList.Add(Data)
end;

なにか関数が用意されているのでしょうか?

編集 削除
にしの  2005-11-04 19:24:28  No: 18455  IP: 192.*.*.*

DelphiのIntegerはプリミティブ型です。
Integer.Create;という書き方はできません。

var
  Data: Integer;
begin
  IntList := TList.Create;
  Data := 0;//何か値を入れる
  IntList.Add(Pointer(Data));
end;
とします。

編集 削除
りおりお  2005-11-04 19:24:30  No: 18456  IP: 192.*.*.*

こんな感じで使います。

    { Private 宣言 }
  public
    { Public 宣言 }
    IntList: TList;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  pInt: PInteger;
begin
  IntList := TList.Create;

  GetMem(pInt,SizeOf(Integer));
  pInt^ := 123456;
  IntList.Add(pInt);

  GetMem(pInt,SizeOf(Integer));
  pInt^ := 987654;
  IntList.Add(pInt);
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to IntList.Count-1 do FreeMem(PInteger(IntList[i]));
  IntList.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to IntList.Count-1 do
    Memo1.Lines.Add(IntToStr(PInteger(IntList[i])^));
end;

編集 削除
にしの  2005-11-04 19:28:16  No: 18457  IP: 192.*.*.*

りおりおさんのやり方がちゃんとしたやり方です。
SizeOf(Integer)=SizeOf(Pointer)である前提で、私のやり方でもOKというだけで。
他の型の場合はダメな場合が多いです。
ご注意を。

編集 削除
FromC  2005-11-04 19:50:11  No: 18458  IP: 192.*.*.*

ありがとうございました。

GetMem, FreeMem を使ってメモリ確保するんですね。
最初は  にしのさんと同じ考えもあったのですが、
以下の方法だと最後のデータになっちゃったので
どうしたらよいものかと考えてました。

var
  Data: Integer;
begin
  IntList := TList.Create;
  Data := 0;//何か値を入れる
  IntList.Add(Pointer(Data));
  Data := 1;//何か値を入れる
  IntList.Add(Pointer(Data));
end;

編集 削除
FromC  2005-11-04 19:54:23  No: 18459  IP: 192.*.*.*

ついでにですが、今やろうとしてたのは
メモリと処理の無駄が多いですが、
以下のようなクラスを作ってするしかないのかと思ってました。

TIntClass = class(TObject)
public
  IntData: Integer
end;

編集 削除
りおりお  2005-11-04 21:24:35  No: 18460  IP: 192.*.*.*

> 以下のようなクラスを作ってするしかないのかと思ってました。

クラスにするのはかなり有効で応用がきくいい方法です。メモリのオーバヘッドは
データ一つにつき、最大で4バイトだけです。

クラスにすると TList ではなく、TObjectList を使えますので、インスタンス管理が
自動化されて便利です。

わたしだったら、Integer のリストでもその要素はクラスにします。

編集 削除