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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2011, 20:43   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Дилемма с массивом

Код:
 Procedure SetApplicationReaction(MessageCode : LongWord; Proc : THandlerProcedure);                // Set up application reactions.
 Var
  Found : Boolean;
  Index : Integer;
  I     : Integer;
 Begin
  Found := FALSE;                                                                                   // Initialize flag.
  If Length(Application.Handler) > 0 Then                                                           // If we have more, than 0 records, then...
   For I := 0 To Length(Application.Handler) - 1 Do                                                 // ...cycle for the same message code searching.
    If Application.Handler[I].MessageCode = MessageCode Then                                        // If found the same code, then...
     Begin
      Found := TRUE;                                                                                // ...set flag and...
      Index := I;                                                                                   // ...memorize index.
     End;
  If Found Then                                                                                     // If found, then...
   Begin
    Application.Handler[Index].Proc := Proc;                                                        // ...replace procedure...
   End 
  Else                                                                                              // ...else...
   Begin
    Index := Length(Application.Handler);                                                           // Make new index. 
    SetLength(Application.Handler, Index + 1);                                                      // Set length of handler.
    Application.Handler[Index].MessageCode := MessageCode;                                          // Set up message code.
    Application.Handler[Index].Proc        := Proc;                                                 // Set up procedure.
   End;
 End;
Для того, чтобы сделать процедуру, удаляющую обработчик по некоторому коду есть два варианта:
1) Добавить свойство булевского типа, которое будет показывать, включена обработка по этому сообщению или нет.
2) Сделать функцию, содержащую nop, которой замещать соответствующую в массиве.

Даже не знаю, что будет грамотней.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 23.01.2011, 21:32   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

А самый очевидный вариант - удалить элемент из массива?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 23.01.2011, 21:36   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Да вот не поверите, только что подумал над этим, перед тем, как зайти на форум . Придется, наверное, так и поступить, смещая все элементы после него. Сложновато, но, думаю, будет более оптимально.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 23.01.2011, 22:06   #4
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Вот, кажись так.
Код:
 Procedure ClearApplicationReaction(MessageCode : LongWord); StdCall; Export;                       // Clear appliccation reaction.
 Var
  I : Integer;
  Index : Integer;
  Found : Boolean;
 Begin
  Found := FALSE;                                                                                   // Initialize flag
  If Length(Application.Handler) > 0 Then                                                           // If we have more, than 0 records, then... 
   For I := 0 to Length(Application.Handler) - 1 Do                                                 // ...cycle for the same message code searching.
    If Application.Handler[I].MessageCode = MessageCode Then                                        // If found the same code, then...
     Begin
      Found := TRUE;                                                                                // ...set flag and...
      Index := I;                                                                                   // ...memorize index.
     End;
  If Found Then                                                                                     // If found, then...
   Begin
    For I := Index To Length(Application.Handler) - 1 Do                                            // ...cycle for "right" elements.
     Begin
      If I = Length(Application.Handler) - 1 Then                                                   // If it is last element then...
       SetLength(Application.Handler, Length(Application.Handler - 1))                              // Delete unnecessary element.
      Else                                                                                          // Else...
       Begin
        Application.Handler[I] := Application.Handler[I + 1];                                       // Move element to the left.
       End;
     End;
   End;
 End;
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 23.01.2011, 22:19   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Если порядок не важен, то можно обменять с последним.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 23.01.2011, 22:30   #6
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Блин, точно, как то я не сообразил. Устал, наверное.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 23.01.2011, 22:38   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

и если не стоит задача найти именно последний обработчик, то break; перед end; смотрелся бы логично:

Код:
Begin
      Found := TRUE;
      Index := I;
      break;
End;
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 24.01.2011, 10:28   #8
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
то break; перед end; смотрелся бы логично:
Если бы вы внимательно посмотрели на функцию добавления, что я выложил выше, то увидели бы, что ячейка с каким-то MessageCode может быть только одна, остальные будут замещать её, если имеют тот же код.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 24.01.2011, 12:54   #9
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

угу, видимо поэтому надо всегда прогонять весь цикл, игнорируя тот факт, что искомое может быть найдено уже в первом элементе.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дилемма: С++ или С#? Жду советы профессионалов! RomT24 Свободное общение 36 18.04.2010 13:48
Подпрограмма с массивом NSvirus Паскаль, Turbo Pascal, PascalABC.NET 2 03.05.2009 17:38
Задача с массивом AleNa666 Паскаль, Turbo Pascal, PascalABC.NET 1 27.04.2009 21:06
Работа с массивом Horknee Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 14.04.2009 18:02