|
Создание объектов в новом месте памяти (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 объектов - это массив, или я чего-то не понимаю?
|
|
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший