![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Tag
TUser © (2004-08-25 16:12:00)Никак не могу понять, где баг.
Создаю динамически кнопки, назначаю обработчик. По нажатию на кнопку в обработчике должна появиться определенная информация. Ее я записал в TList. Пишу вот так.
New(P);
P^:=...;
b.Tag:=FLockList.Add(P);
b.Hint:=inttostr(b.Tag);
b.ShowHint:=true;
Все добавляется и создается нормально. На хинтах показываются правильные таги. Дебагер показывает в соотвествующих итемал TList'а правильную инфу.
В обработчике я эту инфу достаю. Пишу вот так
L:=TMyRecord(FLockList.Items[(Sender as TControl).Tag]^);
Вроде бы все должно быть нормально. Но Tag в обработчик попадает неправильный. Если подебажить, то оказывается, что Tag может оказаться каким угодно (точнее - индекс, передаваемый в метод Get класса TList), но обычно не таким, какой нужен. Итемы в TList здесь могут только добавляться, никакого удаления никогда не происходит.
TMyRecord состоит из 2х указателей и одной string[50], хотя это не важно.
Где тут грабли?
Rem (2004-08-25 17:11:00) [1]А все-таки приведите оригинальный исходный код, в котором создаете кнопку, а также где используете тэг.
TUser (2004-08-25 17:04:00) [2]Пока буду грузить из хинта. Дешево и сердито. Но все равно непонятно.
Спасибо всем.
Rem (2004-08-25 17:01:00) [3][10]
ХитрО...
Ну попробуйте тогда вот так: TButton(Sender).Tag
Уж если у Вас такие баги, то, возможно, поможет...
У Вас в проекте, случайно, не используется нескольких разных версий одного и того же пакета или модуля?
MetalFan (2004-08-25 16:59:00) [4]никогда не было проблем с использованием св-ва Tag
возможно это не из-за него проблема?
TUser (2004-08-25 16:48:00) [5]2 [5]
Узнал, что Tag действительно неправильный.
TBut - это TButton.
> B.Tag := integer(P)
Можно и так, согласен.
Rem (2004-08-25 16:40:00) [6]Интересный класс: TBut
Значит, это свой компонент?
Тогда зачем Вы используете Tag?
Не лучше уж тогда ввести в класс дополнительные поля для хранения той информации, которую вы пытаетесь хранить в отдельном списке?
Даже если хотите именно через Tag, то зачем вам отдельный список? Почему Вы не пишете:B.Tag := integer(P);?
TUser (2004-08-25 16:35:00) [7]2 [2] и [6]
Нет. Так такая же бяка.
Зачем нужно объявление типизированного указателя, я понимаю. Но к св-ву Tag это не имеет никакого отношения.
PS. Если я не понимаю чего-то важного про преобразование типов - буду рад узнать. Но, думаю, баг не в этом.
TUser (2004-08-25 16:31:00) [8]В смысле 'где'? В программе моей где-то написано
b:=TBut.Create;
b.Parent:=FormX;
b.top, left, caption ...
b.OnClick:= ...
Сейчас попробую [2], но не понимаю, чем он отличается. Вроде бы там написано тоже самое, только другими словами. А написанное мной приведение типов работает. Проблема не в преобразовании типа к TMyRecord а в том, что
(Sender as TControl).Tag
неправильный.
Skier (2004-08-25 16:29:00) [9]>TUser © (25.08.04 16:25) [4]
Самым внимательным образом присмотрется к
строчке PMyRecord = ^TMyRecord;
И подумать зачем она нужна...может тогда всё и поймёшь.
Rem (2004-08-25 16:26:00) [10]А по поводу:
> Но Tag в обработчик попадает неправильный. Если подебажить,
> то оказывается, что Tag может оказаться каким угодно (точнее
> - индекс, передаваемый в метод Get класса TList)
Попробуйте:
var
i: integer;
begin
i := TControl(Sender).Tag;
ShowMessage(IntToStr(i));
L:=TMyRecord(FLockList.Items[i]^);
end;
TUser (2004-08-25 16:25:00) [11]Кстати, если написать
L:=TMyRecord(FLockList.Items[StrToInt((Sender as TControl).Hint)]^);
то, вроде бы, все нормально. Чем так провинилось св-во Tag, оно вроде бы специально придумано для такого рода дел?
MetalFan (2004-08-25 16:24:00) [12]маловато инфы...
а где кнопка создается?
Rem (2004-08-25 16:23:00) [13]
PMyRecord = ^TMyRecord;
L:=PMyRecord(FLockList.Items[(Sender as TControl).Tag])^;
MetalFan (2004-08-25 16:22:00) [14]маловато инфы...
а где кнопка создается?