Есть запись, состоящая из двух полей:
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)?
С уважением. Сергей Калтыга.
... В ответ на письмо от 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
SB> Сравни sizeof(TNotifyEvent) и sizeof(TObject)
Так к типу TObject приводится не само поле, а его адрес...
Или вы утверждаете, что при подобном приведении
адрес изменяется?
С уважением. Сергей Калтыга.
... В ответ на письмо от 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 функциональность.
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 заменять на что-то еще не очень желательно, уж больно много у меня
на него уже завязано...