Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

Tag   Найти похожие ветки 

 
TUser ©   (2004-08-25 16:12) [0]

Никак не могу понять, где баг.
Создаю динамически кнопки, назначаю обработчик. По нажатию на кнопку в обработчике должна появиться определенная информация. Ее я записал в 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], хотя это не важно.
Где тут грабли?


 
MetalFan ©   (2004-08-25 16:22) [1]

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


 
Rem   (2004-08-25 16:23) [2]

PMyRecord = ^TMyRecord;

L:=PMyRecord(FLockList.Items[(Sender as TControl).Tag])^;


 
MetalFan ©   (2004-08-25 16:24) [3]

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


 
TUser ©   (2004-08-25 16:25) [4]

Кстати, если написать
L:=TMyRecord(FLockList.Items[StrToInt((Sender as TControl).Hint)]^);
то, вроде бы, все нормально. Чем так провинилось св-во Tag, оно вроде бы специально придумано для такого рода дел?


 
Rem   (2004-08-25 16:26) [5]

А по поводу:

> Но Tag в обработчик попадает неправильный. Если подебажить,
> то оказывается, что Tag может оказаться каким угодно (точнее
> - индекс, передаваемый в метод Get класса TList)


Попробуйте:

var
 i: integer;
begin
 i := TControl(Sender).Tag;
 ShowMessage(IntToStr(i));
 L:=TMyRecord(FLockList.Items[i]^);
end;


 
Skier ©   (2004-08-25 16:29) [6]

>TUser ©   (25.08.04 16:25) [4]
Самым внимательным образом присмотрется к
строчке PMyRecord = ^TMyRecord;

И подумать зачем она нужна...может тогда всё и поймёшь.


 
TUser ©   (2004-08-25 16:31) [7]

В смысле "где"? В программе моей где-то написано
b:=TBut.Create;
b.Parent:=FormX;
b.top, left, caption ...
b.OnClick:= ...

Сейчас попробую [2], но не понимаю, чем он отличается. Вроде бы там написано тоже самое, только другими словами. А написанное мной приведение типов работает. Проблема не в преобразовании типа к TMyRecord а в том, что
(Sender as TControl).Tag
неправильный.


 
TUser ©   (2004-08-25 16:35) [8]

2 [2] и [6]
Нет. Так такая же бяка.
Зачем нужно объявление типизированного указателя, я понимаю. Но к св-ву Tag это не имеет никакого отношения.

PS. Если я не понимаю чего-то важного про преобразование типов - буду рад узнать. Но, думаю, баг не в этом.


 
Rem   (2004-08-25 16:40) [9]

Интересный класс: TBut
Значит, это свой компонент?
Тогда зачем Вы используете Tag?
Не лучше уж тогда ввести в класс дополнительные поля для хранения той информации, которую вы пытаетесь хранить в отдельном списке?

Даже если хотите именно через Tag, то зачем вам отдельный список? Почему Вы не пишете: B.Tag := integer(P);?


 
TUser ©   (2004-08-25 16:48) [10]

2 [5]
Узнал, что Tag действительно неправильный.

TBut - это TButton.

> B.Tag := integer(P)
Можно и так, согласен.


 
MetalFan ©   (2004-08-25 16:59) [11]

никогда не было проблем с использованием св-ва Tag
возможно это не из-за него проблема?


 
Rem   (2004-08-25 17:01) [12]

[10]
 ХитрО...
 Ну попробуйте тогда вот так: TButton(Sender).Tag
 Уж если у Вас такие баги, то, возможно, поможет...
 У Вас в проекте, случайно, не используется нескольких разных версий одного и того же пакета или модуля?


 
TUser ©   (2004-08-25 17:04) [13]

Пока буду грузить из хинта. Дешево и сердито. Но все равно непонятно.
Спасибо всем.


 
Rem   (2004-08-25 17:11) [14]

А все-таки приведите оригинальный исходный код, в котором создаете кнопку, а также где используете тэг.



Страницы: 1 вся ветка

Текущий архив: 2004.09.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.022 c
14-1093107849
Knight
2004-08-21 21:04
2004.09.12
Покупка подержанного автомобиля...


10-1019023143
Vlad.nojabrsk
2002-04-17 09:59
2004.09.12
Visibroker console не запускается под XP


1-1093845591
Zhekson
2004-08-30 09:59
2004.09.12
AdvStringGrid for Delphi7


1-1093342094
Илья
2004-08-24 14:08
2004.09.12
delphi & palm


14-1093485199
Думкин
2004-08-26 05:53
2004.09.12
С днем рождения! 26 августа