| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Обработка кликов |
| Автор: stron 5.5.2004, 00:25 | ||||
| Я сейчас пишу карточную игру для 4-х игроков.(C#) Соответственно, у меня есть 52 карты. Карты показываю в PictureBox'ах. У каждой карты есть свой весовой идентификатор.(раздаю их в другой части проги) Для хранения таковой инфы создаю структуру:
Создаю массив из 52 элементов типа pb в программе. В игре приходится обрабатывать клики по картам, соответственно при инициализации PictureBox'ов "приклеиваю" обработчик:
Вопрос: Почему при клике на любую из карт в качестве weight выдаётся 0(его там не должно быть в принципе)? А может кто подскажет ещё способ, как можно различать карты. ЗЫ: Были у меня мысли как-нибудь перегрузить обработчик, но как это сделать я не придумал. |
| Автор: Kurt 5.5.2004, 03:00 | ||||||
| Ну.. Какие тут могут быть соображения.. Т.к. я не вижу полного кода, все мои "изыскания" ( Сначала по вопросу почему у тебя не работает правильно.. "Разрешите задать Вам несколько вопросов?" 1) Твои структуры ты должне был каким-то образом добавлять на форму. Для этого используем Controls.Add() (если я ошибаюсь - сразу сорри..). Так? Посморим, на объявление этой ф-ции:
Вот! В качестве параметра она принимает либо класс Control, либо его наследник. Твои структуры не являются контролами, поэтому рискну предположить, что ты добавлял только pb[i].img:
Если так, то обрати внимание - причем здесь остальные поля структуры? как тока ты добавил на форму - ты уже не связан с остальными полями.. Однако, я могу ошибаться - я не знаю, как оно в действительности реализовано.. 2)Т.к. ты используешь СТРУКТУРУ, к-я является ТИПОМ, то она везде передается ПО ЗНАЧЕНИЮ (за исключением автоматической распаковки..) - меняй/не меняй ее в ф-ции - это не окажет влияния.. Проверь, если не первая ошибка, то, можь, такое где есть.. Теперь так. Как я тебе предлагаю все эт дело реализовать.. Предлагаю написать свой КЛАСС-НАСЛЕДНИК от PictureBox! Добавь ему св-ва, к-е тебе нужны! Вобщем, я накрапал тебе маленький примерчик (можно компилить и запускать.. На форме 2 PictureBox'a, вернее их наследники.. Я все оформил массивом, поэтому без разницы - что 2, что 102 контрола. Тока возьми сначала картинку поменьше.. Здесь у первой картинки Weight=0, у 2-й - weight=1. Итого:
Все. Похоже?.. Надеюсь, хоть чем-то помог. З.Ы. Если я прав - с тебя игра! |
| Автор: stron 6.5.2004, 16:07 | ||||
Ошибку понял.
Честно говоря, я не знаю, что такое автоматическая распаковка. Буду писать класс-наследник. Спасибо, что помог! |
| Автор: Kurt 6.5.2004, 16:54 |
| Да не за что.. Приходите еще.. |
| Автор: Kurt 6.5.2004, 17:36 | ||||||||||||
Да, чуть не забыл..
УПАКОВКА (boxing) - процесс, при котором происходит явное преобразование структурного типа в ссылочный. Что при этом происходит: в управляемой куче (по-моему, так это называется.. Как все это происходит? Очень просто. Допустим, у нас есть переменная типа int:
Упаковываем (достаем из стека, создаем объект в куче и получаем ссылку на него):
Прошу заметить, "object" тут пишется с маленькой буквы. Существует противоположная ей операция, кя называется РАСПАКОВКА (unboxing) - преобразование ссылки на объект из управляемой кучи в структурный тип. Следует отметить, что .NET Framework автоматически производит проверку на совместимость между типом объекта из кучи и структурным типом, в к-й мы хотим произвести распаковку. Вот как производится распаковка:
Если Framework обнаружит несовместимость типов, то выдается исключение InvalidCastException:
Все. Да, возникает законный вопрос - а вообще зачем этим стоит интересоваться? Ну.. Тут несколько аспектов. Во-первых, чтоб избежать, на мой взгляд, трудно обнаружимых ошибок, и во вторых, операции с переменными в стеке выполняются несколько быстрее, поэтому это стоит учитывать при оптимизации приложения. С другой стороны, увлекаться этим тоже не стоит - все-таки процесс распаковки занимает некоторое время, и кроме того, в современных ООП-программах тяжело обойтись без объектов. В конце хочу заметить, что в ряде случаев, процессы упаковки/распаковки производятся автоматически, без нашего участия. Например:
В принципе, все. |