Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.033 c