Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
1

Конструкция Delphi

27.04.2016, 11:59. Показов 2126. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!

Получилось так что когда начинал писать программы не было времени изучать теорию и писал довольно похожие программы, а сейчас сталкиваюсь с новыми понятиями и конструкциями.

Подскажите, что собой представляет конструкция типа TButton(Sender).[свойство] ?

Как этим пользоваться я понял, а как оно называется и искать по нему инфу не знаю.
Просьба гнилыми помидорами не бросать, то, что надо читать теорию знаю и сам.

Спасибо за понимание.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.04.2016, 11:59
Ответы с готовыми решениями:

Конструкция if else
begin if (CheckBox1.Checked=False) and (CheckBox2.Checked=False) ...

Конструкция if-else
Что нужно сделать: если текстовое_поле1 = '' то иначе . Помогите, вот я написал:if Edit1.Text =...

Конструкция On E:Exception Do
Добрый день! Подскажите пожалуйста, в чем смысл конструкции On E:Exception Do? Что такое E?...

Конструкция печати
Здравствуйте. Есть файл с расширением pas, содержащий вот такой код: procedure...

24
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,424
27.04.2016, 12:01 2
Цитата Сообщение от Zvor Посмотреть сообщение
Подскажите, что собой представляет конструкция типа TButton(Sender).[свойство] ?
Сначала приведение переменной, содержащей экземпляр класса (Sender) к нужному типу (TButton), потом вызов свойства класса TButton.
0
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
27.04.2016, 12:05  [ТС] 3
Цитата Сообщение от quwy Посмотреть сообщение
Сначала приведение переменной, содержащей экземпляр класса (Sender) к нужному типу (TButton), потом вызов свойства класса TButton.
Т.е. я могу вызывать методы нужного типа даже если Sender будет разных типов? К примеру Sender может быть в разных случаях TButton, TBitBtn или TTextEdit.
0
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,424
27.04.2016, 12:24 4
Лучший ответ Сообщение было отмечено Zvor как решение

Решение

Цитата Сообщение от Zvor Посмотреть сообщение
Т.е. я могу вызывать методы нужного типа даже если Sender будет разных типов?
Нет. В ООП-языках реализована совместимость типов от наследника к родителю. Т.е. переменная типа 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
Delphi
1
2
3
4
5
6
  if (Sender is TButton) then
    with (Sender as TButton) do
      begin
        Caption:='Test';
        Tag:=100;
      end;
0
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
27.04.2016, 12:44  [ТС] 7
О, это интересно)
Вообще я использую такую конструкцию для перехвата события нажатия клавиши
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TMainForm.EditKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var i : integer;
    Control : TWinControl;
    Button : TBitBtn;
 
begin
Control := TCustomControl(Sender).Parent;
 
 if Key = VK_RETURN then
  for i := 0 to Control.ControlCount - 1 do
    if Control.Controls[i].ClassType = TBitBtn then
    begin
     Button := (Control.Controls[i] as TBitBtn);
      if (Button.Caption = 'Добавить')
        or (Button.Caption = 'Показать')
      then Button.OnClick(Button);
end;
Правда есть сложность - на форме 2 одинаковые панели, элементы на них создаются динамически и кнопки "Добавить" и "Показать" и чаще всего на одной панели "Добавить", а на другой "Показать".
При нажатии на любую из кнопок панель, на которой эта кнопка была размещена, очищается и все элементы на ней создаются заново.

Так вот проблема возникает если 2 раза быстро нажать Enter - на первой панели срабатывает кнопка "Показать" и сразу же на второй "добавить", чего естественно быть не должно.

Как решить проблему пока не придумал иначе как при помощи таймера, который после первого нажатия на Enter 2 секунды просто не пускает новые нажатия, но колхозить не хочется.

Может кто поможет советом?
0
97 / 97 / 25
Регистрация: 25.04.2016
Сообщений: 525
27.04.2016, 13:06 8
Зачем вам вообще эта конструкция, я не могу понять?
Вам проще в самом обработчике события выцеплять нужную кнопку и с ней работать.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.MyButtonClick(Sender: TObject);
begin
  with (Sender as TBitBtn) do
    begin
      case Tag of
        1: ShowMessage('Нажали кнопку "Создать"');
        2: ShowMessage('Нажали кнопку "Показать"');
      end;
    end;
end;
 
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  BitBtn1.Tag:=1;
  BitBtn2.Tag:=2;
  BitBtn1.OnClick:=MyButtonClick;
  BitBtn2.OnClick:=MyButtonClick;
end;
0
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
27.04.2016, 13:41  [ТС] 9
Цитата Сообщение от MyEternity Посмотреть сообщение
Зачем вам вообще эта конструкция, я не могу понять?
На обеих панелях множество разных компонентов, среди них TTextEdit, TMaskEdit, TSpinEdit.... и TBitBtn.
Я привел обработку события OnKeyPress для любого из них т.е. можно изменить значение любого компонента, нажать Enter и сработает кнопка.
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
27.04.2016, 15:13 10
проблема именно в подходе
чувствуете, решение получается неэлегантным?
значит, архитектура проблемная
0
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
27.04.2016, 15:16  [ТС] 11
Цитата Сообщение от krapotkin Посмотреть сообщение
проблема именно в подходе
чувствуете, решение получается неэлегантным?
значит, архитектура проблемная
Согласен, решение не шикарное. Думал насчет хуков на нажатие кнопок клавиатуры, но там все непросто, а хуки я пока не писал.
Может у Вас найдется идея получше?
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
27.04.2016, 15:24 12
до этого всегда находились )
нужно описать исходную задачу
0
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
27.04.2016, 15:43  [ТС] 13
Цитата Сообщение от krapotkin Посмотреть сообщение
нужно описать исходную задачу
Эта часть задачи сводится к тому, чтобы обеспечить пользователю удобную работу с базой данных.
Работаю с настроенным под свои нужды компонентом TMS AdvDBFormPanel, который отрисовывает дочерние компоненты при открытии связанного с ним датасета.
Таким образом на AdvDBFormPanel может быть произвольное кол-во элементов, среди которых могут быть и поля для редактирования, и кнопки.
Компонентов на форме AdvDBFormPanel одновременно два, каждый имеет свой набор элементов, в одном из наборов есть кнопка "Показать", в другом "Добавить", в одном наборе этих кнопок быть не может.

Соответственно задача сделать так чтобы по нажатию Enter в то время, как один из контролов любого компонента AdvDBFormPanel имеет фокус, срабатывала одна либо другая кнопка.
Надеюсь на Вашу подсказку )
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
27.04.2016, 21:24 14
1. определить, в какой из панелей находится компонент
панель - (Sender as TWinControl).Parent
2. сделать, чтобы панели имели собственный тег и проверять его
Delphi
1
2
3
4
5
6
7
8
if ((sender as TWinControl).parent as TAdvDBPanel.Tag)=1 then
begin
  DoShow();
end
else
begin
  DoAppend();
end;
0
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
28.04.2016, 09:04  [ТС] 15
Цитата Сообщение от krapotkin Посмотреть сообщение
2. сделать, чтобы панели имели собственный тег и проверять его
Приблизительно так и сделал, но полдня раскопок показали, что проблема была не в этом.
На контролах всех типов, кроме одного, нажатие Enter отрабатывается как задумано.
Ошибка возникает только при нажатии на ComboBox, который я использую для посимвольного поиска значений в базе. Почему-то при фокусе на нем первое нажатие Enter вызывает OnKeyDown, а второе нет, хотя контрол по-прежнему имеет фокус.
Почему так - не пойму. Думаю или сделать обработку нажатия кнопок на уровне формы или сменить контрол, но оба варианта не слишком нравятся. Может у кого есть соображения?
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
28.04.2016, 09:39 16
думаю, форма была бы вполне адекватна (KeyPreview = true)
проверка, в какой панели компонент, абсолютно идентична
0
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
28.04.2016, 09:44  [ТС] 17
К моему неудовольствию и страшному скрипу зубами ничего не получилось!
Делаю так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var i : integer;
    ParentControl : TWinControl;
    Button : TBitBtn;
begin
 ParentControl := Screen.ActiveControl.Parent;
 {
 if (Sender is TAdvComboBox) then
 if (Sender as TAdvComboBox).Style <> csOwnerDrawFixed
 then LookupComboBoxChange(Sender);   }
 
 if (Key = VK_RETURN) and (ParentControl is TAdvDBFormPanel) then
  for i := 0 to ParentControl.ControlCount - 1 do
    if ParentControl.Controls[i].ClassType = TBitBtn then
    begin
     Button := (ParentControl.Controls[i] as TBitBtn);
      if (Button.Caption = 'Показать')
        or (Button.Caption = 'Добавить')
      then
      begin
        Button.OnClick(Button);
        Break;
      end;
    end;
end;
Все равно по второму нажатию Enter срабатывает другая кнопка. Еще раз проверю код.
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
28.04.2016, 10:06 18
а что так сложно?
почему Sender не использовать ?
0
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 14
28.04.2016, 10:33  [ТС] 19
Цитата Сообщение от krapotkin Посмотреть сообщение
почему Sender не использовать ?
Для верности) Если использовать Sender можно было бы работать с каждым контролом в отдельности, смысл в событии на целой форме пропадает.
Прихожу к выводу что придется отказаться от использования AdvComboBox для загрузки в него значений поиска, наверное придется изобрести свой велосипед или позаимствовать чужой. Только перед этим проверю событие OnKeyPress.

Добавлено через 18 минут
Товарищи, это п......ц! При втором нажатии Enter на ComboBox событие OnkeyPress не происходит даже на форме!
Нажатая клавиша судя по всему уходит прямиком в адъ.
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
28.04.2016, 11:13 20
не понял
sender - это и есть контрол ActiveControl

если по Enter контрол теряет фокус, то и никуда следующий Enter не приходит

я бы вообще запоминал бы при создании панели ссылку на кнопку да и пользовался бы ей на здоровье
0
28.04.2016, 11:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2016, 11:13
Помогаю со студенческими работами здесь

Повторяющаяся конструкция в регулярном выражении
Всем привет. Нужно из текста выдернуть строку, которая начинается с ключевого слова ( на пример,...

Как поведет себя конструкция
допустим есть такой код b:=0; a:=1; if a&gt;0 then begin repeat b:=a+b until...

Конструкция if, ни одно из условий не сработало
Привет, всем! if условие then showmessage('текст сообщения 1'); if условие then...

Что делает и как работает конструкция while ... do?
Пожалуйста, простыми понятиями что делает и как работает конструкция while ... do


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru