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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2009, 08:56   #1
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
Вопрос Как сделать обработчик более универсальным?

Есть в код такая проблема: на форме четыре Edit'а, и у каждого обработчик на ввод один и тот же:
Код:
{Далее идет блок обработчиков для полей ввода}                   {|}
procedure TMainForm.SDKeyPress(Sender: TObject; var Key: Char);  {|}
begin                                                            {|}
  case Key of                                                    {|}
    '0'..'9': ;                                                  {|}
    #8: ;                                                        {|}
    '.', ',':                                                    {|}
      if (Pos(DecimalSeparator, SD.Text) = 0) and                {|}
      (FU.Text <> '') then Key := DecimalSeparator               {|}
      else                                                       {|}
        Key := #0;                                               {|}
    else                                                         {|}
      Key := #0;                                                 {|}
  end;                                                           {|}
end;                                                             {|}
                                                                 {|}
procedure TMainForm.SUKeyPress(Sender: TObject; var Key: Char);  {|}
begin                                                            {|}
  case Key of                                                    {|}
    '0'..'9': ;                                                  {|}
    #8: ;                                                        {|}
    '.', ',':                                                    {|}
      if (Pos(DecimalSeparator, SU.Text) = 0) and                {|}
      (FU.Text <> '') then Key := DecimalSeparator               {|}
      else                                                       {|}
        Key := #0;                                               {|}
    else                                                         {|}
      Key := #0;                                                 {|}
  end;                                                           {|}
end;                                                             {|}
                                                                 {|}
procedure TMainForm.FDKeyPress(Sender: TObject; var Key: Char);  {|}
begin                                                            {|}
  case Key of                                                    {|}
    '0'..'9': ;                                                  {|}
    #8: ;                                                        {|}
    '.', ',':                                                    {|}
      if (Pos(DecimalSeparator, FD.Text) = 0) and                {|}
      (FU.Text <> '') then Key := DecimalSeparator               {|}
      else                                                       {|}
        Key := #0;                                               {|}
    else                                                         {|}
      Key := #0;                                                 {|}
  end;                                                           {|}
end;                                                             {|}
{|}                                                              {|}
                                                                 {|}
procedure TMainForm.FUKeyPress(Sender: TObject; var Key: Char);  {|}
begin                                                            {|}
  case Key of                                                    {|}
    '0'..'9': ;                                                  {|}
    #8: ;                                                        {|}
    '.', ',':                                                    {|}
      if (Pos(DecimalSeparator, FU.Text) = 0) and                {|}
      (FU.Text <> '') then Key := DecimalSeparator               {|}
      else                                                       {|}
        Key := #0;                                               {|}
    else                                                         {|}
      Key := #0;                                                 {|}
  end;                                                           {|}
end;                                                             {|}
{Конец блока}                                                    {|}
Отличие только в Pos(DecimalSeparator, FU.Text). Пытался свести в одну процедуру и написал Self.Text, но так не работает. Как быть?
k1r1ch вне форума Ответить с цитированием
Старый 11.10.2009, 09:12   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

в процедуру Вам передаётся Sender :TObject
Вы не догадываетесь, что это за зверь и для чего он нужен?
Поясняю, Sender - это тот объект, на котором произошло данное событие..

Поэтому делаем одну процедурку
(например, UniversalKeyPress1 )
там меняем
Pos(DecimalSeparator, FU.Text) на
Pos(DecimalSeparator, TEdit(Sender).Text)
и всем вашим edit'ам на событие OnKeyPress вешаем одну и ту же эту процедурку.
остальные процедуры можно удалить.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.10.2009, 09:29   #3
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
Радость

Огромное спасибо! Я пробовал Sender, но без TEdit(), как то об этом не подумал!
k1r1ch вне форума Ответить с цитированием
Старый 11.10.2009, 19:17   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Вообще рекомендуется использовать оператор as
Код:
Pos(DecimalSeparator, (Sender as TEdit).Text)
Тогда если Sender вдруг окажется не TEdit'ом, то будет сгенерировано исключение "EInvalidCast", а если использовать простое приведение типов - программа продолжит работу и где-нибудь в другом месте вылезет access violation либо вообще другое свойство класса будет прочитано как text
пыщь
JTG вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вам код, и есть ли более простые решения ? SuBwooFer PHP 1 10.09.2009 15:08
Универсальная программа, с универсальным описанием объектов. Strannik-BKS Свободное общение 38 25.04.2009 23:51
Как создать обработчик событий для динамически созданного объекта Лукманов Александр Общие вопросы Delphi 1 22.03.2009 22:05
Как сделать более точные координаты мышки xGroupers Общие вопросы Delphi 7 24.04.2008 23:02
Как и в какой момент написать обработчик события если БД не доступна Arteom БД в Delphi 8 04.10.2007 12:08