Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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]

маловато инфы...
а где кнопка создается?


Наверх

Титульная страница Поиск, карта сайта Написать письмо