Имя: Пароль:
IT
 
Создание объектов в новом месте памяти (Delphi).
0 H A D G E H O G s
 
19.09.11
00:36
Сломал мозг.

Есть код:

var obj:TMyObject;

begin

for i:=1 To 10 do begin
obj:=TMyObject.Create();
obj.ID:=i;
SaveObject(@obj); // там указатель на объект сохраняется в TList, мы его не теряем и о нем позаботимся.
end;


Теперь проблема - в каждой итерации объект создается в том же месте памяти и затирает предыдущий объект.
Как его разместить в новом месте?
1 Rie
 
19.09.11
01:30
(0) Не понял. @obj - это адрес именно obj. Он - один и тот же, пока переменная obj существует.
2 H A D G E H O G s
 
19.09.11
01:36
(1) Перефразирую.
Мне надо создать 10 разных объектов 1-ого класса.
3 Rie
 
19.09.11
01:37
(2) Это я понял. Но они и создаются спокойненько.
У меня есть подозрение, что всё портит SaveObject. Что ты сохраняешь в список не тот адрес.
4 NS
 
19.09.11
02:19
for i:=1 To 10 do begin
obj[i]:=TMyObject.Create();
obj[i].ID:=i;
5 NS
 
19.09.11
02:28
Ты получаешь адрес переменной obj, которая естественно всегда остается в одном месте памяти.

А ссылкой на созданный объект конечно-же является не @obj, а сама переменная obj.
6 NS
 
19.09.11
02:28
(4) я это не отправлял :)
7 NS
 
19.09.11
02:30
(3) Нет, всё портит непонимание типа переменной
var obj:TMyObject;
Это ссылка на объект, а сама переменная находится по фиксированному адресу.
8 NS
 
19.09.11
02:31
(3) Да, он не то сохраняет в список.
9 Rie
 
19.09.11
02:33
(7) Об этом я писал в (1). Но что внутри у SaveObject - нам пока неизвестно.
10 NS
 
19.09.11
02:34
Но судя по тому что он изначально передает @obj - он уже запутался.
11 Rie
 
19.09.11
02:38
(10) Согласен.
12 H A D G E H O G s
 
20.09.11
02:40
Спасибо, добрые люди.

Теперь еще вопрос - как получить адрес метода объекта:

Вот как-то так:
нужно call-back указать:

CreateThread(nil,0,@Self.ThreadProc,nil,0,PID);

Нэ получается.
13 H A D G E H O G s
 
20.09.11
02:45
Так, кажись нашел
self.MethodAddress('ThreadProc')
14 Rie
 
20.09.11
04:34
(12) Можно завести переменную нужного типа, например,

var ThrP: procedure of object; stdcall;

и затем

ThrP := ThreadProc;
CreateThread(nil,0,ThrP,nil,0,PID)
15 H A D G E H O G s
 
20.09.11
10:58
(14) Точняк! Спасибо.
16 H A D G E H O G s
 
20.09.11
10:58
Но и (13) работает!
17 Rabbit
 
20.09.11
13:15
(2) 10 объектов - это массив, или я чего-то не понимаю?