TListを使うには?

解決


FromC  2005-11-05 04:09:44  No: 18454

お世話になります。
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-05 04:24:28  No: 18455

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

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


りおりお  2005-11-05 04:24:30  No: 18456

こんな感じで使います。

    { 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-05 04:28:16  No: 18457

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


FromC  2005-11-05 04:50:11  No: 18458

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

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-05 04:54:23  No: 18459

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

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


りおりお  2005-11-05 06:24:35  No: 18460

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

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加