0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
|
|
1 | |
Конструкция Delphi27.04.2016, 11:59. Показов 2126. Ответов 24
Метки нет (Все метки)
Доброго времени суток!
Получилось так что когда начинал писать программы не было времени изучать теорию и писал довольно похожие программы, а сейчас сталкиваюсь с новыми понятиями и конструкциями. Подскажите, что собой представляет конструкция типа TButton(Sender).[свойство] ? Как этим пользоваться я понял, а как оно называется и искать по нему инфу не знаю. Просьба гнилыми помидорами не бросать, то, что надо читать теорию знаю и сам. Спасибо за понимание.
0
|
27.04.2016, 11:59 | |
Ответы с готовыми решениями:
24
Конструкция if else Конструкция if-else Конструкция On E:Exception Do Конструкция печати |
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
|
|
27.04.2016, 12:05 [ТС] | 3 |
Т.е. я могу вызывать методы нужного типа даже если Sender будет разных типов? К примеру Sender может быть в разных случаях TButton, TBitBtn или TTextEdit.
0
|
Native x86
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,424
|
|
27.04.2016, 12:24 | 4 |
Сообщение было отмечено Zvor как решение
Решение
Нет. В ООП-языках реализована совместимость типов от наследника к родителю. Т.е. переменная типа TObject может принимать экземпляр вообще любого класса (т.к. все классы Delphi в конце концов наследуются от TObject), но это не значит, что если в переменную записан экземпляр на TButton, мы можем обратиться к ней как к TEdit.
Приведение вида TButton(Sender) выполняется быстро, но не проверяет корректность. Это значит, что вы можете написать такую конструкцию когда Sender это TEdit, и у нее даже есть шанс сработать при обращении к некоторым общим свойствам. Но в большинстве случаев будет очень непонятная ошибка. Чтобы привести тип с проверкой соответствия, можно использовать оператор as: (Sender as TButton).Caption:= 'OK'; Такая проверка более долгая, но избавит вас от сюрпризов, выдавая понятную ошибку при любом несоответствии.
1
|
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
|
|
27.04.2016, 12:27 [ТС] | 5 |
Понял, спасибо)
0
|
97 / 97 / 25
Регистрация: 25.04.2016
Сообщений: 525
|
||||||
27.04.2016, 12:30 | 6 | |||||
0
|
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
|
||||||
27.04.2016, 12:44 [ТС] | 7 | |||||
О, это интересно)
Вообще я использую такую конструкцию для перехвата события нажатия клавиши
При нажатии на любую из кнопок панель, на которой эта кнопка была размещена, очищается и все элементы на ней создаются заново. Так вот проблема возникает если 2 раза быстро нажать Enter - на первой панели срабатывает кнопка "Показать" и сразу же на второй "добавить", чего естественно быть не должно. Как решить проблему пока не придумал иначе как при помощи таймера, который после первого нажатия на Enter 2 секунды просто не пускает новые нажатия, но колхозить не хочется. Может кто поможет советом?
0
|
97 / 97 / 25
Регистрация: 25.04.2016
Сообщений: 525
|
||||||
27.04.2016, 13:06 | 8 | |||||
Зачем вам вообще эта конструкция, я не могу понять?
Вам проще в самом обработчике события выцеплять нужную кнопку и с ней работать.
0
|
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
|
|
27.04.2016, 13:41 [ТС] | 9 |
На обеих панелях множество разных компонентов, среди них TTextEdit, TMaskEdit, TSpinEdit.... и TBitBtn.
Я привел обработку события OnKeyPress для любого из них т.е. можно изменить значение любого компонента, нажать Enter и сработает кнопка.
0
|
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
|
|
27.04.2016, 15:16 [ТС] | 11 |
Согласен, решение не шикарное. Думал насчет хуков на нажатие кнопок клавиатуры, но там все непросто, а хуки я пока не писал.
Может у Вас найдется идея получше?
0
|
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
|
|
27.04.2016, 15:43 [ТС] | 13 |
Эта часть задачи сводится к тому, чтобы обеспечить пользователю удобную работу с базой данных.
Работаю с настроенным под свои нужды компонентом TMS AdvDBFormPanel, который отрисовывает дочерние компоненты при открытии связанного с ним датасета. Таким образом на AdvDBFormPanel может быть произвольное кол-во элементов, среди которых могут быть и поля для редактирования, и кнопки. Компонентов на форме AdvDBFormPanel одновременно два, каждый имеет свой набор элементов, в одном из наборов есть кнопка "Показать", в другом "Добавить", в одном наборе этих кнопок быть не может. Соответственно задача сделать так чтобы по нажатию Enter в то время, как один из контролов любого компонента AdvDBFormPanel имеет фокус, срабатывала одна либо другая кнопка. Надеюсь на Вашу подсказку )
0
|
27.04.2016, 21:24 | 14 | |||||
1. определить, в какой из панелей находится компонент
панель - (Sender as TWinControl).Parent 2. сделать, чтобы панели имели собственный тег и проверять его
0
|
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
|
|
28.04.2016, 09:04 [ТС] | 15 |
Приблизительно так и сделал, но полдня раскопок показали, что проблема была не в этом.
На контролах всех типов, кроме одного, нажатие Enter отрабатывается как задумано. Ошибка возникает только при нажатии на ComboBox, который я использую для посимвольного поиска значений в базе. Почему-то при фокусе на нем первое нажатие Enter вызывает OnKeyDown, а второе нет, хотя контрол по-прежнему имеет фокус. Почему так - не пойму. Думаю или сделать обработку нажатия кнопок на уровне формы или сменить контрол, но оба варианта не слишком нравятся. Может у кого есть соображения?
0
|
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
|
||||||
28.04.2016, 09:44 [ТС] | 17 | |||||
К моему неудовольствию и страшному скрипу зубами ничего не получилось!
Делаю так
0
|
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
|
|
28.04.2016, 10:33 [ТС] | 19 |
Для верности) Если использовать Sender можно было бы работать с каждым контролом в отдельности, смысл в событии на целой форме пропадает.
Прихожу к выводу что придется отказаться от использования AdvComboBox для загрузки в него значений поиска, наверное придется изобрести свой велосипед или позаимствовать чужой. Только перед этим проверю событие OnKeyPress. Добавлено через 18 минут Товарищи, это п......ц! При втором нажатии Enter на ComboBox событие OnkeyPress не происходит даже на форме! Нажатая клавиша судя по всему уходит прямиком в адъ.
0
|
28.04.2016, 11:13 | 20 |
не понял
sender - это и есть контрол ActiveControl если по Enter контрол теряет фокус, то и никуда следующий Enter не приходит я бы вообще запоминал бы при создании панели ссылку на кнопку да и пользовался бы ей на здоровье
0
|
28.04.2016, 11:13 | |
28.04.2016, 11:13 | |
Помогаю со студенческими работами здесь
20
Повторяющаяся конструкция в регулярном выражении Как поведет себя конструкция Конструкция if, ни одно из условий не сработало Что делает и как работает конструкция while ... do? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |