Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Работа с указателями

1 view
Skip to first unread message

Sergey V Kaltyga

unread,
Jun 25, 2007, 2:22:00 AM6/25/07
to
Не подскажет ли всезнающий All...

Есть запись, состоящая из двух полей:
TMyRecord = record
Name: String;
Pattern: TNotifyEvent; //В действительности другой тип события, но это не
важно
end;
var
PS: ^TMyRecord;
CB: TComboBox;
Требуется занести эти данные в TStrings. Делаю:

CB.Items.AddObject(PS.Name, TObject(@PS.Pattern);

Соответственно при выполнении в Watch вижу:
PS^ (Name: 'Название'; Pattern: Адрес1)
При этом
@PS.Pattern Адрес2
Pointer(CB.Items.Objects[0]) Адрес2

1. Почему Адрес1 и Адрес2 не совпадают?

2. Как определить, какой метод является установленным
обработчиком события (методы не published)?

С уважением. Сергей Калтыга.


Sergey Bychkov

unread,
Jun 25, 2007, 6:10:33 AM6/25/07
to
Привет, Sergey!


... В ответ на письмо от 25 июня 2007 от Sergey V Kaltyga к All сообщаем:

<...>

SK> CB.Items.AddObject(PS.Name, TObject(@PS.Pattern);

Сравни sizeof(TNotifyEvent) и sizeof(TObject)

До встречи, Sergey!
Sergey (serge_bychkov[zzz]mail333.com) ICQ# 21014758

Sergey V Kaltyga

unread,
Jun 25, 2007, 8:28:46 PM6/25/07
to

"Sergey Bychkov" <Sergey....@p55.f118.n450.z2.fidonet.org>
сообщил/сообщила в новостях следующее:
news:11827...@p55.f118.n450.z2.FidoNet.ftn...
SK>> CB.Items.AddObject(PS.Name, TObject(@PS.Pattern);

SB> Сравни sizeof(TNotifyEvent) и sizeof(TObject)

Так к типу TObject приводится не само поле, а его адрес...
Или вы утверждаете, что при подобном приведении
адрес изменяется?

С уважением. Сергей Калтыга.


Sergey Bychkov

unread,
Jun 26, 2007, 6:25:06 AM6/26/07
to
Привет, Sergey!


... В ответ на письмо от 26 июня 2007 от Sergey V Kaltyga к Sergey Bychkov
сообщаем:

SK>>> CB.Items.AddObject(PS.Name, TObject(@PS.Pattern);

SB>> Сравни sizeof(TNotifyEvent) и sizeof(TObject)

SK> Так к типу TObject приводится не само поле, а его адрес...
SK> Или вы утверждаете, что при подобном приведении
SK> адрес изменяется?

Hу тогда в чём проблема - адрес поля и значение поля не обязаны совпадать.

PS А имя метода, если он ен является published, узнать можно будет, только если
будет реализована какая-то аналогичная RTTI функциональность.

Vadim Evteev

unread,
Jun 27, 2007, 3:55:55 PM6/27/07
to
Hello, Sergey!

Mon Jun 25 2007 10:22, Sergey V Kaltyga wrote to All:

SK> Есть запись, состоящая из двух полей:
SK> TMyRecord = record
SK> Name: String;
SK> Pattern: TNotifyEvent; //В действительности другой тип события, но
SK> это не важно end; var PS: ^TMyRecord; CB: TComboBox; Требуется занести
SK> эти данные в TStrings. Делаю:
SK> CB.Items.AddObject(PS.Name, TObject(@PS.Pattern);

О. Увидел ваш пример, и сразу провел аналогию со своей задачей, решение на
которую пока найти не могу. Может, кто поможет?

Имеем такой тип записи:

Bilet = record
price_mesto :real;
price_bagaj :real;
price_bilet :real;
ost_begin :string;
ost_end :string;
mesto :integer;
lgota :string;
cd_run :integer
end;

var bil:bilet;


Hа форме расположен ListBox, в него загоняются данные по событию OnKeyPress.
Данные - собственно говоря, приведенные к String пункты этой записи Bil. Вот
так:

listbox1.Items.Add(
floattostr(bil.price_mesto)+dt+
floattostr(bil.price_bagaj)+dt+
floattostr(bil.price_bilet)+dt+
bil.ost_begin+dt+
bil.ost_end+dt+
inttostr(bil.mesto)+dt+
bil.lgota+dt+
inttostr(bil.cd_run));


где dt - это константа, равная ^I (знаку табуляции), чтобы в listbox это все
красиво разбивалось по столбцам.

Хотелось бы сделать одну хитрую вещь: как известно, у listbox есть возможность
подвязать Object под конкретную Item. Хотелось бы сделать нечто вроде такого:

listbox1.AddItem(
floattostr(bil.price_mesto)+dt+
floattostr(bil.price_bagaj)+dt+
floattostr(bil.price_bilet)+dt+
bil.ost_begin+dt+
bil.ost_end+dt+
inttostr(bil.mesto)+dt+
bil.lgota+dt+
inttostr(bil.cd_run),
Tobject(bil)
);


т.е. подвязать под конкретную строку в Item.Strings переменную типа bilet,
чтобы потом, когда юзер спозиционируется на записи в listbox можно было
свободно достучаться до значений price_mesto и т.д., без муторного обратного
приведения типов и вообще парсинга всей строки с выкидыванием символов ^I и так
далее.
Подозреваю, что это можно как-то сделать через TCustomListBox, но я никогда не
работал с этим, и вообще, слабо понимаю, как и что здесь надо делать. Может, у
кого-то есть конкретные мысли, как решить эту задачу? Можно, конечно, создавать
массив записей типа bilet, а в listbox писать, скажем, номер записи из массива,
потом опять же через приведение типов ее считывать, доставать нужный bilet из
массива и работать с его значениями, но это как-то некрасиво. Буду рад, если
кто-нибудь подскажет, как сделать правильно. :)

PS. ListBox заменять на что-то еще не очень желательно, уж больно много у меня
на него уже завязано...

0 new messages