Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2016, 21:23   #1
dimkoss
Пользователь
 
Регистрация: 06.02.2016
Сообщений: 35
По умолчанию Case Не работает с Sender

На кнопке события операции калькулятора такой код:
Код:
case (Sender as TButton).Caption of
  '+' : op := '+';
  '-' : op := '-';
  '*' : op := '*';
  '/' : op := '/';
  end;
Выдает ошибку типа.
Подскажите, чем его можно заменить?

Последний раз редактировалось Вадим Мошев; 15.02.2016 в 22:42.
dimkoss вне форума Ответить с цитированием
Старый 15.02.2016, 21:41   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

if..then else
или переходить на Лазарус

Цитата:
Сообщение от northener Посмотреть сообщение
if..then else
или переходить на Лазарус
Проблема не в Sehder, а в Caption. Не работает в Дельфи case со строками

Последний раз редактировалось Аватар; 15.02.2016 в 22:03.
northener вне форума Ответить с цитированием
Старый 15.02.2016, 21:42   #3
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

Чем tag не угодил?
Iron Monk вне форума Ответить с цитированием
Старый 15.02.2016, 21:53   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
case (Sender as TButton).Caption[1] of
Но это если уверен 100%, что в Caption есть как минимум 1 символ. А вообще лучше не надо, tag не зря предлагают
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.02.2016, 22:49   #5
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Сообщение от dimkoss Посмотреть сообщение
На кнопке события операции калькулятора такой код:
Код:
case (Sender as TButton).Caption of
  '+' : op := '+';
  '-' : op := '-';
  '*' : op := '*';
  '/' : op := '/';
  end;
Выдает ошибку типа.
Подскажите, чем его можно заменить?
Этот код можно записать короче:
Код:
if (sender is TButton) then begin
	op:=(Sender as TButton).Caption[1];
end;
(хотя, если это написано в обработчике нажатия кнопки, то проверку if (sender is TButton) делать ИМХО не надо)

Или ещё короче:
Код:
op:=(Sender as TButton).Caption[1];
Только надо добиться того, чтобы Caption содержало ровно один символ, и он был знАком одной из рассматриваемых арифметических операций.

Конечно, как написать этот участок кода, зависит от того, как написана программа.

Если критично содержание caption, то можно поставить такую проверку
Код:
st:=(Sender as TButton).Caption[1]; // Надеюсь, что у нас не будет кнопок без caption (пустым caption)
if pos(st, '+-*/') > 0 then begin // это удобнее записывать, чем множество
	op:=st;
end else begin
	// значит, нажали что-то другое
end;

Последний раз редактировалось Вадим Мошев; 15.02.2016 в 23:02.
Вадим Мошев вне форума Ответить с цитированием
Старый 15.02.2016, 23:22   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Сообщение от dimkoss Посмотреть сообщение
На кнопке события операции калькулятора такой код:
Код:
case (Sender as TButton).Caption of
  '+' : op := '+';
  '-' : op := '-';
  '*' : op := '*';
  '/' : op := '/';
  end;
Я согласен с выше сказанным. Просто хотел заметить:
Кнопки калькулятора выполняют вообще-то разные операции, потому должны иметь разные обработчики. Было бы смешно, если бы кнопки диалогового окна имели один обработчик типа:
Код:
if (Sender as TButton).Caption = 'Yes' then RES := mrYes
else
  if (Sender as TButton).Caption = 'No' then RES := mrNo;


dimkoss, почему не
Код:
procedure TForm1.btnAdditionClick(Sender: TObject);
begin
  op := '+';
end;

procedure TForm1.btnSubtractionClick(Sender: TObject);
begin
  op := '-';
end;

procedure TForm1.btnMultiplicationClick(Sender: TObject);
begin
  op := '*';
end;

procedure TForm1.btnDivisionClick(Sender: TObject);
begin
  op := '/';
end;
?

Последний раз редактировалось Sibedir; 16.02.2016 в 00:09.
Sibedir вне форума Ответить с цитированием
Старый 15.02.2016, 23:55   #7
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
(хотя, если это написано в обработчике нажатия кнопки, то проверку if (sender is TButton) делать ИМХО не надо)

Или ещё короче:
Код:

op:=(Sender as TButton).Caption[1];
тогда и as не надо, лишнее, просто приведение делать
come-on вне форума Ответить с цитированием
Старый 16.02.2016, 00:16   #8
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
тогда и as не надо, лишнее, просто приведение делать
+1
<OFFTOP>
Но более всего меня забавляет/удивляет/раздражает код типа
Код:
if Someting is TSomeComponent then (Something as TSomeComponent).SomeMethod;
Ну почему отмерка выполняется всего два раза, а не положенные семь?
</OFFTOP>

Последний раз редактировалось northener; 16.02.2016 в 01:09.
northener вне форума Ответить с цитированием
Старый 16.02.2016, 00:27   #9
darkwellroad
Пользователь
 
Регистрация: 01.09.2013
Сообщений: 83
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
+1
<OFFTOP>
Но более всего меня забавляет/удивляет/раздражает код типа
Код:
if Someting is TSomeComponent then (Something as TSomeComponent).SomeMethod;
Ну почему отмерка выполняется всего два раза, а не положенные семь?

</OFFTOP>
Улыбнуло) Сорри за оффтоп..
darkwellroad вне форума Ответить с цитированием
Старый 16.02.2016, 10:53   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Но более всего меня забавляет/удивляет/раздражает код типа
Код:
if Someting is TSomeComponent then (Something as TSomeComponent).SomeMethod;
простите, коллега, а что Вас смущает?
То, что проверяется тип компонента или то, что после проверки выполняется приведение типа?
вы намекаете, что должно быть так?
Код:
if Someting is TSomeComponent then TSomeComponent(Something).SomeMethod;
а есть принципиальная разница?
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемещение из case 1 в case 2(switch(), язык Си) Павел_95 Помощь студентам 13 11.01.2013 14:18
с++.switch-case счетчик. не работает программа. Leeto Помощь студентам 0 22.12.2011 13:17
Не работает CASE для NULL в выборке из view (скриншот внутри Ivan_32 SQL, базы данных 2 12.04.2011 22:16
sender as.. nark03 Помощь студентам 2 18.01.2009 16:13
Конструкция case of работает некорректно! Как исправить? SkAndrew Общие вопросы Delphi 6 06.04.2008 00:21