お世話になります。
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;
なにか関数が用意されているのでしょうか?
DelphiのIntegerはプリミティブ型です。
Integer.Create;という書き方はできません。
var
Data: Integer;
begin
IntList := TList.Create;
Data := 0;//何か値を入れる
IntList.Add(Pointer(Data));
end;
とします。
こんな感じで使います。
{ 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;
りおりおさんのやり方がちゃんとしたやり方です。
SizeOf(Integer)=SizeOf(Pointer)である前提で、私のやり方でもOKというだけで。
他の型の場合はダメな場合が多いです。
ご注意を。
ありがとうございました。
GetMem, FreeMem を使ってメモリ確保するんですね。
最初は にしのさんと同じ考えもあったのですが、
以下の方法だと最後のデータになっちゃったので
どうしたらよいものかと考えてました。
var
Data: Integer;
begin
IntList := TList.Create;
Data := 0;//何か値を入れる
IntList.Add(Pointer(Data));
Data := 1;//何か値を入れる
IntList.Add(Pointer(Data));
end;
ついでにですが、今やろうとしてたのは
メモリと処理の無駄が多いですが、
以下のようなクラスを作ってするしかないのかと思ってました。
TIntClass = class(TObject)
public
IntData: Integer
end;
> 以下のようなクラスを作ってするしかないのかと思ってました。
クラスにするのはかなり有効で応用がきくいい方法です。メモリのオーバヘッドは
データ一つにつき、最大で4バイトだけです。
クラスにすると TList ではなく、TObjectList を使えますので、インスタンス管理が
自動化されて便利です。
わたしだったら、Integer のリストでもその要素はクラスにします。
ツイート | ![]() |